@inkandswitch/patchwork-pkg-base 0.0.49 → 0.0.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js", "../node_modules/.pnpm/debug@4.4.3_supports-color@7.2.0/node_modules/debug/src/common.js", "../node_modules/.pnpm/debug@4.4.3_supports-color@7.2.0/node_modules/debug/src/browser.js", "../node_modules/.pnpm/ws@8.21.2/node_modules/ws/browser.js", "../src/tool.tsx", "../node_modules/.pnpm/@automerge+react@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1__react@18.3.1_supports-color@7.2.0/node_modules/@automerge/react/src/index.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo-react-hooks/src/wrapPromise.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo-react-hooks/src/useRepo.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/regex.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/validate.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/parse.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/utils.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/_md.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha2.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha256.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/base-x@5.0.1/node_modules/base-x/src/esm/index.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/bs58@6.0.0/node_modules/bs58/src/esm/index.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/bs58check@4.0.0/node_modules/bs58check/src/esm/base.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/bs58check@4.0.0/node_modules/bs58check/src/esm/index.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo/dist/helpers/bufferFromHex.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo/dist/subdoc-handles/types.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo/dist/subdoc-handles/parser.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/common.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/browser.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo/dist/Logger.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo/dist/AutomergeUrl.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo-react-hooks/src/useDocHandle.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo-react-hooks/src/useDocument.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo-react-hooks/src/helpers/useSet.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo-react-hooks/src/useDocHandles.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo-react-hooks/src/useDocuments.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo-react-hooks/src/useStateRef.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/eventemitter3@5.0.4/node_modules/eventemitter3/index.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/node_modules/.pnpm/eventemitter3@5.0.4/node_modules/eventemitter3/index.mjs", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo-react-hooks/src/useRemoteAwareness.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo-react-hooks/src/useLocalAwareness.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1_6df4f690027be2800278543489b1f96f/node_modules/@automerge/automerge-repo-react-hooks/src/usePresence.ts", "../node_modules/.pnpm/@automerge+automerge-repo-network-broadcastchannel@2.6.0-subduction.47_supports-color@7.2.0/node_modules/@automerge/automerge-repo-network-broadcastchannel/src/index.ts", "../node_modules/.pnpm/@automerge+react@2.6.0-subduction.47_react-dom@18.3.1_react@18.3.1__react@18.3.1_supports-color@7.2.0/node_modules/@automerge/react/src/default-exports.ts", "../node_modules/.pnpm/@automerge+automerge-repo-network-websocket@2.6.0-subduction.47_supports-color@7.2.0/node_modules/@automerge/automerge-repo-network-websocket/src/WebSocketClientAdapter.ts", "../node_modules/.pnpm/@automerge+automerge-repo-network-websocket@2.6.0-subduction.47_supports-color@7.2.0/node_modules/@automerge/automerge-repo-network-websocket/src/messages.ts", "../node_modules/.pnpm/@automerge+automerge-repo-network-websocket@2.6.0-subduction.47_supports-color@7.2.0/node_modules/@automerge/automerge-repo-network-websocket/src/protocolVersion.ts", "../node_modules/.pnpm/@automerge+automerge-repo-network-websocket@2.6.0-subduction.47_supports-color@7.2.0/node_modules/@automerge/automerge-repo-network-websocket/src/assert.ts", "../node_modules/.pnpm/@automerge+automerge-repo-network-websocket@2.6.0-subduction.47_supports-color@7.2.0/node_modules/@automerge/automerge-repo-network-websocket/src/toArrayBuffer.ts", "../node_modules/.pnpm/@automerge+automerge-repo-network-websocket@2.6.0-subduction.47_supports-color@7.2.0/node_modules/@automerge/automerge-repo-network-websocket/src/WebSocketWorkerClientAdapter.ts", "../node_modules/.pnpm/@automerge+automerge-repo-network-websocket@2.6.0-subduction.47_supports-color@7.2.0/node_modules/@automerge/automerge-repo-network-websocket/src/WebSocketServerAdapter.ts", "../src/lith/useAutomergeStore.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo-react-hooks/src/wrapPromise.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo-react-hooks/src/useRepo.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/regex.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/validate.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/parse.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/utils.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/_md.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha2.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha256.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/base-x@5.0.1/node_modules/base-x/src/esm/index.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/bs58@6.0.0/node_modules/bs58/src/esm/index.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/bs58check@4.0.0/node_modules/bs58check/src/esm/base.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/bs58check@4.0.0/node_modules/bs58check/src/esm/index.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo/dist/helpers/bufferFromHex.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo/dist/subdoc-handles/types.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo/dist/subdoc-handles/parser.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/common.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/browser.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo/dist/Logger.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo/dist/AutomergeUrl.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo-react-hooks/src/useDocHandle.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo-react-hooks/src/useDocument.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo-react-hooks/src/helpers/useSet.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo-react-hooks/src/useDocHandles.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo-react-hooks/src/useDocuments.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo-react-hooks/src/useStateRef.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/eventemitter3@5.0.4/node_modules/eventemitter3/index.js", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/node_modules/.pnpm/eventemitter3@5.0.4/node_modules/eventemitter3/index.mjs", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo-react-hooks/src/useRemoteAwareness.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo-react-hooks/src/useLocalAwareness.ts", "../node_modules/.pnpm/@automerge+automerge-repo-react-hooks@2.6.0-subduction.46_react-dom@18.3.1_react@18.3.1_4b92195feb6ea50576810c4c883087b2/node_modules/@automerge/automerge-repo-react-hooks/src/usePresence.ts", "../src/lith/AutomergeToTLStore.ts", "../node_modules/.pnpm/@inkandswitch+patchwork-providers-react@0.2.2_@automerge+automerge-repo-react-hooks@2.6_32e4c1e833a92909acdf5d161f8ba4d2/node_modules/@inkandswitch/patchwork-providers-react/dist/index.js", "../node_modules/.pnpm/@inkandswitch+patchwork-providers@0.2.2_@automerge+automerge-repo@2.6.0-subduction.46_supports-color@7.2.0_/node_modules/@inkandswitch/patchwork-providers/dist/index.js", "../src/diff.ts", "../src/DiffShapeWrapper.tsx", "../src/PatchworkDocShape.tsx", "../src/NewDocTool.tsx", "../src/dnd.ts", "../src/migrate.tsx", "../src/color-scheme.ts", "../src/file-io.tsx"],
4
- "sourcesContent": ["/**\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", "'use strict';\n\nmodule.exports = function () {\n throw new Error(\n 'ws does not work in the browser. Browser clients must use the native ' +\n 'WebSocket object'\n );\n};\n", "import type { AutomergeUrl, DocHandle } from \"@automerge/automerge-repo/slim\";\nimport { decodeHeads, type UrlHeads } from \"@automerge/automerge-repo/slim\";\nimport {\n RepoContext,\n useDocHandle,\n useDocument,\n useRepo,\n type Repo,\n} from \"@automerge/react\";\nimport {\n Tldraw,\n useEditor,\n getAssetInfo,\n atom,\n type VecLike,\n type TLContent,\n type TLAssetId,\n type TLComponents,\n type TLRecord,\n type TLShapeId,\n type TLStoreWithStatus,\n type Editor,\n type TldrawProps,\n type TLAnyShapeUtilConstructor,\n type TLAnyBindingUtilConstructor,\n defaultShapeUtils,\n defaultBindingUtils,\n defaultAssetUtils,\n defaultOverlayUtils,\n defaultTools,\n} from \"@tldraw/tldraw\";\nimport {\n useAutomergeStore,\n useAutomergePresence,\n} from \"./lith/useAutomergeStore.ts\";\nimport type { TLDrawDoc } from \"./datatype.ts\";\nimport type { DocLink } from \"@inkandswitch/patchwork-filesystem\";\nimport type { TldrawConfig } from \"./script.ts\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { UnixFileEntry } from \"@inkandswitch/patchwork-filesystem\";\nimport { automergeUrlToServiceWorkerUrl } from \"@inkandswitch/patchwork-filesystem\";\nimport { useSubscribe } from \"@inkandswitch/patchwork-providers-react\";\nimport { createRoot } from \"react-dom/client\";\nimport { diffStore, type ShapeDiff } from \"./diff.ts\";\nimport {\n DiffShapeWrapper,\n DiffStatusContext,\n type DiffStatus,\n type DiffStatusAtom,\n} from \"./DiffShapeWrapper.tsx\";\nimport {\n PatchworkDocShapeUtil,\n PATCHWORK_DOC_SHAPE_TYPE,\n getDefaultToolId,\n makeShapeId,\n} from \"./PatchworkDocShape.tsx\";\nimport {\n NewDocShapeTool,\n NewDocToolbar,\n newDocUiOverrides,\n setNewDocToolContext,\n} from \"./NewDocTool.tsx\";\nimport { isPatchworkDrag, parseDroppedDocs } from \"./dnd.ts\";\nimport { MigratePrompt, TLDRAW4_TYPE, getDocType } from \"./migrate.tsx\";\nimport { useColorScheme } from \"./color-scheme.ts\";\nimport {\n TldrFileContext,\n TldrFileMainMenu,\n importArchiveFile,\n isTldrArchiveFile,\n} from \"./file-io.tsx\";\n\n// Custom shapes / tools that let a tldraw canvas embed other Patchwork\n// documents. These must be registered both on the Automerge-backed store (so\n// the shape type persists) and on the <Tldraw> component (so it renders).\nconst customShapeUtils = [PatchworkDocShapeUtil];\nconst customTools = [NewDocShapeTool];\n\n// Diff baseline (fork-point heads) served by the draft overlay\n// (`draft:baseline`). `heads` is `null` when there is no baseline and no\n// diff is rendered (e.g. on \"main\"). It is `null` rather than optional so the\n// value is a valid structured-cloneable `JSONValue` crossing the provider\n// channel.\ntype Baseline = { heads: UrlHeads | null };\n\nconst MIME_TO_EXT: Record<string, string> = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpg\",\n \"image/gif\": \"gif\",\n \"image/webp\": \"webp\",\n \"image/svg+xml\": \"svg\",\n \"image/bmp\": \"bmp\",\n \"image/tiff\": \"tiff\",\n \"image/avif\": \"avif\",\n \"video/mp4\": \"mp4\",\n \"video/webm\": \"webm\",\n \"video/quicktime\": \"mov\",\n};\n\nfunction extensionForMimeType(mimeType: string): string {\n return MIME_TO_EXT[mimeType] || mimeType.split(\"/\")[1] || \"bin\";\n}\n\ninterface ContactDoc {\n type: string;\n name?: string;\n color?: string;\n}\n\nfunction useContactInfo() {\n const repo = useRepo();\n const [contactUrl, setContactUrl] = useState<AutomergeUrl | undefined>();\n\n useEffect(() => {\n const accountDocHandle = (window as any).accountDocHandle as\n | DocHandle<{ contactUrl: AutomergeUrl }>\n | undefined;\n if (!accountDocHandle) return;\n const doc = accountDocHandle.doc();\n if (doc?.contactUrl) {\n setContactUrl(doc.contactUrl);\n }\n }, []);\n\n const [contactDoc] = useDocument<ContactDoc>(contactUrl);\n\n return {\n // Compose userId as `${contactUrl}-${repo.peerId}` to uniquely identify a session;\n // this prevents tldraw from hiding local cursors across multiple sessions under the same account.\n userId: contactUrl ? `${contactUrl}-${repo.peerId}` : repo.peerId,\n name: contactDoc?.name ?? \"Anonymous\",\n color: contactDoc?.color,\n };\n}\n\n// Parses a userId of the form `${contactUrl}-${peerId}` to recover contactUrl and actorId.\nexport function splitPresenceUserId(userId: string): {\n contactUrl?: AutomergeUrl;\n actorId?: string;\n} {\n if (!userId.startsWith(\"automerge:\")) return { actorId: userId };\n const i = userId.indexOf(\"-\");\n if (i === -1) return { contactUrl: userId as AutomergeUrl };\n return {\n contactUrl: userId.slice(0, i) as AutomergeUrl,\n actorId: userId.slice(i + 1),\n };\n}\n\n// A tldraw4 document has to be migrated before the canvas mounts: a v5 store\n// migrates the snapshot as it loads it, and the store->Automerge sync would\n// then persist that silently. So the type is checked first, and an unmigrated\n// document gets the prompt instead of an editor.\nexport function TldrawTool({\n docUrl,\n element,\n}: {\n docUrl: AutomergeUrl;\n element: HTMLElement;\n}) {\n const handle = useDocHandle<TLDrawDoc>(docUrl, { suspense: true });\n const readOnly = handle.isReadOnly();\n // Suspending: without it the doc is undefined on the first render, the type\n // check wouldn't match, and the canvas would mount on a tldraw4 document and\n // migrate it before this ever ran. Still reactive, so the prompt gives way to\n // the canvas as soon as a migration retypes the document.\n const [doc] = useDocument<TLDrawDoc>(docUrl, { suspense: true });\n\n if (doc && getDocType(doc) === TLDRAW4_TYPE) {\n return <MigratePrompt handle={handle} readOnly={readOnly} />;\n }\n\n return <TldrawCanvas docUrl={docUrl} element={element} />;\n}\n\n// `config.js` builds the shape utils, tools, overlays and components the canvas\n// is made of, so it has to run before anything mounts \u2014 including the Automerge\n// store, which needs the same shape utils to validate records of a script's\n// custom types. Nothing renders until it has.\nfunction TldrawCanvas({\n docUrl,\n element,\n}: {\n docUrl: AutomergeUrl;\n element: HTMLElement;\n}) {\n const repo = useRepo();\n // Suspending: a doc that's undefined on the first render would settle the\n // config as the base one \u2014 without the script's shape utils \u2014 and the store,\n // created once, would then fail to validate the script's own shape types.\n const [doc] = useDocument<TLDrawDoc>(docUrl, { suspense: true });\n const config = useScriptConfig(repo, doc?.docs);\n\n if (!config) return null;\n\n // The editor is built from the config, so a rebuilt config only takes effect\n // on a fresh editor: the version is the key that remounts it.\n return (\n <TldrawConfiguredCanvas\n key={config.version}\n docUrl={docUrl}\n element={element}\n config={config.config}\n />\n );\n}\n\nfunction baseConfig(): TldrawConfig {\n return {\n shapeUtils: [...defaultShapeUtils, ...customShapeUtils],\n bindingUtils: [...defaultBindingUtils],\n assetUtils: [...defaultAssetUtils],\n overlayUtils: [...defaultOverlayUtils],\n tools: [...defaultTools, ...customTools],\n components: {\n ShapeWrapper: DiffShapeWrapper,\n Toolbar: NewDocToolbar,\n MainMenu: TldrFileMainMenu,\n },\n options: {},\n };\n}\n\n// Re-runs `config.js` whenever the files it imports are edited, and bumps the\n// version so the canvas remounts onto the new config.\nfunction useScriptConfig(repo: Repo, docs: DocLink[] | undefined) {\n const [config, setConfig] = useState<{\n config: TldrawConfig;\n version: number;\n } | null>(null);\n // The doc object is new on every change, so key the effect on the links \u2014\n // otherwise every canvas edit would tear the watcher down and rebuild it.\n const key = docs?.length ? JSON.stringify(docs) : \"\";\n\n useEffect(() => {\n if (!key) {\n setConfig({ config: baseConfig(), version: 0 });\n return;\n }\n\n let cancelled = false;\n let unwatch: (() => void) | undefined;\n let current: {\n deps: string[];\n signature: string;\n dispose: () => void;\n } | null = null;\n const settle = (config: TldrawConfig) =>\n setConfig((previous) => ({\n config,\n version: (previous?.version ?? 0) + 1,\n }));\n\n void (async () => {\n const { watchScriptTree, runConfigScript, signatureOf } = await import(\n \"./script.ts\"\n );\n if (cancelled) return;\n\n let queue: Promise<void> = Promise.resolve();\n unwatch = watchScriptTree(repo, JSON.parse(key), (tree) => {\n queue = queue.then(async () => {\n if (cancelled) return;\n // Only the files `config.js` imports matter: editing `main.js` mustn't\n // remount the editor out from under it.\n if (\n current &&\n signatureOf(current.deps, tree.versions) === current.signature\n ) {\n return;\n }\n try {\n const result = await runConfigScript(repo, tree.files, baseConfig());\n if (cancelled) {\n result.dispose();\n return;\n }\n current?.dispose();\n current = {\n deps: result.deps,\n signature: signatureOf(result.deps, tree.versions),\n dispose: result.dispose,\n };\n settle(result.config);\n } catch (error) {\n console.error(\"[tldraw5] config script failed\", error);\n if (cancelled || current) return;\n current = { deps: [], signature: \"\", dispose: () => {} };\n settle(baseConfig());\n }\n });\n });\n })();\n\n return () => {\n cancelled = true;\n unwatch?.();\n current?.dispose();\n };\n }, [repo, key]);\n\n return config;\n}\n\nfunction TldrawConfiguredCanvas({\n docUrl,\n element,\n config,\n}: {\n docUrl: AutomergeUrl;\n element: HTMLElement;\n config: TldrawConfig;\n}) {\n const handle = useDocHandle<TLDrawDoc>(docUrl, { suspense: true });\n // A history-pinned handle (url carries heads) is at fixed heads and rejects\n // writes, so the whole tool renders read-only.\n const readOnly = handle.isReadOnly();\n const contactInfo = useContactInfo();\n const colorScheme = useColorScheme(element);\n const store = useAutomergeStore({\n handle,\n userId: contactInfo.userId,\n readOnly,\n shapeUtils: config.shapeUtils as TLAnyShapeUtilConstructor[],\n bindingUtils: config.bindingUtils as TLAnyBindingUtilConstructor[],\n });\n\n useAutomergePresence({\n handle: handle as DocHandle<any>,\n store,\n userMetadata: contactInfo,\n element,\n });\n\n const baseline = useSubscribe<Baseline>(\n element,\n { type: \"draft:baseline\", url: docUrl },\n { heads: null }\n );\n const diff = useShapeDiff(handle, baseline.heads ?? undefined);\n\n // Per-tool atom feeding `DiffShapeWrapper` (read via `useValue`). Created once\n // per mount so multiple tldraw tools don't share styling state.\n const [statusAtom] = useState<DiffStatusAtom>(() =>\n atom(\"diff status\", new Map<TLShapeId, DiffStatus>())\n );\n useEffect(() => {\n statusAtom.set(buildStatusMap(diff));\n }, [diff, statusAtom]);\n\n // Deleted shapes are gone from the live store, so re-insert them as locked\n // ghosts (styled `tl-diff-deleted`). They never reach Automerge \u2014 see\n // `useDeletedGhosts`.\n useDeletedGhosts(store, handle, diff);\n\n const components = config.components as TLComponents;\n\n const fileContext = useMemo(() => ({ handle, element }), [handle, element]);\n\n return (\n <DiffStatusContext.Provider value={statusAtom}>\n <TldrFileContext.Provider value={fileContext}>\n <Tldraw\n colorScheme={colorScheme}\n autoFocus\n store={store}\n shapeUtils={config.shapeUtils as TLAnyShapeUtilConstructor[]}\n bindingUtils={config.bindingUtils as TLAnyBindingUtilConstructor[]}\n assetUtils={config.assetUtils as TldrawProps[\"assetUtils\"]}\n overlayUtils={config.overlayUtils as TldrawProps[\"overlayUtils\"]}\n tools={config.tools as TldrawProps[\"tools\"]}\n options={config.options as TldrawProps[\"options\"]}\n overrides={newDocUiOverrides}\n components={components}\n >\n <TldrawInner docUrl={docUrl} element={element} readOnly={readOnly} />\n </Tldraw>\n </TldrFileContext.Provider>\n </DiffStatusContext.Provider>\n );\n}\n\n// Recomputes the diff against `heads` on every doc change. `baseline.heads`\n// only moves when the draft is forked (copy-on-write), so without listening to\n// the handle the diff would freeze after the first computation. The bump is\n// deferred to a microtask so we never recompute synchronously from inside the\n// sync layer's own `handle.change` callback.\nfunction useShapeDiff(\n handle: DocHandle<TLDrawDoc>,\n heads: UrlHeads | undefined\n): ShapeDiff | null {\n const [tick, setTick] = useState(0);\n\n useEffect(() => {\n let scheduled = false;\n const onChange = () => {\n if (scheduled) return;\n scheduled = true;\n queueMicrotask(() => {\n scheduled = false;\n setTick((t) => t + 1);\n });\n };\n handle.on(\"change\", onChange);\n return () => {\n handle.off(\"change\", onChange);\n };\n }, [handle]);\n\n return useMemo(() => {\n if (!heads) return null;\n const doc = handle.doc();\n if (!doc) return null;\n try {\n return diffStore(doc, decodeHeads(heads));\n } catch (error) {\n console.warn(\"[tldraw5/diff] failed to compute diff\", error);\n return null;\n }\n // `tick` is intentionally a dependency: it forces recompute on doc change.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [handle, heads, tick]);\n}\n\nfunction buildStatusMap(diff: ShapeDiff | null): Map<TLShapeId, DiffStatus> {\n const map = new Map<TLShapeId, DiffStatus>();\n if (!diff) return map;\n for (const id of diff.added) map.set(id, \"added\");\n for (const id of diff.changed) map.set(id, \"changed\");\n for (const record of diff.deleted) map.set(record.id as TLShapeId, \"deleted\");\n return map;\n}\n\n// Renders deleted shapes by putting their baseline records back into the\n// *tldraw* store as locked ghosts. These are applied via `mergeRemoteChanges`\n// (source: \"remote\"), and the only TLStore->Automerge sync path listens for\n// source: \"user\" \u2014 so ghosts never sync back to the doc. `diffStore` reads the\n// Automerge doc (not the tldraw store), so ghosts also never re-enter the diff.\nfunction useDeletedGhosts(\n store: TLStoreWithStatus,\n handle: DocHandle<TLDrawDoc>,\n diff: ShapeDiff | null\n) {\n const ghostIds = useRef<Set<TLShapeId>>(new Set());\n\n useEffect(() => {\n const inner = store.store;\n if (!inner) return;\n\n const desired = new Map<TLShapeId, TLRecord>();\n if (diff) {\n for (const record of diff.deleted) {\n desired.set(record.id as TLShapeId, record);\n }\n }\n\n // A ghost is only safe to remove if it isn't currently a real record in the\n // doc: if a deleted shape was re-added upstream, the sync layer puts the\n // real record back at the same id, and removing it then would drop the real\n // shape from the view.\n const liveStore = (handle.doc()?.store ?? {}) as Record<string, unknown>;\n const toRemove = [...ghostIds.current].filter(\n (id) => !desired.has(id) && !(id in liveStore)\n );\n const toAdd: TLRecord[] = [];\n for (const [id, record] of desired) {\n if (!ghostIds.current.has(id)) {\n // Fade the ghost via tldraw's first-class `opacity` prop. tldraw writes\n // `opacity` as an inline style on the shape element (Shape.tsx), so a CSS\n // class (`.tl-diff-deleted`) can't override it \u2014 the fade has to live on\n // the record itself. The red \"removed\" glow stays in CSS as a `filter`.\n toAdd.push({ ...record, isLocked: true, opacity: 0.1 } as TLRecord);\n }\n }\n\n if (toRemove.length === 0 && toAdd.length === 0) return;\n\n inner.mergeRemoteChanges(() => {\n if (toRemove.length) inner.remove(toRemove);\n if (toAdd.length) inner.put(toAdd);\n });\n\n for (const id of toRemove) ghostIds.current.delete(id);\n for (const record of toAdd) ghostIds.current.add(record.id as TLShapeId);\n }, [store, handle, diff]);\n}\n\nfunction TldrawInner(props: {\n docUrl: AutomergeUrl;\n element: HTMLElement;\n readOnly: boolean;\n}) {\n const key = useMemo(() => `${props.docUrl}-camera`, [props.docUrl]);\n\n const editor = useEditor();\n const repo = useRepo();\n\n usePatchworkDrop(props.element);\n useDocumentScript(props.docUrl, editor, repo);\n\n const onChange = useCallback(() => {\n if (!editor) return;\n const camstate = editor.getCameraState();\n if (camstate == \"moving\") {\n // todo debounce?\n localStorage.setItem(key, JSON.stringify(editor.getCamera()));\n }\n }, []);\n\n useEffect(() => {\n if (!editor) return;\n\n // History-pinned views block all canvas editing (the store write-back is\n // also disabled in useAutomergeStore).\n editor.updateInstanceState({ isReadonly: props.readOnly });\n\n // Give the NewDocTool the repo it needs to create embedded documents.\n setNewDocToolContext(repo, editor);\n\n // Handle pasted/dropped files (images, videos) by storing them as\n // UnixFileEntry automerge docs and referencing them via service-worker URLs.\n editor.registerExternalAssetHandler(\"file\", async ({ file, assetId }) => {\n // Create a stable asset ID if one wasn't provided\n const id = assetId ?? (`asset:${crypto.randomUUID()}` as TLAssetId);\n\n // Read the file bytes\n const bytes = new Uint8Array(await file.arrayBuffer());\n\n // Determine extension and name\n const ext = extensionForMimeType(file.type);\n const name =\n file.name && file.name !== \"image.png\"\n ? file.name\n : `Pasted image on ${new Date().toLocaleDateString()}.${ext}`;\n\n // Create an automerge doc for the file\n const fileHandle = repo.create<UnixFileEntry>();\n fileHandle.change((doc) => {\n doc.content = bytes;\n doc.extension = ext;\n doc.mimeType = file.type;\n doc.name = name;\n });\n\n // Build the asset using tldraw's helper to get dimensions etc.\n const asset = await getAssetInfo(editor, file, id);\n if (!asset) throw new Error(`unsupported asset type: ${file.type}`);\n\n // Point the asset's src at the service-worker URL for this doc\n (asset.props as { src?: string }).src = automergeUrlToServiceWorkerUrl(\n fileHandle.url\n );\n\n return asset;\n });\n\n // Override the tldraw paste handler to avoid \"could not migrate content\"\n // errors when pasting from newer tldraw versions (e.g. tldraw.com may\n // run a canary build whose schema sequence versions are ahead of ours).\n editor.registerExternalContentHandler(\n \"tldraw\",\n ({ point, content }: { point?: VecLike; content: TLContent }) => {\n editor.run(() => {\n const selectionBoundsBefore = editor.getSelectionPageBounds();\n editor.markHistoryStoppingPoint(\"paste\");\n\n for (const shape of content.shapes) {\n if (content.rootShapeIds.includes(shape.id)) {\n shape.isLocked = false;\n }\n }\n\n // Replace the pasted content's schema with ours so that\n // migrateStoreSnapshot sees matching versions and skips migration\n // rather than failing on unknown future sequence versions.\n content.schema = editor.store.schema.serialize();\n\n editor.putContentOntoCurrentPage(content, {\n point,\n select: true,\n });\n\n const selectedBoundsAfter = editor.getSelectionPageBounds();\n if (\n selectionBoundsBefore &&\n selectedBoundsAfter &&\n selectionBoundsBefore.collides(selectedBoundsAfter)\n ) {\n editor.updateInstanceState({ isChangingStyle: true });\n }\n });\n }\n );\n\n const existing = localStorage.getItem(key);\n if (existing) {\n try {\n const cam = JSON.parse(existing);\n editor.setCamera(cam);\n } catch {\n localStorage.removeItem(key);\n }\n }\n editor.on(\"change\", onChange);\n return () => void editor.off(\"change\", onChange);\n }, [editor, props.readOnly]);\n return null;\n}\n\n// Runs the document's `script/main.js`, if it has one, on canvas mount and\n// again whenever the script's own files are edited \u2014 the running script is\n// aborted first, so an edit takes effect on the canvas immediately.\nfunction useDocumentScript(\n docUrl: AutomergeUrl,\n editor: Editor | null,\n repo: Repo\n) {\n const [doc] = useDocument<TLDrawDoc>(docUrl);\n // Keyed on the links, not the doc object: `useDocument` returns a fresh object\n // on every change, so keying on identity would abort the script's signal and\n // tear down its listeners on every stroke.\n const key = doc?.docs?.length ? JSON.stringify(doc.docs) : \"\";\n\n useEffect(() => {\n if (!editor || !key) return;\n\n let cancelled = false;\n let unwatch: (() => void) | undefined;\n let current: {\n deps: string[];\n signature: string;\n dispose: () => void;\n } | null = null;\n\n void (async () => {\n const { watchScriptTree, hasScript, runScript, signatureOf } =\n await import(\"./script.ts\");\n if (cancelled) return;\n\n let queue: Promise<void> = Promise.resolve();\n unwatch = watchScriptTree(repo, JSON.parse(key), (tree) => {\n queue = queue.then(async () => {\n if (cancelled || !hasScript(tree.files)) return;\n // Nothing the script was built from moved, so leave it running.\n if (\n current &&\n signatureOf(current.deps, tree.versions) === current.signature\n ) {\n return;\n }\n current?.dispose();\n current = null;\n try {\n const result = await runScript(repo, tree.files, editor);\n if (cancelled) {\n result.dispose();\n return;\n }\n current = {\n deps: result.deps,\n signature: signatureOf(result.deps, tree.versions),\n dispose: result.dispose,\n };\n } catch (error) {\n console.error(\"[tldraw5] document script failed\", error);\n }\n });\n });\n })();\n\n return () => {\n cancelled = true;\n unwatch?.();\n current?.dispose();\n };\n }, [editor, key, repo]);\n}\n\n// Accept documents dragged in from the folder-tree-view / sideboard and other\n// Patchwork tools, embedding each as a `patchwork-doc` shape at the drop point.\nfunction usePatchworkDrop(element: HTMLElement) {\n const editor = useEditor();\n const repo = useRepo();\n\n useEffect(() => {\n if (!editor || !element) return;\n\n // If the drop lands inside an already-embedded <patchwork-view>, let that\n // inner tool handle it instead of creating a nested embed. The outer\n // <patchwork-view> hosting this canvas appears at/after `element` in the\n // path, so we stop the walk once we reach `element`.\n const isInsideEmbeddedPatchworkView = (e: DragEvent) => {\n for (const el of e.composedPath()) {\n if (el === element) break;\n if ((el as Element).tagName?.toLowerCase() === \"patchwork-view\") return true;\n }\n return false;\n };\n\n const allowDrop = (e: DragEvent) => {\n if (e.dataTransfer && isPatchworkDrag(e.dataTransfer.types)) e.preventDefault();\n };\n\n // A dropped `.tldraw` archive becomes its own Patchwork document, embedded\n // at the drop point like any other dragged-in document.\n const handleArchiveDrop = (e: DragEvent, file: File) => {\n e.preventDefault();\n e.stopImmediatePropagation();\n\n const dropPoint = editor.screenToPage({ x: e.clientX, y: e.clientY });\n\n void (async () => {\n try {\n const url = await importArchiveFile(file, repo);\n const shapeId = makeShapeId(url);\n if (editor.getShape(shapeId)) {\n editor.select(shapeId);\n return;\n }\n editor.createShape({\n id: shapeId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n x: dropPoint.x,\n y: dropPoint.y,\n rotation: 0,\n parentId: editor.getCurrentPageId(),\n props: {\n w: 640,\n h: 480,\n docUrl: url,\n docName: file.name,\n docType: \"tldraw5\",\n toolId: \"tldraw5\",\n },\n });\n editor.setSelectedShapes([shapeId]);\n } catch (error) {\n console.error(\"[tldraw5] failed to import dropped archive\", error);\n }\n })();\n };\n\n const handleDrop = (e: DragEvent) => {\n const archive = Array.from(e.dataTransfer?.files ?? []).find(\n isTldrArchiveFile\n );\n if (archive) {\n if (isInsideEmbeddedPatchworkView(e)) return;\n handleArchiveDrop(e, archive);\n return;\n }\n\n if (!e.dataTransfer || !isPatchworkDrag(e.dataTransfer.types)) return;\n e.preventDefault();\n if (isInsideEmbeddedPatchworkView(e)) return;\n e.stopImmediatePropagation();\n\n const docs = parseDroppedDocs(e.dataTransfer);\n if (docs.length === 0) return;\n\n const dropPoint = editor.screenToPage({ x: e.clientX, y: e.clientY });\n const STAGGER = 24;\n\n docs.forEach((item, i) => {\n const shapeId = makeShapeId(item.url);\n\n // Already embedded: select it rather than creating a duplicate.\n if (editor.getShape(shapeId)) {\n editor.select(shapeId);\n return;\n }\n\n const knownType = item.type ?? \"\";\n editor.createShape({\n id: shapeId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n x: dropPoint.x + i * STAGGER,\n y: dropPoint.y + i * STAGGER,\n rotation: 0,\n parentId: editor.getCurrentPageId(),\n props: {\n w: 640,\n h: 480,\n docUrl: item.url,\n docName: item.name ?? \"Loading\\u2026\",\n docType: knownType,\n toolId: getDefaultToolId(knownType),\n },\n });\n\n // Resolve datatype/name from the doc when the drag payload didn't\n // include them (e.g. bare-URL drags).\n if (!item.type || !item.name) {\n void (async () => {\n try {\n const handle = await repo.find<{ \"@patchwork\"?: { type?: string } }>(item.url);\n const doc = handle.doc();\n const datatypeId = doc?.[\"@patchwork\"]?.type ?? knownType;\n if (!editor.getShape(shapeId)) return;\n editor.updateShape({\n id: shapeId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n props: {\n docName: item.name ?? datatypeId ?? item.url,\n docType: datatypeId,\n toolId: getDefaultToolId(datatypeId),\n },\n });\n } catch (err) {\n console.error(\"[tldraw5] failed to resolve dropped doc\", err);\n }\n })();\n }\n });\n\n editor.setSelectedShapes(docs.map((d) => makeShapeId(d.url)));\n };\n\n element.addEventListener(\"dragenter\", allowDrop, { capture: true });\n element.addEventListener(\"dragover\", allowDrop, { capture: true });\n element.addEventListener(\"drop\", handleDrop, { capture: true });\n return () => {\n element.removeEventListener(\"dragenter\", allowDrop, { capture: true });\n element.removeEventListener(\"dragover\", allowDrop, { capture: true });\n element.removeEventListener(\"drop\", handleDrop, { capture: true });\n };\n }, [editor, repo, element]);\n}\n\nexport function render(handle: any, element: any) {\n const root = createRoot(element);\n root.render(\n <RepoContext.Provider value={element.repo}>\n <TldrawTool docUrl={handle.url} element={element} />\n </RepoContext.Provider>\n );\n return () => root.unmount();\n}\n", "export * from \"@automerge/automerge-repo\"\nexport * from \"./default-exports.js\"\n", "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/** Restore the built-in logger factory (mainly for tests). */\nexport function resetLoggerFactory() {\n factory = defaultFactory;\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<any>>\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(\"pruned\", () => 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", "/**\n *\n * A `NetworkAdapter` which uses [BroadcastChannel](https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel)\n * to communicate with other peers in the same browser tab. This is a bit of a\n * hack because `NetworkAdapter`s are supposed to be used as point to\n * point communication channels. To get around this the {@link BroadcastChannelNetworkAdapter}\n * broadcasts messages to all peers and then filters out messages not intended\n * for the current peer. This is quite inefficient as messages get duplicated\n * for every peer in the tab, but as it's all local communication anyway\n * it's not too bad. If efficiency is becoming an issue you can switch to\n * `automerge-repo-network-messagechannel`.\n *\n * @module\n *\n */\n\nimport {\n makeLogger,\n NetworkAdapter,\n type Message,\n type PeerId,\n type PeerMetadata,\n} from \"@automerge/automerge-repo/slim\"\n\nconst log = makeLogger(\"automerge-repo:broadcastchannel\")\n\nexport type BroadcastChannelNetworkAdapterOptions = {\n /** BroadcastChannel name to use */\n channelName: string\n /** How long to wait for peers to arrive before declaring this adapter is ready */\n peerWaitMs?: number\n}\n\nexport class BroadcastChannelNetworkAdapter extends NetworkAdapter {\n #broadcastChannel: BroadcastChannel\n // Held on the instance so disconnect() can remove it and connect() can avoid\n // stacking duplicates.\n #messageListener?: (e: { data: BroadcastChannelMessage }) => void\n #disconnected = false\n #ready = false\n // reassigned in constructor, but keeps TS from complaining\n #markReady = () => {}\n #readyPromise: Promise<void>\n\n #options: BroadcastChannelNetworkAdapterOptions\n\n #connectedPeers: PeerId[] = []\n\n isReady() {\n return this.#ready\n }\n\n whenReady() {\n return this.#readyPromise\n }\n\n constructor(options?: BroadcastChannelNetworkAdapterOptions) {\n super()\n this.#options = {\n channelName: \"broadcast\",\n peerWaitMs: 1000,\n ...(options ?? {}),\n }\n this.#broadcastChannel = new BroadcastChannel(this.#options.channelName)\n this.#readyPromise = new Promise<void>(resolve => {\n this.#markReady = () => {\n this.#ready = true\n resolve()\n }\n setTimeout(() => this.#markReady(), this.#options.peerWaitMs)\n })\n }\n\n connect(peerId: PeerId, peerMetadata?: PeerMetadata) {\n this.peerId = peerId\n this.peerMetadata = peerMetadata\n\n if (this.#disconnected) {\n this.#broadcastChannel = new BroadcastChannel(this.#options.channelName)\n } else if (this.#messageListener) {\n this.#broadcastChannel.removeEventListener(\n \"message\",\n this.#messageListener\n )\n }\n this.#disconnected = false\n\n this.#messageListener = (e: { data: BroadcastChannelMessage }) => {\n const message = e.data\n if (\"targetId\" in message && message.targetId !== this.peerId) {\n return\n }\n\n if (this.#disconnected) {\n return\n }\n\n const { senderId, type } = message\n\n switch (type) {\n case \"arrive\":\n {\n const { peerMetadata } = message as ArriveMessage\n this.#broadcastChannel.postMessage({\n senderId: this.peerId,\n targetId: senderId,\n type: \"welcome\",\n peerMetadata: this.peerMetadata,\n })\n this.#announceConnection(senderId, peerMetadata)\n }\n break\n case \"welcome\":\n {\n const { peerMetadata } = message as WelcomeMessage\n this.#announceConnection(senderId, peerMetadata)\n }\n break\n case \"leave\":\n this.#connectedPeers = this.#connectedPeers.filter(\n p => p !== senderId\n )\n this.emit(\"peer-disconnected\", { peerId: senderId })\n break\n default:\n if (!(\"data\" in message)) {\n this.emit(\"message\", message)\n } else {\n if (!message.data) {\n // A throw inside this \"message\" listener escapes dispatch and can\n // crash the process under Node, so log and drop the malformed\n // message.\n log.warn(\"dropping a data message with no data from %o\", senderId)\n return\n }\n const data = message.data\n this.emit(\"message\", {\n ...message,\n data: new Uint8Array(data),\n })\n }\n break\n }\n }\n this.#broadcastChannel.addEventListener(\"message\", this.#messageListener)\n\n this.#broadcastChannel.postMessage({\n senderId: this.peerId,\n type: \"arrive\",\n peerMetadata,\n })\n }\n\n #announceConnection(peerId: PeerId, peerMetadata: PeerMetadata) {\n this.#markReady()\n this.#connectedPeers.push(peerId)\n this.emit(\"peer-candidate\", { peerId, peerMetadata })\n }\n\n send(message: Message) {\n if (this.#disconnected) {\n return false\n }\n if (\"data\" in message) {\n this.#broadcastChannel.postMessage({\n ...message,\n data: message.data\n ? message.data.buffer.slice(\n message.data.byteOffset,\n message.data.byteOffset + message.data.byteLength\n )\n : undefined,\n })\n } else {\n this.#broadcastChannel.postMessage(message)\n }\n }\n\n disconnect() {\n if (this.#disconnected) {\n return\n }\n this.#broadcastChannel.postMessage({\n senderId: this.peerId,\n type: \"leave\",\n })\n for (const peerId of this.#connectedPeers) {\n this.emit(\"peer-disconnected\", { peerId })\n }\n this.#disconnected = true\n\n // Detach the listener and close the channel so nothing is retained after\n // disconnect; connect() reopens a fresh channel.\n if (this.#messageListener) {\n this.#broadcastChannel.removeEventListener(\n \"message\",\n this.#messageListener\n )\n this.#messageListener = undefined\n }\n this.#broadcastChannel.close()\n }\n}\n\n/** Notify the network that we have arrived so everyone knows our peer ID */\ntype ArriveMessage = {\n type: \"arrive\"\n\n /** The peer ID of the sender of this message */\n senderId: PeerId\n\n /** The peer metadata of the sender of this message */\n peerMetadata: PeerMetadata\n\n /** Arrive messages don't have a targetId */\n targetId: never\n}\n\n/** Respond to an arriving peer with our peer ID */\ntype WelcomeMessage = {\n type: \"welcome\"\n\n /** The peer ID of the recipient sender this message */\n senderId: PeerId\n\n /** The peer metadata of the sender of this message */\n peerMetadata: PeerMetadata\n\n /** The peer ID of the recipient of this message */\n targetId: PeerId\n}\n\ntype BroadcastChannelMessage = ArriveMessage | WelcomeMessage | Message\n", "export * from \"@automerge/automerge-repo-react-hooks\"\n\nexport { BroadcastChannelNetworkAdapter } from \"@automerge/automerge-repo-network-broadcastchannel\"\nexport { MessageChannelNetworkAdapter } from \"@automerge/automerge-repo-network-messagechannel\"\nexport { WebSocketClientAdapter } from \"@automerge/automerge-repo-network-websocket\"\nexport { IndexedDBStorageAdapter } from \"@automerge/automerge-repo-storage-indexeddb\"\n", "import {\n NetworkAdapter,\n PeerId,\n PeerMetadata,\n cbor,\n} from \"@automerge/automerge-repo/slim\"\n\nimport debug from \"debug\"\n\nimport {\n FromClientMessage,\n FromServerMessage,\n JoinMessage,\n isErrorMessage,\n isPeerMessage,\n} from \"./messages.js\"\nimport { ProtocolV1 } from \"./protocolVersion.js\"\nimport { assert } from \"./assert.js\"\nimport { toArrayBuffer } from \"./toArrayBuffer.js\"\n\nabstract class WebSocketNetworkAdapter extends NetworkAdapter {\n socket?: WebSocket\n}\n\nexport class WebSocketClientAdapter extends WebSocketNetworkAdapter {\n #ready = false\n #readyResolver?: () => void\n #readyPromise: Promise<void> = new Promise<void>(resolve => {\n this.#readyResolver = resolve\n })\n\n isReady() {\n return this.#ready\n }\n\n whenReady() {\n return this.#readyPromise\n }\n\n #forceReady() {\n if (!this.#ready) {\n this.#ready = true\n this.#readyResolver?.()\n }\n }\n\n #retryIntervalId?: TimeoutId\n #reconnectTimeoutId?: TimeoutId\n #forceReadyTimeoutId?: TimeoutId\n #disconnected = false\n #log = debug(\"automerge-repo:websocket:browser\")\n\n remotePeerId?: PeerId // this adapter only connects to one remote client at a time\n\n constructor(\n public readonly url: string,\n public readonly retryInterval = 5000\n ) {\n super()\n this.#log = this.#log.extend(url)\n }\n\n connect(peerId: PeerId, peerMetadata?: PeerMetadata) {\n this.#disconnected = false\n if (!this.socket || !this.peerId) {\n // first time connecting\n this.#log(\"connecting\")\n this.peerId = peerId\n this.peerMetadata = peerMetadata ?? {}\n } else {\n this.#log(\"reconnecting\")\n assert(peerId === this.peerId)\n // Remove the old event listeners before creating a new connection.\n this.socket.removeEventListener(\"open\", this.onOpen)\n this.socket.removeEventListener(\"close\", this.onClose)\n this.socket.removeEventListener(\"message\", this.onMessage)\n this.socket.removeEventListener(\"error\", this.onError)\n }\n // Wire up retries\n if (!this.#retryIntervalId)\n this.#retryIntervalId = setInterval(() => {\n this.connect(peerId, peerMetadata)\n }, this.retryInterval)\n\n this.socket = new WebSocket(this.url)\n\n this.socket.binaryType = \"arraybuffer\"\n\n this.socket.addEventListener(\"open\", this.onOpen)\n this.socket.addEventListener(\"close\", this.onClose)\n this.socket.addEventListener(\"message\", this.onMessage)\n this.socket.addEventListener(\"error\", this.onError)\n\n // Mark this adapter as ready if we haven't received an ack in 1 second.\n // We might hear back from the other end at some point but we shouldn't\n // hold up marking things as unavailable for any longer. Clear any pending\n // fallback so reconnects don't accumulate timers.\n clearTimeout(this.#forceReadyTimeoutId)\n this.#forceReadyTimeoutId = setTimeout(() => this.#forceReady(), 1000)\n this.join()\n }\n\n onOpen = () => {\n this.#log(\"open\")\n clearInterval(this.#retryIntervalId)\n this.#retryIntervalId = undefined\n this.join()\n }\n\n // When a socket closes, or disconnects, remove it from the array.\n onClose = () => {\n this.#log(\"close\")\n if (this.remotePeerId)\n this.emit(\"peer-disconnected\", { peerId: this.remotePeerId })\n\n if (this.retryInterval > 0 && !this.#retryIntervalId)\n // try to reconnect\n this.#reconnectTimeoutId = setTimeout(() => {\n // Skip the reconnect if disconnect() ran after it was scheduled.\n if (this.#disconnected) return\n assert(this.peerId)\n return this.connect(this.peerId, this.peerMetadata)\n }, this.retryInterval)\n }\n\n onMessage = (event: MessageEvent) => {\n this.receiveMessage(event.data as Uint8Array)\n }\n\n /** Native WebSocket error events are intentionally opaque \u2014 on both the\n * browser and Node the error detail is withheld from scripts by design\n * (https://stackoverflow.com/a/31003057/239663) \u2014 so we just log and let\n * the retry logic reconnect. */\n onError = () => {\n this.#log(\"Connection failed, retrying...\")\n }\n\n join() {\n assert(this.peerId)\n assert(this.socket)\n if (this.socket.readyState === WebSocket.OPEN) {\n this.send(joinMessage(this.peerId!, this.peerMetadata!))\n } else {\n // We'll try again in the `onOpen` handler\n }\n }\n\n disconnect() {\n if (this.#disconnected) return\n assert(this.peerId)\n assert(this.socket)\n this.#disconnected = true\n const socket = this.socket\n if (socket) {\n socket.removeEventListener(\"open\", this.onOpen)\n socket.removeEventListener(\"close\", this.onClose)\n socket.removeEventListener(\"message\", this.onMessage)\n socket.removeEventListener(\"error\", this.onError)\n socket.close()\n }\n clearInterval(this.#retryIntervalId)\n this.#retryIntervalId = undefined\n clearTimeout(this.#reconnectTimeoutId)\n this.#reconnectTimeoutId = undefined\n clearTimeout(this.#forceReadyTimeoutId)\n this.#forceReadyTimeoutId = undefined\n if (this.remotePeerId)\n this.emit(\"peer-disconnected\", { peerId: this.remotePeerId })\n this.socket = undefined\n }\n\n send(message: FromClientMessage) {\n if (\"data\" in message && message.data?.byteLength === 0)\n throw new Error(\"Tried to send a zero-length message\")\n assert(this.peerId)\n if (!this.socket) {\n this.#log(\"Tried to send on a disconnected socket.\")\n return\n }\n if (this.socket.readyState !== WebSocket.OPEN) {\n // CONNECTING / CLOSING / CLOSED. Drop silently \u2014 sync state and\n // reconnect logic will replay once the socket is OPEN again.\n this.#log(\n `Tried to send on a non-OPEN socket (readyState=${this.socket.readyState}); dropping.`\n )\n return\n }\n\n const encoded = cbor.encode(message)\n this.socket.send(toArrayBuffer(encoded))\n }\n\n peerCandidate(remotePeerId: PeerId, peerMetadata: PeerMetadata) {\n assert(this.socket)\n this.#forceReady()\n this.remotePeerId = remotePeerId\n this.emit(\"peer-candidate\", {\n peerId: remotePeerId,\n peerMetadata,\n })\n }\n\n receiveMessage(messageBytes: Uint8Array) {\n let message: FromServerMessage\n try {\n message = cbor.decode(new Uint8Array(messageBytes))\n } catch (e) {\n this.#log(\"error decoding message:\", e)\n return\n }\n\n assert(this.socket)\n if (messageBytes.byteLength === 0)\n throw new Error(\"received a zero-length message\")\n\n if (isPeerMessage(message)) {\n const { peerMetadata } = message\n this.#log(`peer: ${message.senderId}`)\n this.peerCandidate(message.senderId, peerMetadata)\n } else if (isErrorMessage(message)) {\n this.#log(`error: ${message.message}`)\n } else {\n this.emit(\"message\", message)\n }\n }\n}\n\nfunction joinMessage(\n senderId: PeerId,\n peerMetadata: PeerMetadata\n): JoinMessage {\n return {\n type: \"join\",\n senderId,\n peerMetadata,\n supportedProtocolVersions: [ProtocolV1],\n }\n}\n\ntype TimeoutId = ReturnType<typeof setTimeout> // https://stackoverflow.com/questions/45802988\n", "import type {\n Message,\n PeerId,\n PeerMetadata,\n} from \"@automerge/automerge-repo/slim\"\nimport type { ProtocolVersion } from \"./protocolVersion.js\"\n\n/** Sent by the client to the server to tell the server the clients PeerID */\nexport type JoinMessage = {\n type: \"join\"\n /** The PeerID of the client */\n senderId: PeerId\n\n /** Metadata presented by the peer */\n peerMetadata: PeerMetadata\n\n /** The protocol version the client supports */\n supportedProtocolVersions: ProtocolVersion[]\n}\n\n/** Sent by the server in response to a \"join\" message to advertise the servers PeerID */\nexport type PeerMessage = {\n type: \"peer\"\n /** The PeerID of the server */\n senderId: PeerId\n\n /** Metadata presented by the peer */\n peerMetadata: PeerMetadata\n\n /** The protocol version the server selected for this connection */\n selectedProtocolVersion: ProtocolVersion\n /** The PeerID of the client */\n targetId: PeerId\n}\n\n/** An error occurred. The other end will terminate the connection after sending this message */\nexport type ErrorMessage = {\n type: \"error\"\n /** The peer sending the message */\n senderId: PeerId\n /** A description of the error*/\n message: string\n /** The PeerID of the client */\n targetId: PeerId\n}\n\n/** A message from the client to the server */\nexport type FromClientMessage = JoinMessage | Message\n\n/** A message from the server to the client */\nexport type FromServerMessage = PeerMessage | ErrorMessage | Message\n\n// TYPE GUARDS\n\nexport const isJoinMessage = (\n message: FromClientMessage\n): message is JoinMessage => message.type === \"join\"\n\nexport const isPeerMessage = (\n message: FromServerMessage\n): message is PeerMessage => message.type === \"peer\"\n\nexport const isErrorMessage = (\n message: FromServerMessage\n): message is ErrorMessage => message.type === \"error\"\n", "export const ProtocolV1 = \"1\"\n/** The versions of the websocket protocol */\nexport type ProtocolVersion = typeof ProtocolV1\n", "/* c8 ignore start */\n\nexport function assert(value: boolean, message?: string): asserts value\nexport function assert<T>(\n value: T | undefined,\n message?: string\n): asserts value is T\nexport function assert(value: any, message = \"Assertion failed\") {\n if (value === false || value === null || value === undefined) {\n const error = new Error(trimLines(message))\n error.stack = removeLine(error.stack, \"assert.ts\")\n throw error\n }\n}\n\nconst trimLines = (s: string) =>\n s\n .split(\"\\n\")\n .map(s => s.trim())\n .join(\"\\n\")\n\nconst removeLine = (s = \"\", targetText: string) =>\n s\n .split(\"\\n\")\n .filter(line => !line.includes(targetText))\n .join(\"\\n\")\n\n/* c8 ignore end */\n", "/**\n * This incantation deals with websocket sending the whole underlying buffer even if we just have a\n * uint8array view on it\n */\nexport const toArrayBuffer = (bytes: Uint8Array): ArrayBuffer => {\n const { buffer, byteOffset, byteLength } = bytes\n return buffer.slice(byteOffset, byteOffset + byteLength) as ArrayBuffer\n}\n", "import {\n NetworkAdapter,\n type PeerId,\n type PeerMetadata,\n} from \"@automerge/automerge-repo/slim\"\n\nimport debug from \"debug\"\n\nimport {\n type FromClientMessage,\n type FromServerMessage,\n isErrorMessage,\n isPeerMessage,\n} from \"./messages.js\"\nimport { ProtocolV1 } from \"./protocolVersion.js\"\nimport { WebSocketClientAdapter } from \"./WebSocketClientAdapter.js\"\nimport {\n WS_WORKER_RPC,\n type WsWorkerCommandBody,\n type WsWorkerEvent,\n} from \"./websocket-worker-rpc.js\"\n\n/**\n * A drop-in {@link WebSocketClientAdapter} (same API) that runs the socket and\n * CBOR encode/decode on a Worker, so inbound frames are read and decoded off\n * the host thread. Falls back to a main-thread {@link WebSocketClientAdapter}\n * where Workers aren't available.\n */\nexport class WebSocketWorkerClientAdapter extends NetworkAdapter {\n #ready = false\n #readyResolver?: () => void\n #readyPromise: Promise<void> = new Promise(resolve => {\n this.#readyResolver = resolve\n })\n\n #worker?: Worker\n #fallback?: WebSocketClientAdapter\n #log = debug(\"automerge-repo:websocket:worker\")\n\n /** This adapter only connects to one remote at a time. */\n remotePeerId?: PeerId\n\n /** @param worker - an existing Worker to use instead of spawning one. */\n constructor(\n public readonly url: string,\n public readonly retryInterval = 5000,\n worker?: Worker\n ) {\n super()\n this.#log = this.#log.extend(url)\n if (worker) {\n this.#worker = worker\n this.#worker.addEventListener(\"message\", this.#onWorkerMessage)\n this.#worker.addEventListener(\"error\", this.#onWorkerError)\n }\n }\n\n isReady() {\n return this.#fallback ? this.#fallback.isReady() : this.#ready\n }\n\n whenReady() {\n return this.#fallback ? this.#fallback.whenReady() : this.#readyPromise\n }\n\n #forceReady() {\n if (!this.#ready) {\n this.#ready = true\n this.#readyResolver?.()\n }\n }\n\n connect(peerId: PeerId, peerMetadata?: PeerMetadata) {\n this.peerId = peerId\n this.peerMetadata = peerMetadata ?? {}\n\n if (!this.#worker && !this.#fallback) {\n if (typeof Worker === \"undefined\") {\n this.#useFallback()\n } else {\n try {\n this.#worker = new Worker(\n new URL(\"./websocket.worker.js\", import.meta.url),\n { type: \"module\" }\n )\n this.#worker.addEventListener(\"message\", this.#onWorkerMessage)\n this.#worker.addEventListener(\"error\", this.#onWorkerError)\n } catch (err) {\n this.#log(\n \"worker unavailable, falling back to a main-thread socket: %o\",\n err\n )\n this.#useFallback()\n }\n }\n }\n\n if (this.#fallback) {\n this.#fallback.connect(peerId, peerMetadata)\n return\n }\n\n this.#post({\n type: \"connect\",\n url: this.url,\n retryInterval: this.retryInterval,\n })\n\n // Ready after 1s without a peer ack (matches WebSocketClientAdapter).\n setTimeout(() => this.#forceReady(), 1000)\n }\n\n #useFallback() {\n const fallback = new WebSocketClientAdapter(this.url, this.retryInterval)\n this.#fallback = fallback\n fallback.on(\"message\", message => this.emit(\"message\", message))\n fallback.on(\"peer-candidate\", payload =>\n this.emit(\"peer-candidate\", payload)\n )\n fallback.on(\"peer-disconnected\", payload =>\n this.emit(\"peer-disconnected\", payload)\n )\n fallback.on(\"close\", () => this.emit(\"close\"))\n }\n\n #onWorkerMessage = (e: MessageEvent) => {\n const event = e.data as WsWorkerEvent\n if (!event || event.channel !== WS_WORKER_RPC) return\n switch (event.type) {\n case \"open\":\n this.#join()\n return\n case \"message\":\n this.#receiveMessage(event.message)\n return\n case \"close\":\n if (this.remotePeerId)\n this.emit(\"peer-disconnected\", { peerId: this.remotePeerId })\n return\n case \"error\":\n this.#log(\"websocket error (in worker)\")\n return\n }\n }\n\n #onWorkerError = (e: Event) => {\n this.#log(\"websocket worker error: %o\", e)\n }\n\n #join() {\n if (!this.peerId) return\n this.#post({\n type: \"send\",\n message: {\n type: \"join\",\n senderId: this.peerId,\n peerMetadata: this.peerMetadata ?? {},\n supportedProtocolVersions: [ProtocolV1],\n },\n })\n }\n\n #receiveMessage(message: FromServerMessage) {\n if (isPeerMessage(message)) {\n this.#log(`peer: ${message.senderId}`)\n this.remotePeerId = message.senderId\n this.#forceReady()\n this.emit(\"peer-candidate\", {\n peerId: message.senderId,\n peerMetadata: message.peerMetadata,\n })\n } else if (isErrorMessage(message)) {\n this.#log(`error: ${message.message}`)\n } else {\n this.emit(\"message\", message)\n }\n }\n\n send(message: FromClientMessage) {\n if (\"data\" in message && message.data?.byteLength === 0)\n throw new Error(\"Tried to send a zero-length message\")\n\n if (this.#fallback) {\n this.#fallback.send(message)\n return\n }\n if (!this.#worker) {\n this.#log(\"Tried to send on a disconnected adapter.\")\n return\n }\n this.#post({ type: \"send\", message })\n }\n\n disconnect() {\n if (this.#fallback) {\n this.#fallback.disconnect()\n return\n }\n if (this.remotePeerId)\n this.emit(\"peer-disconnected\", { peerId: this.remotePeerId })\n this.#post({ type: \"disconnect\" })\n if (this.#worker) {\n this.#worker.removeEventListener(\"message\", this.#onWorkerMessage)\n this.#worker.removeEventListener(\"error\", this.#onWorkerError)\n this.#worker.terminate()\n this.#worker = undefined\n }\n }\n\n #post(command: WsWorkerCommandBody) {\n this.#worker?.postMessage({ channel: WS_WORKER_RPC, ...command })\n }\n}\n", "import WebSocket, { type WebSocketServer } from \"ws\"\n\nimport debug from \"debug\"\nconst log = debug(\"WebsocketServer\")\n\nimport {\n cbor as cborHelpers,\n NetworkAdapter,\n type PeerMetadata,\n type PeerId,\n} from \"@automerge/automerge-repo/slim\"\nimport {\n FromClientMessage,\n FromServerMessage,\n isJoinMessage,\n} from \"./messages.js\"\nimport { ProtocolV1, ProtocolVersion } from \"./protocolVersion.js\"\nimport { assert } from \"./assert.js\"\nimport { toArrayBuffer } from \"./toArrayBuffer.js\"\n\nconst { encode, decode } = cborHelpers\n\nexport class WebSocketServerAdapter extends NetworkAdapter {\n sockets: { [peerId: PeerId]: WebSocket } = {}\n\n #ready = false\n #readyResolver?: () => void\n #readyPromise: Promise<void> = new Promise<void>(resolve => {\n this.#readyResolver = resolve\n })\n\n isReady() {\n return this.#ready\n }\n\n whenReady() {\n return this.#readyPromise\n }\n\n #forceReady() {\n if (!this.#ready) {\n this.#ready = true\n this.#readyResolver?.()\n }\n }\n\n // Server-level wiring registered in connect(), held on the instance so\n // disconnect() can clear the keepalive interval and remove the listeners we\n // add to the long-lived WebSocketServer, and so a repeated connect() does not\n // stack duplicates.\n #keepAliveId?: ReturnType<typeof setInterval>\n #onServerClose?: () => void\n #onServerConnection?: (socket: WebSocketWithIsAlive) => void\n\n constructor(\n private server: WebSocketServer,\n private keepAliveInterval = 5000\n ) {\n super()\n }\n\n connect(peerId: PeerId, peerMetadata?: PeerMetadata) {\n this.peerId = peerId\n this.peerMetadata = peerMetadata\n\n // Detach any wiring from an earlier connect() so repeated calls don't stack\n // listeners or intervals on the shared server.\n this.#teardownServerWiring()\n\n this.#onServerClose = () => {\n this.disconnect()\n }\n this.server.on(\"close\", this.#onServerClose)\n\n this.#onServerConnection = (socket: WebSocketWithIsAlive) => {\n // When a socket closes, or disconnects, remove it from our list\n socket.on(\"close\", () => {\n this.#removeSocket(socket)\n })\n\n socket.on(\"message\", message =>\n this.receiveMessage(message as Uint8Array, socket)\n )\n\n // Start out \"alive\", and every time we get a pong, reset that state.\n socket.isAlive = true\n socket.on(\"pong\", () => (socket.isAlive = true))\n\n this.#forceReady()\n }\n this.server.on(\"connection\", this.#onServerConnection)\n\n this.#keepAliveId = setInterval(() => {\n // Terminate connections to lost clients\n const clients = this.server.clients as Set<WebSocketWithIsAlive>\n clients.forEach(socket => {\n if (socket.isAlive) {\n // Mark all clients as potentially dead until we hear from them\n socket.isAlive = false\n socket.ping()\n } else {\n this.#terminate(socket)\n }\n })\n }, this.keepAliveInterval)\n }\n\n disconnect() {\n this.#teardownServerWiring()\n\n const clients = this.server.clients as Set<WebSocketWithIsAlive>\n clients.forEach(socket => {\n this.#terminate(socket)\n this.#removeSocket(socket)\n })\n }\n\n #teardownServerWiring() {\n if (this.#keepAliveId !== undefined) {\n clearInterval(this.#keepAliveId)\n this.#keepAliveId = undefined\n }\n if (this.#onServerClose) {\n this.server.off(\"close\", this.#onServerClose)\n this.#onServerClose = undefined\n }\n if (this.#onServerConnection) {\n this.server.off(\"connection\", this.#onServerConnection)\n this.#onServerConnection = undefined\n }\n }\n\n send(message: FromServerMessage) {\n assert(\"targetId\" in message && message.targetId !== undefined)\n if (\"data\" in message && message.data?.byteLength === 0)\n throw new Error(\"Tried to send a zero-length message\")\n\n const senderId = this.peerId\n assert(senderId, \"No peerId set for the websocket server network adapter.\")\n\n const socket = this.sockets[message.targetId]\n\n if (!socket) {\n log(`Tried to send to disconnected peer: ${message.targetId}`)\n return\n }\n\n if (socket.readyState !== WebSocket.OPEN) {\n // Peer's socket is CONNECTING / CLOSING / CLOSED. Drop silently \u2014\n // once the peer reconnects and rejoins, normal sync state resumes.\n log(\n `Tried to send to peer ${message.targetId} with non-OPEN socket (readyState=${socket.readyState}); dropping.`\n )\n return\n }\n\n const encoded = encode(message)\n const arrayBuf = toArrayBuffer(encoded)\n\n socket.send(arrayBuf)\n }\n\n receiveMessage(messageBytes: Uint8Array, socket: WebSocket) {\n let message: FromClientMessage\n try {\n message = decode(messageBytes)\n } catch (e) {\n log(\"invalid message received, closing connection\")\n socket.close()\n return\n }\n\n // A decoded message is still untrusted: a malformed one (e.g. CBOR null,\n // which makes the destructure below throw) can throw while being handled.\n // This runs in the socket \"message\" event-loop callback, so an uncaught\n // throw would terminate a Node process by default. Drop the message and\n // close the misbehaving connection.\n // See https://nodejs.org/api/process.html#event-uncaughtexception\n try {\n const { type, senderId } = message\n\n const myPeerId = this.peerId\n assert(myPeerId)\n\n const documentId = \"documentId\" in message ? \"@\" + message.documentId : \"\"\n const { byteLength } = messageBytes\n log(\n `[${senderId}->${myPeerId}${documentId}] ${type} | ${byteLength} bytes`\n )\n\n if (isJoinMessage(message)) {\n const { peerMetadata, supportedProtocolVersions } = message\n const existingSocket = this.sockets[senderId]\n if (existingSocket) {\n if (existingSocket.readyState === WebSocket.OPEN) {\n existingSocket.close()\n }\n this.emit(\"peer-disconnected\", { peerId: senderId })\n }\n\n // Let the repo know that we have a new connection.\n this.emit(\"peer-candidate\", { peerId: senderId, peerMetadata })\n this.sockets[senderId] = socket\n\n const selectedProtocolVersion = selectProtocol(\n supportedProtocolVersions\n )\n if (selectedProtocolVersion === null) {\n this.send({\n type: \"error\",\n senderId: this.peerId!,\n message: \"unsupported protocol version\",\n targetId: senderId,\n })\n this.sockets[senderId].close()\n delete this.sockets[senderId]\n } else {\n this.send({\n type: \"peer\",\n senderId: this.peerId!,\n peerMetadata: this.peerMetadata!,\n selectedProtocolVersion: ProtocolV1,\n targetId: senderId,\n })\n }\n } else {\n if (this.sockets[senderId] !== socket) {\n return\n }\n this.emit(\"message\", message)\n }\n } catch (e) {\n log(\"error handling inbound message, closing connection\", e)\n socket.close()\n }\n }\n\n #terminate(socket: WebSocketWithIsAlive) {\n this.#removeSocket(socket)\n socket.terminate()\n }\n\n #removeSocket(socket: WebSocketWithIsAlive) {\n const peerId = this.#peerIdBySocket(socket)\n if (!peerId) return\n this.emit(\"peer-disconnected\", { peerId })\n delete this.sockets[peerId as PeerId]\n }\n\n #peerIdBySocket = (socket: WebSocket) => {\n const isThisSocket = (peerId: string) =>\n this.sockets[peerId as PeerId] === socket\n const result = Object.keys(this.sockets).find(isThisSocket) as PeerId\n return result ?? null\n }\n}\n\nconst selectProtocol = (versions?: ProtocolVersion[]) => {\n if (versions === undefined) return ProtocolV1\n if (versions.includes(ProtocolV1)) return ProtocolV1\n return null\n}\n\ninterface WebSocketWithIsAlive extends WebSocket {\n isAlive: boolean\n}\n", "import {\n type TLAnyShapeUtilConstructor,\n type TLRecord,\n type TLStoreWithStatus,\n createTLStore,\n type TLAnyBindingUtilConstructor,\n type HistoryEntry,\n defaultUserPreferences,\n createUserId,\n type TLUser,\n createPresenceStateDerivation,\n InstancePresenceRecordType,\n computed,\n react,\n type TLStoreSnapshot,\n type TLInstancePresence,\n sortById,\n} from \"@tldraw/tldraw\";\nimport { useEffect, useState } from \"react\";\nimport {\n type DocHandle,\n type DocHandleChangePayload,\n} from \"@automerge/automerge-repo/slim\";\nimport { usePresence } from \"@automerge/automerge-repo-react-hooks\";\n\nimport { applyAutomergePatchesToTLStore } from \"./AutomergeToTLStore.js\";\nimport { applyTLStoreChangesToAutomerge } from \"./TLStoreToAutomerge.js\";\n\n// `shapeUtils` / `bindingUtils` are the complete lists \u2014 a document script's\n// `config.js` may have added to or replaced the defaults, and the store has to\n// agree with the editor about them or records of a custom type fail validation.\nexport function useAutomergeStore({\n handle,\n shapeUtils = [],\n bindingUtils = [],\n readOnly = false,\n}: {\n handle: DocHandle<TLStoreSnapshot>;\n userId: string;\n shapeUtils?: TLAnyShapeUtilConstructor[];\n bindingUtils?: TLAnyBindingUtilConstructor[];\n readOnly?: boolean;\n}): TLStoreWithStatus {\n const [store] = useState(() => {\n const store = createTLStore({ shapeUtils, bindingUtils });\n return store;\n });\n\n const [storeWithStatus, setStoreWithStatus] = useState<TLStoreWithStatus>({\n status: \"loading\",\n });\n\n /* -------------------- TLDraw <--> Automerge -------------------- */\n useEffect(() => {\n const unsubs: (() => void)[] = [];\n\n // A hacky workaround to prevent local changes from being applied twice\n // once into the automerge doc and then back again.\n let preventPatchApplications = false;\n\n /* TLDraw to Automerge */\n function syncStoreChangesToAutomergeDoc({\n changes,\n }: HistoryEntry<TLRecord>) {\n preventPatchApplications = true;\n handle.change((doc) => {\n applyTLStoreChangesToAutomerge(doc, changes);\n });\n preventPatchApplications = false;\n }\n\n // A read-only (history-pinned) handle is at fixed heads and rejects\n // `handle.change`, so never forward store edits back to Automerge.\n if (!readOnly) {\n unsubs.push(\n store.listen(syncStoreChangesToAutomergeDoc, {\n source: \"user\",\n scope: \"document\",\n })\n );\n }\n\n /* Automerge to TLDraw */\n const syncAutomergeDocChangesToStore = ({\n patches,\n doc,\n }: DocHandleChangePayload<TLStoreSnapshot>) => {\n if (preventPatchApplications) return;\n applyAutomergePatchesToTLStore(patches, store, doc ?? handle.doc());\n };\n\n handle.on(\"change\", syncAutomergeDocChangesToStore);\n unsubs.push(() => handle.off(\"change\", syncAutomergeDocChangesToStore));\n\n /* Load the initial document snapshot into the store. */\n // TODO: need to think through the various status possibilities here and how they map\n const doc = handle.doc();\n if (!doc) throw new Error(\"Document not found\");\n if (!doc.store) throw new Error(\"Document store not initialized\");\n\n store.mergeRemoteChanges(() => {\n store.loadStoreSnapshot({\n store: structuredClone(doc.store),\n schema: structuredClone(doc.schema),\n });\n });\n\n setStoreWithStatus({\n store,\n status: \"synced-remote\",\n connectionStatus: \"online\",\n });\n\n return () => {\n unsubs.forEach((fn) => fn());\n unsubs.length = 0;\n };\n }, [handle, store, readOnly]);\n\n return storeWithStatus;\n}\n\n// Ephemeral state shared with peers: our tldraw presence record, or null if window is not focused\ntype PresenceChannels = { presence: TLInstancePresence | null };\n\nexport function useAutomergePresence({\n handle,\n store,\n userMetadata,\n element,\n}: {\n handle: DocHandle<TLStoreSnapshot>;\n store: TLStoreWithStatus;\n userMetadata: any;\n element: HTMLElement;\n}) {\n const innerStore = store?.store;\n\n const { userId, name, color } = userMetadata;\n\n const isCursorActive = useIsCursorActive(element);\n\n const { peerStates, update, stop } = usePresence<PresenceChannels>({\n handle,\n initialState: { presence: null },\n });\n\n useEffect(() => {\n if (!innerStore) return;\n\n // Records are keyed by peerId so multiple sessions of the same user stay distinct.\n const toPut: TLRecord[] = peerStates.peers\n .filter((peer) => peer.value?.presence)\n .map((peer) => ({\n ...peer.value.presence!,\n id: InstancePresenceRecordType.createId(peer.peerId),\n }));\n\n const toRemove = innerStore.query\n .records(\"instance_presence\")\n .get()\n .sort(sortById)\n .map((record) => record.id)\n .filter((id) => !toPut.find((record) => record.id === id));\n\n if (toRemove.length) innerStore.remove(toRemove);\n if (toPut.length) innerStore.put(toPut);\n }, [innerStore, peerStates]);\n\n useEffect(() => {\n if (!innerStore) return;\n // tldraw 5 derives presence from a `TLUser` signal rather than from local\n // user preferences, so the identity we get from the Patchwork contact goes\n // straight in instead of round-tripping through `setUserPreferences`.\n const user = computed<TLUser>(\"user\", () => ({\n typeName: \"user\",\n id: createUserId(userId),\n name,\n color: color ?? defaultUserPreferences.color,\n imageUrl: \"\",\n meta: {},\n }));\n\n const presenceDerivation = createPresenceStateDerivation(user)(innerStore);\n\n // Closing the page sends a goodbye, which removes our record from peers.\n window.addEventListener(\"pagehide\", stop);\n\n let cancelled = false;\n let dispose: (() => void) | undefined;\n\n if (isCursorActive) {\n dispose = react(\"broadcast presence\", () => {\n const presence = presenceDerivation.get();\n // rAF throttles broadcasts to frame rate.\n requestAnimationFrame(() => {\n if (cancelled) return;\n // Stamp activity so becoming active again shows the cursor without\n // waiting for a pointer move to refresh the store's stale timestamp.\n update(\n \"presence\",\n presence ? { ...presence, lastActivityTimestamp: Date.now() } : null\n );\n });\n });\n } else {\n // Keep the record but clear the cursor when blurred or pointer leaves\n const presence = presenceDerivation.get();\n update(\"presence\", presence ? { ...presence, cursor: null } : null);\n }\n\n return () => {\n // Invalidate pending rAF broadcasts so stale updates don't overwrite deactivated cursors.\n cancelled = true;\n dispose?.();\n window.removeEventListener(\"pagehide\", stop);\n };\n }, [innerStore, userId, name, color, update, stop, isCursorActive]);\n}\n\n// The local cursor is active only when the window is focused and the pointer is over this tool.\nfunction useIsCursorActive(element: HTMLElement) {\n const [isFocused, setIsFocused] = useState(() => document.hasFocus());\n const [isPointerOver, setIsPointerOver] = useState(() =>\n element.matches(\":hover\")\n );\n\n useEffect(() => {\n const onFocus = () => setIsFocused(true);\n const onBlur = () => setIsFocused(false);\n const onEnter = () => setIsPointerOver(true);\n const onLeave = () => setIsPointerOver(false);\n window.addEventListener(\"focus\", onFocus);\n window.addEventListener(\"blur\", onBlur);\n element.addEventListener(\"mouseenter\", onEnter);\n element.addEventListener(\"mouseleave\", onLeave);\n return () => {\n window.removeEventListener(\"focus\", onFocus);\n window.removeEventListener(\"blur\", onBlur);\n element.removeEventListener(\"mouseenter\", onEnter);\n element.removeEventListener(\"mouseleave\", onLeave);\n };\n }, [element]);\n\n return isFocused && isPointerOver;\n}\n", "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/** Restore the built-in logger factory (mainly for tests). */\nexport function resetLoggerFactory() {\n factory = defaultFactory;\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<any>>\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(\"pruned\", () => 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", "import type { TLRecord, TLStore } from \"@tldraw/tldraw\";\nimport * as Automerge from \"@automerge/automerge/slim\";\n\n/**\n * Sync automerge doc changes into the tldraw store.\n *\n * The patches are only used to find out *which* records changed; the record\n * contents are rebuilt wholesale from the doc. Replaying patch mechanics\n * against store records would require modeling every patch shape automerge\n * can emit (nested `del`, `splice`, `conflict`, ...) and any gap silently\n * diverges the view from the doc until reload. Rebuilding from the doc makes\n * the doc the single source of truth: after every change the store record is\n * exactly what the doc says, regardless of what the patches looked like.\n * tldraw records are small, so the per-record rebuild cost is negligible.\n */\nexport function applyAutomergePatchesToTLStore(\n patches: Automerge.Patch[],\n store: TLStore,\n doc: { store: Record<string, unknown> }\n) {\n const changedIds = new Set<string>();\n for (const patch of patches) {\n if (patch.path[0] === \"store\" && patch.path.length > 1) {\n changedIds.add(`${patch.path[1]}`);\n }\n }\n\n const toRemove: TLRecord[\"id\"][] = [];\n const toPut: TLRecord[] = [];\n for (const id of changedIds) {\n const record = doc.store[id];\n if (record === undefined) {\n toRemove.push(id as TLRecord[\"id\"]);\n } else {\n toPut.push(structuredClone(record) as TLRecord);\n }\n }\n\n store.mergeRemoteChanges(() => {\n if (toRemove.length) store.remove(toRemove);\n if (toPut.length) store.put(toPut);\n });\n}\n", "import { useEffect, useState } from \"react\";\nimport { useDocument, useDocHandle } from \"@automerge/automerge-repo-react-hooks\";\nimport * as Providers from \"@inkandswitch/patchwork-providers\";\n/**\n * Generic reactive request hook. Resolves the first value a provider emits for\n * `selector` (via the one-shot `request` helper) and returns it once it\n * arrives (and whenever `element`/`selector` change). `T` is the response type.\n */\nexport function useRequest(element, selector) {\n const [value, setValue] = useState(undefined);\n const key = JSON.stringify(selector);\n useEffect(() => {\n let canceled = false;\n Providers.request(element, selector).then((v) => {\n if (canceled || v == null)\n return;\n setValue(() => v);\n });\n return () => {\n canceled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [element, key]);\n return value;\n}\nexport function useSubscribe(element, selector, initialValue) {\n const [value, setValue] = useState(initialValue);\n const key = JSON.stringify(selector);\n useEffect(() => {\n const unsubscribe = Providers.subscribe(element, selector, (v) => {\n setValue(() => v);\n });\n return unsubscribe;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [element, key]);\n return value;\n}\n/**\n * Handle-specialized subscription hook. Use when the answering provider emits\n * an `AutomergeUrl`. The handle is recovered locally from the global repo, so\n * it stays fully live. Returns `[doc, handle]` matching the shape of\n * `useDocument`; both read `undefined` until the first url arrives. `T` is the\n * doc shape inside the handle.\n */\nexport function useSubscribeDoc(element, selector) {\n const url = useSubscribe(element, selector);\n const [doc] = useDocument(url);\n const handle = useDocHandle(url);\n return [doc, handle];\n}\n", "/**\n * Open a streaming subscription. Dispatches a `patchwork:subscribe` for the\n * given `selector` carrying a fresh `MessageChannel` port; the answering\n * provider pushes values back over that channel for as long as the\n * subscription is live. `listener` is invoked once per emission (the first\n * delivery is always async because `MessagePort.postMessage` queues a task).\n *\n * The event is dispatched from the nearest enclosing `<patchwork-view>` so\n * callers can pass any node inside a provider subtree. An unclaimed\n * subscription is never settled: if no provider answers, `listener` simply\n * never fires.\n *\n * Returns an unsubscribe function. Calling it tells the provider to tear down\n * (via an `unsubscribe` message) and closes the consumer's port; any values\n * the provider emits after that are dropped.\n */\nexport function subscribe(element, selector, listener) {\n const view = element.closest(\"patchwork-view\");\n const dispatchEl = view ?? element;\n const channel = new MessageChannel();\n const port = channel.port2;\n const controller = new AbortController();\n const { signal } = controller;\n port.addEventListener(\"message\", (event) => {\n if (event.data?.type === \"change\")\n listener(event.data.value);\n }, { signal });\n // addEventListener (unlike assigning onmessage) does not implicitly start\n // the port, so message delivery has to be kicked off explicitly.\n port.start();\n const detail = {\n selector,\n port: channel.port1,\n };\n dispatchEl.dispatchEvent(new CustomEvent(\"patchwork:subscribe\", {\n detail,\n bubbles: true,\n composed: true,\n }));\n return () => {\n if (signal.aborted)\n return;\n controller.abort();\n port.postMessage({ type: \"unsubscribe\" });\n port.close();\n };\n}\n/**\n * Answer a `patchwork:subscribe`. The `producer` receives a `respond`\n * callback it can call any number of times to push values to the consumer,\n * and may return a teardown that runs when the consumer unsubscribes. Stops\n * propagation so ancestor providers don't double-answer. Values emitted after\n * the consumer unsubscribes are dropped.\n */\nexport function accept(event, producer) {\n event.stopPropagation();\n const port = event.detail.port;\n let alive = true;\n const respond = (value) => {\n if (!alive)\n return;\n port.postMessage({ type: \"change\", value });\n };\n let teardown;\n try {\n teardown = producer(respond);\n }\n catch (err) {\n console.error(\"[patchwork-providers] subscribe producer threw:\", err);\n }\n const stop = () => {\n if (!alive)\n return;\n alive = false;\n try {\n teardown?.();\n }\n catch (err) {\n console.error(\"[patchwork-providers] subscribe teardown threw:\", err);\n }\n port.close();\n };\n port.onmessage = (event) => {\n if (event.data?.type === \"unsubscribe\")\n stop();\n };\n}\n/**\n * One-shot convenience wrapper over {@link subscribe}: opens a subscription\n * for `selector`, resolves with the first value a provider emits, then\n * immediately unsubscribes. Because there is no fallback provider, an\n * unclaimed selector never resolves \u2014 use `subscribe` directly if you need to\n * handle the \"no provider\" case.\n */\nexport function request(element, selector) {\n return new Promise((resolve) => {\n const unsubscribe = subscribe(element, selector, (value) => {\n // The first emission is always async (postMessage queues a task), so\n // `unsubscribe` is assigned by the time this fires.\n unsubscribe();\n resolve(value);\n });\n });\n}\nexport { registerRepoProviderElement, } from \"./repo-provider.js\";\n", "import * as Automerge from \"@automerge/automerge/slim\";\nimport { isEqual } from \"lodash\";\nimport type { TLRecord, TLShapeId } from \"@tldraw/tldraw\";\nimport type { TLDrawDoc } from \"./datatype.ts\";\n\n// A record-level diff of the tldraw store between a baseline version and the\n// current one. Modelled on how `codemirror-base` diffs text: we view the doc\n// at the baseline heads and compare it against the live doc. The granularity\n// here is whole records (shapes) rather than text spans.\nexport type ShapeDiff = {\n added: Set<TLShapeId>;\n changed: Set<TLShapeId>;\n // Deleted shapes no longer exist in the live store, so we keep a plain\n // clone of the baseline record to re-render it as a ghost.\n deleted: TLRecord[];\n};\n\nconst isShapeId = (id: string): id is TLShapeId => id.startsWith(\"shape:\");\n\n// Compute which shapes were added / changed / deleted between the doc at\n// `headsBefore` and its current state. Only `shape:*` records are considered\n// \u2014 the store also holds `camera:`, `instance:`, `pointer:` and\n// `instance_presence:` records (presence is written live by every peer) which\n// must not show up as diffs.\nexport function diffStore(\n doc: TLDrawDoc,\n headsBefore: Automerge.Heads\n): ShapeDiff {\n const before = Automerge.view<TLDrawDoc>(doc, headsBefore);\n const beforeStore = (before.store ?? {}) as Record<string, TLRecord>;\n const afterStore = (doc.store ?? {}) as Record<string, TLRecord>;\n\n const added = new Set<TLShapeId>();\n const changed = new Set<TLShapeId>();\n const deleted: TLRecord[] = [];\n\n for (const id in afterStore) {\n if (!isShapeId(id)) continue;\n if (!(id in beforeStore)) {\n added.add(id);\n } else if (!isEqual(beforeStore[id], afterStore[id])) {\n changed.add(id);\n }\n }\n\n for (const id in beforeStore) {\n if (!isShapeId(id)) continue;\n if (!(id in afterStore)) {\n // Clone via JSON so the record survives outside the Automerge doc and\n // carries no proxies (matches how the store snapshot is loaded).\n deleted.push(JSON.parse(JSON.stringify(beforeStore[id])) as TLRecord);\n }\n }\n\n return { added, changed, deleted };\n}\n\nexport const hasDiff = (d: ShapeDiff | null | undefined): d is ShapeDiff =>\n !!d && (d.added.size > 0 || d.changed.size > 0 || d.deleted.length > 0);\n", "import { createContext, forwardRef, useContext } from \"react\";\nimport {\n DefaultShapeWrapper,\n useValue,\n type Atom,\n type TLShapeId,\n type TLShapeWrapperProps,\n} from \"@tldraw/tldraw\";\n\nexport type DiffStatus = \"added\" | \"changed\" | \"deleted\";\n\n// Per-tool atom mapping each shape id to its diff status. It lives in a tldraw\n// `atom` (not React state) so the wrapper can read it via `useValue` and only\n// the shapes whose status actually changed re-render. It reaches the wrapper\n// through context because tldraw instantiates `ShapeWrapper` internally \u2014 props\n// can't be passed to it, but context (which flows down from `<Tldraw>`) can.\nexport type DiffStatusAtom = Atom<Map<TLShapeId, DiffStatus>>;\n\nexport const DiffStatusContext = createContext<DiffStatusAtom | null>(null);\n\n// Wraps every shape's DOM and tags it with a `tl-diff-*` class so a CSS\n// `drop-shadow` glow can hug the shape outline (added / changed) or fade it out\n// (deleted ghosts). Re-uses `DefaultShapeWrapper` so all default behaviour is\n// preserved.\nexport const DiffShapeWrapper = forwardRef<HTMLDivElement, TLShapeWrapperProps>(\n function DiffShapeWrapper({ children, shape, isBackground }, ref) {\n const statusAtom = useContext(DiffStatusContext);\n const status = useValue(\n \"diff status\",\n () => statusAtom?.get().get(shape.id),\n [statusAtom, shape.id]\n );\n return (\n <DefaultShapeWrapper\n ref={ref}\n shape={shape}\n isBackground={isBackground}\n className={status ? `tl-diff-${status}` : undefined}\n >\n {children}\n </DefaultShapeWrapper>\n );\n }\n);\n", "import {\n Geometry2d,\n HTMLContainer,\n Rectangle2d,\n ShapeUtil,\n T,\n createShapeId,\n resizeBox,\n useEditor,\n useValue,\n type RecordProps,\n type TLResizeInfo,\n type TLShape,\n type TLShapeId,\n} from \"@tldraw/tldraw\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n getRegistry,\n getSupportedToolsForType,\n type DatatypeDescription,\n type LoadedDatatype,\n type LoadedTool,\n} from \"@inkandswitch/patchwork-plugins\";\nimport type { AutomergeUrl } from \"@automerge/automerge-repo/slim\";\nimport { useDocument, useRepo } from \"@automerge/react\";\nimport { automergeUrlToServiceWorkerUrl } from \"@inkandswitch/patchwork-filesystem\";\n\n// A tldraw shape that embeds another Patchwork document, rendered via the\n// host-provided `<patchwork-view>` custom element. The document reference and\n// its display metadata live in the shape props, so they persist through the\n// normal tldraw <-> Automerge sync like any other shape.\n\nexport const PATCHWORK_DOC_SHAPE_TYPE = \"patchwork-doc\" as const;\n\ndeclare module \"@tldraw/tldraw\" {\n export interface TLGlobalShapePropsMap {\n [PATCHWORK_DOC_SHAPE_TYPE]: {\n w: number;\n h: number;\n docUrl: string;\n docName: string;\n docType: string;\n toolId: string;\n };\n }\n}\n\nexport type PatchworkDocShape = TLShape<typeof PATCHWORK_DOC_SHAPE_TYPE>;\n\n// Deterministic shape id derived from the doc url, so remote peers that create\n// a shape for the same document converge on a single shape instead of dupes.\nexport function makeShapeId(docUrl: string): TLShapeId {\n return createShapeId(docUrl.replace(/[^a-zA-Z0-9]/g, \"_\"));\n}\n\nexport class PatchworkDocShapeUtil extends ShapeUtil<PatchworkDocShape> {\n static override type = PATCHWORK_DOC_SHAPE_TYPE;\n\n static override props: RecordProps<PatchworkDocShape> = {\n w: T.number,\n h: T.number,\n docUrl: T.string,\n docName: T.string,\n docType: T.string,\n toolId: T.string,\n };\n\n getDefaultProps(): PatchworkDocShape[\"props\"] {\n return {\n w: 640,\n h: 480,\n docUrl: \"\",\n docName: \"Untitled\",\n docType: \"\",\n toolId: \"\",\n };\n }\n\n getGeometry(shape: PatchworkDocShape): Geometry2d {\n return new Rectangle2d({\n width: shape.props.w,\n height: shape.props.h,\n isFilled: true,\n });\n }\n\n override canResize() {\n return true;\n }\n override canEdit() {\n return true;\n }\n override isAspectRatioLocked() {\n return false;\n }\n override hideRotateHandle() {\n return true;\n }\n\n override onResize(shape: PatchworkDocShape, info: TLResizeInfo<PatchworkDocShape>) {\n return resizeBox(shape, info);\n }\n\n component(shape: PatchworkDocShape) {\n return <PatchworkDocComponent shape={shape} />;\n }\n\n getIndicatorPath(shape: PatchworkDocShape) {\n const path = new Path2D();\n path.rect(0, 0, shape.props.w, shape.props.h);\n return path;\n }\n}\n\n// Best default tool for a datatype: prefer a tool that explicitly lists the\n// datatype over a wildcard (\"*\") tool; fall back to the first available.\nexport function getDefaultToolId(datatypeId: string): string {\n if (!datatypeId) return \"\";\n try {\n const tools = getSupportedToolsForType(datatypeId).filter(\n (t) => !(t as { unlisted?: boolean }).unlisted,\n );\n const specific = tools.find((t) => {\n const supported = (t as { supportedDatatypes?: unknown }).supportedDatatypes;\n return Array.isArray(supported) && supported.includes(datatypeId);\n });\n return (specific ?? tools[0])?.id ?? \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction useSupportedTools(docType: string): LoadedTool[] {\n return useMemo(() => {\n if (!docType) return [];\n try {\n return getSupportedToolsForType(docType).filter((t) => !(t as { unlisted?: boolean }).unlisted);\n } catch {\n return [];\n }\n }, [docType]);\n}\n\nfunction useIsImage(docUrl: string): boolean {\n const [doc] = useDocument<{ \"@patchwork\"?: { type?: string }; mimeType?: string }>(\n docUrl ? (docUrl as AutomergeUrl) : undefined,\n );\n return doc?.[\"@patchwork\"]?.type === \"file\" && !!doc?.mimeType?.startsWith(\"image/\");\n}\n\n// Fire the host event that opens the document full-screen in Patchwork. The\n// event contract lives in @inkandswitch/patchwork-elements; we dispatch it\n// directly to avoid taking a hard dependency on that (externalized) package.\nfunction openDocumentInHost(el: HTMLElement, url: string, toolId?: string) {\n el.dispatchEvent(\n new CustomEvent(\"patchwork:open-document\", {\n detail: { url, toolId: toolId || undefined },\n composed: true,\n bubbles: true,\n }),\n );\n}\n\nfunction PatchworkDocComponent({ shape }: { shape: PatchworkDocShape }) {\n const { docUrl, docName, docType, toolId } = shape.props;\n const editor = useEditor();\n const repo = useRepo();\n const isImage = useIsImage(docUrl);\n const tools = useSupportedTools(docType);\n\n const isSelectTool = useValue(\"is select tool\", () => editor.getCurrentToolId() === \"select\", [\n editor,\n ]);\n const isEditingShape = useValue(\n \"is editing shape\",\n () => editor.getEditingShapeId() === shape.id,\n [editor, shape.id],\n );\n const isFocused = isEditingShape;\n\n const [isEditingName, setIsEditingName] = useState(false);\n const [toolMenuOpen, setToolMenuOpen] = useState(false);\n const nameInputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const toolMenuRef = useRef<HTMLDivElement>(null);\n\n const currentTool = tools.find((t) => t.id === toolId) ?? tools[0];\n\n useEffect(() => {\n if (isEditingName && nameInputRef.current) {\n nameInputRef.current.focus();\n nameInputRef.current.select();\n }\n }, [isEditingName]);\n\n // Close the tool menu on outside pointerdown.\n useEffect(() => {\n if (!toolMenuOpen) return;\n const handler = (e: PointerEvent) => {\n if (toolMenuRef.current && !toolMenuRef.current.contains(e.target as Node)) {\n setToolMenuOpen(false);\n }\n };\n window.addEventListener(\"pointerdown\", handler, true);\n return () => window.removeEventListener(\"pointerdown\", handler, true);\n }, [toolMenuOpen]);\n\n // While the embedded content is focused, stop tldraw from swallowing\n // keyboard / wheel / pointer events so the inner tool stays interactive.\n useEffect(() => {\n if (!isFocused) return;\n const el = contentRef.current;\n if (!el) return;\n\n const stopKey = (e: KeyboardEvent) => e.stopPropagation();\n const stopWheel = (e: WheelEvent) => {\n if (!e.ctrlKey) e.stopPropagation();\n };\n const stopPointer = (e: PointerEvent) => e.stopPropagation();\n\n el.addEventListener(\"keydown\", stopKey);\n el.addEventListener(\"keyup\", stopKey);\n el.addEventListener(\"keypress\", stopKey);\n el.addEventListener(\"wheel\", stopWheel);\n el.addEventListener(\"pointerdown\", stopPointer, true);\n el.addEventListener(\"pointermove\", stopPointer, true);\n el.addEventListener(\"pointerup\", stopPointer, true);\n return () => {\n el.removeEventListener(\"keydown\", stopKey);\n el.removeEventListener(\"keyup\", stopKey);\n el.removeEventListener(\"keypress\", stopKey);\n el.removeEventListener(\"wheel\", stopWheel);\n el.removeEventListener(\"pointerdown\", stopPointer, true);\n el.removeEventListener(\"pointermove\", stopPointer, true);\n el.removeEventListener(\"pointerup\", stopPointer, true);\n };\n }, [isFocused]);\n\n const handleToolChange = useCallback(\n (newToolId: string) => {\n editor.updateShape({\n id: shape.id,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n props: { toolId: newToolId },\n });\n setToolMenuOpen(false);\n },\n [editor, shape.id],\n );\n\n const handleOpenDocument = useCallback(() => {\n const el = containerRef.current;\n if (!el || !docUrl) return;\n openDocumentInHost(el, docUrl, toolId || undefined);\n }, [docUrl, toolId]);\n\n const handleRename = useCallback(\n async (newName: string) => {\n const trimmed = newName.trim();\n if (!trimmed || trimmed === docName || !docUrl || !docType) {\n setIsEditingName(false);\n return;\n }\n\n try {\n const datatype = await loadDatatype(docType);\n if (datatype?.module.setTitle) {\n const childHandle = await repo.find<Record<string, unknown>>(docUrl as AutomergeUrl);\n childHandle.change((d) => {\n datatype.module.setTitle!(d, trimmed);\n });\n const childDoc = childHandle.doc();\n const canonicalName = childDoc ? datatype.module.getTitle(childDoc) : trimmed;\n editor.updateShape({\n id: shape.id,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n props: { docName: canonicalName },\n });\n } else {\n editor.updateShape({\n id: shape.id,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n props: { docName: trimmed },\n });\n }\n } catch (err) {\n console.warn(\"[tldraw5] rename failed\", err);\n }\n\n setIsEditingName(false);\n },\n [editor, shape.id, docName, docUrl, docType, repo],\n );\n\n return (\n <HTMLContainer>\n <div\n ref={containerRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n border: \"1px solid var(--color-panel-contrast, #e5e7eb)\",\n borderRadius: \"8px\",\n background: \"var(--color-panel, #ffffff)\",\n boxShadow: \"0 1px 4px rgba(0,0,0,0.10)\",\n pointerEvents: \"all\",\n }}\n >\n {/* Titlebar */}\n <div\n onPointerDown={() => {\n if (isEditingShape) editor.setEditingShape(null);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n height: \"30px\",\n padding: \"0 6px\",\n borderBottom: \"1px solid var(--color-divider, #e5e7eb)\",\n flexShrink: 0,\n cursor: \"grab\",\n userSelect: \"none\",\n background: \"var(--color-low, #fafafa)\",\n }}\n >\n {/* Open button */}\n <button\n type=\"button\"\n title=\"Open document\"\n onClick={(e) => {\n e.stopPropagation();\n handleOpenDocument();\n }}\n onPointerDown={(e) => e.stopPropagation()}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"20px\",\n height: \"20px\",\n border: \"none\",\n borderRadius: \"4px\",\n background: \"transparent\",\n cursor: \"pointer\",\n color: \"var(--color-text, #374151)\",\n flexShrink: 0,\n }}\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M6 3H3.5A1.5 1.5 0 0 0 2 4.5v8A1.5 1.5 0 0 0 3.5 14h8a1.5 1.5 0 0 0 1.5-1.5V10M9 3h4v4M13 3 7 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {/* Doc name */}\n <div style={{ flex: 1, minWidth: 0 }}>\n {isEditingName ? (\n <input\n ref={nameInputRef}\n defaultValue={docName}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\") handleRename((e.target as HTMLInputElement).value);\n if (e.key === \"Escape\") setIsEditingName(false);\n }}\n onBlur={(e) => handleRename(e.target.value)}\n style={{\n width: \"100%\",\n fontSize: \"13px\",\n fontWeight: 600,\n fontFamily: \"inherit\",\n color: \"var(--color-text, #111827)\",\n background: \"var(--color-panel, #fff)\",\n border: \"1px solid var(--color-selected, #2f80ed)\",\n borderRadius: \"4px\",\n padding: \"1px 4px\",\n outline: \"none\",\n boxSizing: \"border-box\",\n }}\n />\n ) : (\n <span\n onPointerDown={(e) => {\n // Let a plain click start rename without dragging the shape.\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n setIsEditingName(true);\n }}\n title={docName}\n style={{\n display: \"block\",\n fontSize: \"13px\",\n fontWeight: 600,\n color: \"var(--color-text, #111827)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n cursor: \"text\",\n }}\n >\n {docName || \"Untitled\"}\n </span>\n )}\n </div>\n\n {/* Tool picker */}\n {currentTool && (\n <div ref={toolMenuRef} style={{ position: \"relative\", flexShrink: 0 }}>\n <button\n type=\"button\"\n title=\"Choose view\"\n onClick={(e) => {\n e.stopPropagation();\n if (tools.length > 1) setToolMenuOpen((v) => !v);\n }}\n onPointerDown={(e) => e.stopPropagation()}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n maxWidth: \"140px\",\n padding: \"2px 8px\",\n border: \"1px solid var(--color-divider, #e5e7eb)\",\n borderRadius: \"9999px\",\n background: \"var(--color-panel, #fff)\",\n cursor: tools.length > 1 ? \"pointer\" : \"default\",\n fontSize: \"11px\",\n fontWeight: 500,\n color: \"var(--color-text-1, #4b5563)\",\n whiteSpace: \"nowrap\",\n }}\n >\n <span\n style={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}\n >\n {currentTool.name}\n </span>\n {tools.length > 1 && (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" style={{ opacity: 0.6 }}>\n <path\n d=\"M1 2.5 4 5.5 7 2.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n\n {toolMenuOpen && tools.length > 1 && (\n <div\n onPointerDown={(e) => e.stopPropagation()}\n style={{\n position: \"absolute\",\n top: \"100%\",\n right: 0,\n marginTop: \"4px\",\n background: \"var(--color-panel, #fff)\",\n border: \"1px solid var(--color-divider, #e5e7eb)\",\n borderRadius: \"6px\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.12)\",\n padding: \"4px\",\n minWidth: \"140px\",\n zIndex: 10000,\n }}\n >\n {tools.map((t) => (\n <button\n key={t.id}\n type=\"button\"\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handleToolChange(t.id);\n }}\n style={{\n display: \"block\",\n width: \"100%\",\n padding: \"5px 10px\",\n border: \"none\",\n borderRadius: \"4px\",\n background: t.id === currentTool.id ? \"var(--color-selected, #e8f0fe)\" : \"transparent\",\n cursor: \"pointer\",\n fontSize: \"12px\",\n color: \"var(--color-text, #374151)\",\n textAlign: \"left\",\n whiteSpace: \"nowrap\",\n }}\n >\n {t.name}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Content */}\n <div\n ref={contentRef}\n style={{\n flex: 1,\n minHeight: 0,\n overflow: \"hidden\",\n position: \"relative\",\n pointerEvents: isSelectTool ? \"auto\" : \"none\",\n userSelect: isFocused ? \"text\" : \"none\",\n cursor: isFocused ? \"auto\" : undefined,\n }}\n onPointerDown={\n isSelectTool\n ? (e) => {\n e.stopPropagation();\n if (!isEditingShape) editor.setEditingShape(shape.id);\n }\n : undefined\n }\n onPointerUp={\n isSelectTool\n ? (e) => {\n e.stopPropagation();\n // Synthesize a click for frameworks that rely on\n // document-level event delegation (e.g. Solid.js); tldraw's\n // preventDefault on pointerdown suppresses the native click.\n (e.target as HTMLElement)?.dispatchEvent(\n new MouseEvent(\"click\", {\n bubbles: true,\n cancelable: true,\n view: window,\n clientX: e.clientX,\n clientY: e.clientY,\n }),\n );\n }\n : undefined\n }\n >\n {docUrl && isImage ? (\n <img\n src={automergeUrlToServiceWorkerUrl(docUrl as AutomergeUrl)}\n alt={docName}\n style={{ width: \"100%\", height: \"100%\", objectFit: \"contain\" }}\n />\n ) : docUrl ? (\n // @ts-expect-error Custom element from @inkandswitch/patchwork-elements\n <patchwork-view\n doc-url={docUrl}\n {...(toolId ? { \"tool-id\": toolId } : {})}\n key={toolId || \"default\"}\n style={{ display: \"block\", width: \"100%\", height: \"100%\" }}\n />\n ) : (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n color: \"var(--color-text-3, #9ca3af)\",\n fontSize: \"12px\",\n }}\n >\n No document\n </div>\n )}\n </div>\n </div>\n </HTMLContainer>\n );\n}\n\nasync function loadDatatype(id: string): Promise<LoadedDatatype | undefined> {\n try {\n const registry = getRegistry<DatatypeDescription>(\"patchwork:datatype\");\n return (await registry.load(id)) as unknown as LoadedDatatype | undefined;\n } catch {\n return undefined;\n }\n}\n", "/**\n * NewDocTool \u2014 a tldraw tool that lets the user draw a box to create a new\n * embedded Patchwork document of a chosen datatype.\n *\n * Exports:\n * - NewDocShapeTool \u2014 pass to Tldraw `tools`\n * - newDocUiOverrides \u2014 spread into Tldraw `overrides`\n * - NewDocToolbar \u2014 pass as Tldraw `components.Toolbar`\n * - setNewDocToolContext() \u2014 call once per editor when it's ready\n */\n\nimport {\n DefaultToolbar,\n DefaultToolbarContent,\n StateNode,\n createShapeId,\n useEditor,\n useValue,\n type Editor,\n type TLPointerEventInfo,\n type TLUiOverrides,\n type TLUiToolsContextType,\n} from \"@tldraw/tldraw\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { Repo } from \"@automerge/automerge-repo/slim\";\nimport {\n createDocOfDatatype2,\n getRegistry,\n type DatatypeDescription,\n type LoadedDatatype,\n} from \"@inkandswitch/patchwork-plugins\";\nimport { PATCHWORK_DOC_SHAPE_TYPE, makeShapeId } from \"./PatchworkDocShape.tsx\";\n\n// Per-editor context, keyed by editor instance, so a nested canvas embedded in\n// another canvas doesn't clobber the outer one's repo reference.\ninterface NewDocContext {\n repo: Repo;\n}\n\nconst _contextByEditor = new WeakMap<Editor, NewDocContext>();\nlet _selectedDatatypeId = \"\";\n\nexport function setNewDocToolContext(repo: Repo, editor: Editor) {\n _contextByEditor.set(editor, { repo });\n}\n\nexport function setSelectedDatatypeId(id: string) {\n _selectedDatatypeId = id;\n}\n\nfunction getListedDatatypeDescriptions(): DatatypeDescription[] {\n try {\n const registry = getRegistry<DatatypeDescription>(\"patchwork:datatype\");\n return registry.filter((d) => !(d as DatatypeDescription).unlisted) as unknown as DatatypeDescription[];\n } catch {\n return [];\n }\n}\n\nasync function loadDatatype(id: string): Promise<LoadedDatatype | undefined> {\n try {\n const registry = getRegistry<DatatypeDescription>(\"patchwork:datatype\");\n return (await registry.load(id)) as unknown as LoadedDatatype | undefined;\n } catch {\n return undefined;\n }\n}\n\nexport class NewDocShapeTool extends StateNode {\n static override id = \"new-doc\";\n\n private startPoint = { x: 0, y: 0 };\n private previewId: ReturnType<typeof createShapeId> | null = null;\n\n override onPointerDown(_info: TLPointerEventInfo) {\n const { currentPagePoint } = this.editor.inputs;\n this.startPoint = { x: currentPagePoint.x, y: currentPagePoint.y };\n\n this.previewId = createShapeId();\n this.editor.createShape({\n id: this.previewId,\n type: \"geo\",\n x: currentPagePoint.x,\n y: currentPagePoint.y,\n parentId: this.editor.getCurrentPageId(),\n props: { w: 1, h: 1, geo: \"rectangle\", dash: \"dashed\", fill: \"none\" },\n });\n }\n\n override onPointerMove(_info: TLPointerEventInfo) {\n if (!this.previewId) return;\n const { currentPagePoint } = this.editor.inputs;\n const x = Math.min(this.startPoint.x, currentPagePoint.x);\n const y = Math.min(this.startPoint.y, currentPagePoint.y);\n const w = Math.max(1, Math.abs(currentPagePoint.x - this.startPoint.x));\n const h = Math.max(1, Math.abs(currentPagePoint.y - this.startPoint.y));\n this.editor.updateShape({ id: this.previewId, type: \"geo\", x, y, props: { w, h } });\n }\n\n override onCancel() {\n this.cleanup();\n this.editor.setCurrentTool(\"select\");\n }\n\n override onInterrupt() {\n this.cleanup();\n }\n\n private cleanup() {\n if (this.previewId) {\n if (this.editor.getShape(this.previewId)) {\n this.editor.deleteShapes([this.previewId]);\n }\n this.previewId = null;\n }\n }\n\n override onPointerUp(_info: TLPointerEventInfo) {\n if (!this.previewId) return;\n\n const preview = this.editor.getShape(this.previewId);\n this.editor.deleteShapes([this.previewId]);\n this.previewId = null;\n\n if (!preview) {\n this.editor.setCurrentTool(\"select\");\n return;\n }\n\n const px = (preview as { x: number }).x;\n const py = (preview as { y: number }).y;\n const pw = (preview as { props: { w: number } }).props.w;\n const ph = (preview as { props: { h: number } }).props.h;\n\n const finalW = Math.max(pw, 240);\n const finalH = Math.max(ph, 180);\n\n const ctx = _contextByEditor.get(this.editor);\n if (!ctx) {\n console.warn(\"[tldraw5] NewDocTool: context not set for this editor\");\n this.editor.setCurrentTool(\"select\");\n return;\n }\n\n const datatypeId = _selectedDatatypeId;\n if (!datatypeId) {\n console.warn(\"[tldraw5] NewDocTool: no datatype selected\");\n this.editor.setCurrentTool(\"select\");\n return;\n }\n\n const editor = this.editor;\n const repo = ctx.repo;\n const placeholderId = createShapeId();\n\n editor.createShape({\n id: placeholderId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n x: px,\n y: py,\n rotation: 0,\n parentId: editor.getCurrentPageId(),\n props: {\n w: finalW,\n h: finalH,\n docUrl: \"\",\n docName: \"Creating\\u2026\",\n docType: datatypeId,\n toolId: \"\",\n },\n });\n\n editor.setCurrentTool(\"select\");\n editor.setSelectedShapes([placeholderId]);\n\n void (async () => {\n try {\n const datatype = await loadDatatype(datatypeId);\n if (!datatype) throw new Error(`Could not load datatype: ${datatypeId}`);\n\n // `createDocOfDatatype2` in the installed plugins package is typed\n // against an older @automerge/automerge-repo Repo; cast to bridge the\n // version skew (same pattern used by the space / llm-canvas tools).\n const docHandle = await (\n createDocOfDatatype2 as (d: LoadedDatatype, r: unknown) => Promise<{ url: string }>\n )(datatype, repo);\n const docUrl = docHandle.url;\n const deterministicId = makeShapeId(docUrl);\n\n const tempShape = editor.getShape(placeholderId) as\n | { x: number; y: number; props: { w: number; h: number } }\n | undefined;\n const sx = tempShape?.x ?? px;\n const sy = tempShape?.y ?? py;\n const sw = tempShape?.props?.w ?? finalW;\n const sh = tempShape?.props?.h ?? finalH;\n\n if (editor.getShape(placeholderId)) {\n editor.deleteShapes([placeholderId]);\n }\n\n if (editor.getShape(deterministicId)) {\n editor.updateShape({\n id: deterministicId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n props: {\n docUrl,\n docName: datatype.name ?? datatypeId,\n docType: datatypeId,\n toolId: \"\",\n },\n });\n } else {\n editor.createShape({\n id: deterministicId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n x: sx,\n y: sy,\n rotation: 0,\n parentId: editor.getCurrentPageId(),\n props: {\n w: sw,\n h: sh,\n docUrl,\n docName: datatype.name ?? datatypeId,\n docType: datatypeId,\n toolId: \"\",\n },\n });\n }\n\n editor.setSelectedShapes([deterministicId]);\n } catch (err) {\n console.error(\"[tldraw5] new doc creation failed:\", err);\n if (editor.getShape(placeholderId)) {\n editor.updateShape({\n id: placeholderId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n props: { docName: `Error creating ${datatypeId}` },\n });\n }\n }\n })();\n }\n}\n\nexport const newDocUiOverrides: TLUiOverrides = {\n tools(editor: Editor, tools: TLUiToolsContextType) {\n tools[\"new-doc\"] = {\n id: \"new-doc\",\n icon: \"plus\",\n label: \"New document\",\n kbd: \"c\",\n onSelect() {\n editor.setCurrentTool(\"new-doc\");\n },\n };\n return tools;\n },\n};\n\nexport function NewDocToolbar() {\n const editor = useEditor();\n const isActive = useValue(\"new-doc active\", () => editor.getCurrentToolId() === \"new-doc\", [\n editor,\n ]);\n\n const [datatypes, setDatatypes] = useState<DatatypeDescription[]>([]);\n const [menuOpen, setMenuOpen] = useState(false);\n const [selectedId, setSelectedId] = useState(_selectedDatatypeId);\n const [menuPos, setMenuPos] = useState<{ x: number; y: number } | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const dt = getListedDatatypeDescriptions();\n setDatatypes(dt);\n if (dt.length > 0 && !_selectedDatatypeId) {\n setSelectedDatatypeId(dt[0].id);\n setSelectedId(dt[0].id);\n }\n }, []);\n\n useEffect(() => {\n if (!menuOpen) return;\n const handler = (e: PointerEvent) => {\n const t = e.target as Node;\n if (buttonRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n setMenuOpen(false);\n };\n document.addEventListener(\"pointerdown\", handler, true);\n return () => document.removeEventListener(\"pointerdown\", handler, true);\n }, [menuOpen]);\n\n const openMenu = useCallback(() => {\n if (buttonRef.current) {\n const rect = buttonRef.current.getBoundingClientRect();\n setMenuPos({ x: rect.left + rect.width / 2, y: rect.top });\n }\n setDatatypes(getListedDatatypeDescriptions());\n setMenuOpen(true);\n }, []);\n\n const handlePlusClick = useCallback(() => {\n if (datatypes.length > 0 && !_selectedDatatypeId) {\n setSelectedDatatypeId(datatypes[0].id);\n setSelectedId(datatypes[0].id);\n }\n editor.setCurrentTool(\"new-doc\");\n if (datatypes.length > 1) {\n if (menuOpen) setMenuOpen(false);\n else requestAnimationFrame(openMenu);\n }\n }, [datatypes, editor, menuOpen, openMenu]);\n\n const handlePick = useCallback(\n (id: string) => {\n setSelectedDatatypeId(id);\n setSelectedId(id);\n setMenuOpen(false);\n editor.setCurrentTool(\"new-doc\");\n },\n [editor],\n );\n\n if (datatypes.length === 0) {\n return (\n <DefaultToolbar>\n <DefaultToolbarContent />\n </DefaultToolbar>\n );\n }\n\n const selectedName = datatypes.find((d) => d.id === selectedId)?.name ?? \"document\";\n\n return (\n <DefaultToolbar>\n <DefaultToolbarContent />\n\n <div style={{ width: \"1px\", height: \"20px\", background: \"#ddd\", margin: \"0 4px\", flexShrink: 0 }} />\n\n <div\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={handlePlusClick}\n title={`New document (${selectedName})`}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"32px\",\n height: \"32px\",\n border: \"none\",\n borderRadius: \"6px\",\n background: isActive || menuOpen ? \"var(--color-selected, #e8f0fe)\" : \"transparent\",\n cursor: \"pointer\",\n color: isActive || menuOpen ? \"var(--color-selected-contrast, #2f80ed)\" : \"currentColor\",\n flexShrink: 0,\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 2v12M2 8h12\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" />\n </svg>\n </button>\n\n {menuOpen &&\n menuPos &&\n datatypes.length > 1 &&\n createPortal(\n <div\n ref={menuRef}\n style={{\n position: \"fixed\",\n left: menuPos.x,\n top: menuPos.y,\n transform: \"translate(-50%, -100%)\",\n marginTop: \"-8px\",\n background: \"#fff\",\n border: \"1px solid #ddd\",\n borderRadius: \"8px\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.12)\",\n padding: \"4px\",\n minWidth: \"160px\",\n zIndex: 100000,\n }}\n >\n {datatypes.map((dt) => (\n <button\n key={dt.id}\n type=\"button\"\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handlePick(dt.id);\n }}\n style={{\n display: \"block\",\n width: \"100%\",\n padding: \"6px 10px\",\n border: \"none\",\n borderRadius: \"4px\",\n background: dt.id === selectedId ? \"#e8f0fe\" : \"transparent\",\n cursor: \"pointer\",\n fontSize: \"13px\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#333\",\n textAlign: \"left\",\n whiteSpace: \"nowrap\",\n }}\n >\n {dt.name}\n </button>\n ))}\n </div>,\n document.body,\n )}\n </div>\n </DefaultToolbar>\n );\n}\n", "/**\n * Patchwork drag-and-drop payload parsing.\n *\n * Patchwork document drags (from the folder-tree-view / sideboard and most\n * tools) carry these DataTransfer formats:\n * - `text/x-patchwork-urls` \u2014 JSON `AutomergeUrl[]` (the detection hook)\n * - `text/x-patchwork-dnd` \u2014 JSON `{ source, items: [{ id, url, type, name }] }`\n * - `text/uri-list` / `text/plain` \u2014 one Patchwork web link per line\n *\n * Only `text/x-patchwork-urls` is guaranteed; the richer `-dnd` payload, when\n * present, gives us the datatype id and display name without a repo lookup.\n */\n\nimport {\n isValidAutomergeUrl,\n parseAutomergeUrl,\n stringifyAutomergeUrl,\n type AutomergeUrl,\n type DocumentId,\n} from \"@automerge/automerge-repo/slim\";\n\nexport const PATCHWORK_URLS_MIME = \"text/x-patchwork-urls\" as const;\nexport const PATCHWORK_DND_MIME = \"text/x-patchwork-dnd\" as const;\n\nexport interface DroppedDoc {\n url: AutomergeUrl;\n /** Datatype id (from the `-dnd` payload), if known. */\n type?: string;\n /** Display name (from the `-dnd` payload), if known. */\n name?: string;\n}\n\n/** True when the drag carries Patchwork document URLs. */\nexport function isPatchworkDrag(types: readonly string[]): boolean {\n return types.includes(PATCHWORK_URLS_MIME);\n}\n\ntype DndItem = { url?: unknown; type?: unknown; name?: unknown };\ntype DndPayload = { items?: DndItem[] };\n\n/** Extract the dropped documents, preferring the richest payload available. */\nexport function parseDroppedDocs(dt: DataTransfer | null): DroppedDoc[] {\n if (!dt) return [];\n\n // 1. Structured payload with datatype + name.\n const dnd = dt.getData(PATCHWORK_DND_MIME);\n if (dnd) {\n try {\n const parsed = JSON.parse(dnd) as DndPayload;\n const items = (parsed.items ?? [])\n .map((it): DroppedDoc | null => {\n const url = typeof it.url === \"string\" ? it.url : undefined;\n if (!url || !isValidAutomergeUrl(url)) return null;\n return {\n url,\n type: typeof it.type === \"string\" ? it.type : undefined,\n name: typeof it.name === \"string\" ? it.name : undefined,\n };\n })\n .filter((it): it is DroppedDoc => it !== null);\n if (items.length > 0) return dedupe(items);\n } catch {\n // fall through\n }\n }\n\n // 2. Bare URL list.\n const urls = dt.getData(PATCHWORK_URLS_MIME);\n if (urls) {\n try {\n const parsed: unknown = JSON.parse(urls);\n const items = (Array.isArray(parsed) ? parsed : [])\n .filter((u): u is AutomergeUrl => typeof u === \"string\" && isValidAutomergeUrl(u))\n .map((url) => ({ url }));\n if (items.length > 0) return dedupe(items);\n } catch {\n // fall through\n }\n }\n\n // 3. Plain-text / uri-list fallback (external links, \"#doc=<id>\" form).\n const text = dt.getData(\"text/uri-list\") || dt.getData(\"text/plain\");\n if (text) {\n const items = text\n .split(/\\r?\\n/)\n .map(urlFromText)\n .filter((url): url is AutomergeUrl => url !== null)\n .map((url) => ({ url }));\n if (items.length > 0) return dedupe(items);\n }\n\n return [];\n}\n\nfunction dedupe(items: DroppedDoc[]): DroppedDoc[] {\n const seen = new Set<string>();\n const out: DroppedDoc[] = [];\n for (const it of items) {\n if (seen.has(it.url)) continue;\n seen.add(it.url);\n out.push(it);\n }\n return out;\n}\n\n// Accept `automerge:\u2026` directly, or a Patchwork web link containing\n// `#doc=<documentId>` / `?doc=<documentId>`.\nfunction urlFromText(line: string): AutomergeUrl | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) return null;\n if (isValidAutomergeUrl(trimmed)) return trimmed;\n\n const match = trimmed.match(/[#?&]doc=([^&\\s]+)/);\n if (match) {\n const raw = decodeURIComponent(match[1]);\n if (isValidAutomergeUrl(raw)) return raw;\n try {\n const url = stringifyAutomergeUrl({ documentId: raw as DocumentId });\n // Round-trip to reject malformed ids.\n parseAutomergeUrl(url);\n return url;\n } catch {\n return null;\n }\n }\n return null;\n}\n", "// A tldraw4 document opened in this tool is offered a one-way migration to\n// tldraw5. The migration runs tldraw's own schema migrations by loading the\n// stored snapshot into a v5 store, then writes the migrated records back and\n// retypes the document.\n//\n// It has to be offered rather than done implicitly: mounting a v5 store on a v4\n// document migrates the records in memory, and the store->Automerge sync would\n// then write them back the moment anything moved. The gate in `tool.tsx` runs\n// before that store exists.\n\nimport { useState } from \"react\";\nimport { createTLStore, defaultShapeUtils } from \"@tldraw/tldraw\";\nimport {\n getRegistry,\n type DatatypeDescription,\n} from \"@inkandswitch/patchwork-plugins\";\nimport type { DocHandle } from \"@automerge/react\";\n\nimport type { TLDrawDoc } from \"./datatype.ts\";\nimport { PatchworkDocShapeUtil } from \"./PatchworkDocShape.tsx\";\n\nexport const TLDRAW4_TYPE = \"tldraw4\";\nexport const TLDRAW5_TYPE = \"tldraw5\";\n\ntype PatchworkMeta = {\n \"@patchwork\"?: { type?: string; suggestedImportUrl?: string };\n};\n\nexport function getDocType(doc: unknown): string | undefined {\n return (doc as PatchworkMeta | undefined)?.[\"@patchwork\"]?.type;\n}\n\nfunction tldraw5ImportUrl(): string | undefined {\n try {\n const registry = getRegistry<DatatypeDescription>(\"patchwork:datatype\");\n return registry.get(TLDRAW5_TYPE)?.importUrl;\n } catch {\n return undefined;\n }\n}\n\nexport function migrateToTldraw5(handle: DocHandle<TLDrawDoc>) {\n const doc = handle.doc();\n if (!doc) throw new Error(\"document not loaded\");\n\n const store = createTLStore({\n shapeUtils: [...defaultShapeUtils, PatchworkDocShapeUtil],\n });\n store.loadStoreSnapshot({\n store: JSON.parse(JSON.stringify(doc.store)),\n schema: JSON.parse(JSON.stringify(doc.schema)),\n });\n\n // Through JSON so the snapshot carries no `undefined`, which Automerge\n // refuses to store.\n const snapshot = JSON.parse(\n JSON.stringify(store.getStoreSnapshot())\n ) as TLDrawDoc;\n const importUrl = tldraw5ImportUrl();\n\n handle.change((d) => {\n d.store = snapshot.store;\n d.schema = snapshot.schema;\n const meta = (d as TLDrawDoc & PatchworkMeta)[\"@patchwork\"];\n if (meta) {\n meta.type = TLDRAW5_TYPE;\n if (importUrl) meta.suggestedImportUrl = importUrl;\n }\n });\n}\n\nexport function MigratePrompt({\n handle,\n readOnly,\n}: {\n handle: DocHandle<TLDrawDoc>;\n readOnly: boolean;\n}) {\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n\n const onMigrate = () => {\n setBusy(true);\n setError(null);\n try {\n migrateToTldraw5(handle);\n } catch (err) {\n console.error(\"[tldraw5] migration failed\", err);\n setError(String(err));\n setBusy(false);\n }\n };\n\n return (\n <div className=\"tldraw5-migrate\">\n <h2>This is a tldraw 4 document</h2>\n <p>\n Migrating rewrites its shapes to the tldraw 5 schema and retypes the\n document, so the tldraw 4 tool will no longer open it. Anyone else with\n this document is affected too.\n </p>\n <p>\n <strong>There is no undo for this</strong> \u2014 copy the document first if\n you want to keep a tldraw 4 version.\n </p>\n {readOnly ? (\n <p data-note>\n This view is pinned to a point in history and can't be written to.\n Open the document at its latest version to migrate it.\n </p>\n ) : (\n <button type=\"button\" onClick={onMigrate} disabled={busy}>\n {busy ? \"Migrating\u2026\" : \"Migrate to tldraw 5\"}\n </button>\n )}\n {error && <p data-error>{error}</p>}\n </div>\n );\n}\n", "// tldraw wants an explicit \"light\" | \"dark\". Take it from the CSS context\n// rather than from the OS: Patchwork themes declare `color-scheme`, and that\n// property inherits, so its computed value on our element is whatever the\n// closest theme says. A theme that names both (`light dark`) or names nothing\n// is deferring to the OS, so we do too.\n\nimport { useEffect, useState } from \"react\";\n\nexport type ColorScheme = \"light\" | \"dark\";\n\nfunction prefersDark() {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n}\n\nexport function resolveColorScheme(element: HTMLElement): ColorScheme {\n const scheme = getComputedStyle(element).colorScheme;\n const dark = /\\bdark\\b/.test(scheme);\n const light = /\\blight\\b/.test(scheme);\n if (dark && !light) return \"dark\";\n if (light && !dark) return \"light\";\n return prefersDark() ? \"dark\" : \"light\";\n}\n\nexport function useColorScheme(element: HTMLElement): ColorScheme {\n const [scheme, setScheme] = useState<ColorScheme>(() =>\n resolveColorScheme(element)\n );\n\n useEffect(() => {\n const update = () => setScheme(resolveColorScheme(element));\n update();\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n media.addEventListener(\"change\", update);\n\n // Switching themes swaps stylesheets and sets an attribute on <html>;\n // neither fires an event, so watch for both.\n const observer = new MutationObserver(update);\n observer.observe(document.documentElement, { attributes: true });\n observer.observe(document.head, { childList: true, subtree: true });\n\n return () => {\n media.removeEventListener(\"change\", update);\n observer.disconnect();\n };\n }, [element]);\n\n return scheme;\n}\n", "// Import/export of `.tldraw` archives (the offline.tldraw.com format).\n//\n// Import creates a new Patchwork tldraw5 document from the archive; export\n// writes the current document back out as an archive.\n\nimport { createContext, useContext, type FC, type ReactNode } from \"react\";\nimport { useRepo, type DocHandle, type Repo } from \"@automerge/react\";\nimport {\n DefaultMainMenu,\n DefaultMainMenuContent,\n TldrawUiMenuGroup,\n TldrawUiMenuItem,\n useToasts,\n type TLRecord,\n type SerializedStore,\n} from \"@tldraw/tldraw\";\nimport {\n createDocOfDatatype2,\n getRegistry,\n type DatatypeDescription,\n type LoadedDatatype,\n} from \"@inkandswitch/patchwork-plugins\";\n\nimport type { TLDrawDoc } from \"./datatype.ts\";\nimport { getTitle } from \"./datatype.ts\";\nimport { PATCHWORK_DOC_SHAPE_TYPE } from \"./PatchworkDocShape.tsx\";\n\n// `tldr-archive` pulls in the SQLite wasm build, so it is only fetched when\n// the user actually imports or exports.\nconst archiveModule = () => import(\"./tldr-archive.ts\");\n\nexport const ARCHIVE_EXTENSIONS = [\".tldraw\", \".tldr\"];\nconst SCRIPT_ENTRY = \"main.js\";\n\nexport function isTldrArchiveFile(file: File) {\n const name = file.name.toLowerCase();\n return ARCHIVE_EXTENSIONS.some((ext) => name.endsWith(ext));\n}\n\n/** Creates a new Patchwork document from a `.tldraw` archive, returning its url. */\nexport async function importArchiveFile(\n file: File,\n repo: Repo\n): Promise<string> {\n const bytes = new Uint8Array(await file.arrayBuffer());\n const { readTldrArchive } = await archiveModule();\n const archive = await readTldrArchive(bytes, baseName(file.name));\n\n const { extractScriptFiles, storeScriptFiles } = await import(\"./script.ts\");\n const docs = await storeScriptFiles(repo, extractScriptFiles(archive.files));\n\n const pageId = Object.keys(archive.store).find((id) => id.startsWith(\"page:\"));\n if (pageId) {\n (archive.store as Record<string, { name: string }>)[pageId].name =\n archive.displayName;\n }\n\n const registry = getRegistry<DatatypeDescription>(\"patchwork:datatype\");\n const datatype = (await registry.load(\"tldraw5\")) as unknown as\n | LoadedDatatype\n | undefined;\n if (!datatype) throw new Error(\"could not load the tldraw5 datatype\");\n\n // `createDocOfDatatype2` in the installed plugins package is typed against an\n // older @automerge/automerge-repo Repo; cast to bridge the version skew.\n const handle = await (\n createDocOfDatatype2 as (\n d: LoadedDatatype,\n r: unknown,\n change: (doc: TLDrawDoc) => void\n ) => Promise<{ url: string }>\n )(datatype, repo, (doc) => {\n doc.store = archive.store;\n doc.schema = archive.schema;\n doc.docs = docs;\n });\n\n return handle.url;\n}\n\nfunction baseName(fileName: string) {\n for (const ext of ARCHIVE_EXTENSIONS) {\n if (fileName.toLowerCase().endsWith(ext)) {\n return fileName.slice(0, -ext.length);\n }\n }\n return fileName;\n}\n\nexport function pickArchiveFile(): Promise<File | null> {\n return new Promise((resolve) => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = ARCHIVE_EXTENSIONS.join(\",\");\n input.style.display = \"none\";\n input.addEventListener(\"change\", () => {\n resolve(input.files?.[0] ?? null);\n input.remove();\n });\n input.addEventListener(\"cancel\", () => {\n resolve(null);\n input.remove();\n });\n document.body.append(input);\n input.click();\n });\n}\n\nfunction download(bytes: Uint8Array, fileName: string) {\n const url = URL.createObjectURL(\n new Blob([bytes as BlobPart], { type: \"application/zip\" })\n );\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = fileName;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\n// Embedded Patchwork documents have no meaning outside Patchwork, and a store\n// containing an unknown shape type fails to load in stock tldraw \u2014 so they are\n// left out of the archive.\nfunction withoutEmbeddedDocs(store: SerializedStore<TLRecord>) {\n const kept = {} as Record<string, TLRecord>;\n let dropped = 0;\n for (const [id, record] of Object.entries(store) as [string, TLRecord][]) {\n if ((record as { type?: string }).type === PATCHWORK_DOC_SHAPE_TYPE) {\n dropped++;\n continue;\n }\n kept[id] = record;\n }\n return { store: kept as SerializedStore<TLRecord>, dropped };\n}\n\nexport async function exportDoc(handle: DocHandle<TLDrawDoc>, repo: Repo) {\n const doc = handle.doc();\n if (!doc) throw new Error(\"document not loaded\");\n\n const snapshot = JSON.parse(JSON.stringify(doc)) as TLDrawDoc;\n const title = getTitle(snapshot) || \"Untitled\";\n const { store, dropped } = withoutEmbeddedDocs(snapshot.store);\n\n const scriptFiles = doc.docs?.length\n ? await (await import(\"./script.ts\")).readScriptFiles(repo, doc.docs)\n : undefined;\n\n const { writeTldrArchive } = await archiveModule();\n const bytes = await writeTldrArchive({\n displayName: title,\n store,\n schema: snapshot.schema,\n scriptFiles,\n });\n download(bytes, `${title}.tldraw`);\n return { dropped };\n}\n\n// React 18's types reject tldraw's menu-group return type; it renders fine.\nconst MenuGroup = TldrawUiMenuGroup as unknown as FC<{\n id: string;\n children?: ReactNode;\n}>;\n\nexport const TldrFileContext = createContext<{\n handle: DocHandle<TLDrawDoc>;\n element: HTMLElement;\n} | null>(null);\n\nexport function TldrFileMainMenu() {\n const context = useContext(TldrFileContext);\n const repo = useRepo();\n const { addToast } = useToasts();\n\n const onImport = async () => {\n try {\n const file = await pickArchiveFile();\n if (!file || !context) return;\n const url = await importArchiveFile(file, repo);\n context.element.dispatchEvent(\n new CustomEvent(\"patchwork:open-document\", {\n detail: { url, toolId: \"tldraw5\" },\n bubbles: true,\n composed: true,\n })\n );\n } catch (error) {\n console.error(\"[tldraw5] import failed\", error);\n addToast({ title: \"Import failed\", description: String(error) });\n }\n };\n\n const onExport = async () => {\n try {\n if (!context) return;\n const { dropped } = await exportDoc(context.handle, repo);\n if (dropped > 0) {\n addToast({\n title: \"Exported without embedded documents\",\n description: `${dropped} embedded Patchwork document${\n dropped === 1 ? \"\" : \"s\"\n } left out \u2014 stock tldraw can't read them.`,\n });\n }\n } catch (error) {\n console.error(\"[tldraw5] export failed\", error);\n addToast({ title: \"Export failed\", description: String(error) });\n }\n };\n\n // `main.js` may sit behind nested folder documents, so finding it is async.\n const docs = context?.handle.doc()?.docs;\n const hasScript = !!docs?.some((link) => link.name === SCRIPT_ENTRY);\n\n const onOpenScript = async () => {\n if (!context || !docs) return;\n try {\n const { resolveScriptFiles } = await import(\"./script.ts\");\n const url = (await resolveScriptFiles(repo, docs))[SCRIPT_ENTRY];\n if (!url) return;\n context.element.dispatchEvent(\n new CustomEvent(\"patchwork:open-document\", {\n detail: { url },\n bubbles: true,\n composed: true,\n })\n );\n } catch (error) {\n console.error(\"[tldraw5] could not open the script\", error);\n }\n };\n\n return (\n <DefaultMainMenu>\n <MenuGroup id=\"tldraw-archive\">\n {hasScript && (\n <TldrawUiMenuItem\n id=\"open-tldraw-script\"\n label={`Open ${SCRIPT_ENTRY}`}\n readonlyOk\n onSelect={onOpenScript}\n />\n )}\n <TldrawUiMenuItem\n id=\"import-tldraw-archive\"\n label=\"Import .tldraw file\u2026\"\n readonlyOk\n onSelect={onImport}\n />\n <TldrawUiMenuItem\n id=\"export-tldraw-archive\"\n label=\"Export .tldraw file\"\n readonlyOk\n onSelect={onExport}\n />\n </MenuGroup>\n <DefaultMainMenuContent />\n </DefaultMainMenu>\n );\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\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", "'use strict';\n\nmodule.exports = function () {\n throw new Error(\n 'ws does not work in the browser. Browser clients must use the native ' +\n 'WebSocket object'\n );\n};\n", "import type { AutomergeUrl, DocHandle } from \"@automerge/automerge-repo/slim\";\nimport { decodeHeads, type UrlHeads } from \"@automerge/automerge-repo/slim\";\nimport {\n RepoContext,\n useDocHandle,\n useDocument,\n useRepo,\n type Repo,\n} from \"@automerge/react\";\nimport {\n Tldraw,\n useEditor,\n getAssetInfo,\n atom,\n type VecLike,\n type TLContent,\n type TLAssetId,\n type TLComponents,\n type TLRecord,\n type TLShapeId,\n type TLStoreWithStatus,\n type Editor,\n type TldrawProps,\n type TLAnyShapeUtilConstructor,\n type TLAnyBindingUtilConstructor,\n defaultShapeUtils,\n defaultBindingUtils,\n defaultAssetUtils,\n defaultOverlayUtils,\n defaultTools,\n} from \"@tldraw/tldraw\";\nimport {\n useAutomergeStore,\n useAutomergePresence,\n useClearHistoryOnScopeSwap,\n useIsHandleReadOnly,\n} from \"./lith/useAutomergeStore.ts\";\nimport type { TLDrawDoc } from \"./datatype.ts\";\nimport type { DocLink } from \"@inkandswitch/patchwork-filesystem\";\nimport type { TldrawConfig } from \"./script.ts\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { UnixFileEntry } from \"@inkandswitch/patchwork-filesystem\";\nimport { automergeUrlToServiceWorkerUrl } from \"@inkandswitch/patchwork-filesystem\";\nimport { useSubscribe } from \"@inkandswitch/patchwork-providers-react\";\nimport { createRoot } from \"react-dom/client\";\nimport { diffStore, type ShapeDiff } from \"./diff.ts\";\nimport {\n DiffShapeWrapper,\n DiffStatusContext,\n type DiffStatus,\n type DiffStatusAtom,\n} from \"./DiffShapeWrapper.tsx\";\nimport {\n PatchworkDocShapeUtil,\n PATCHWORK_DOC_SHAPE_TYPE,\n getDefaultToolId,\n makeShapeId,\n} from \"./PatchworkDocShape.tsx\";\nimport {\n NewDocShapeTool,\n NewDocToolbar,\n newDocUiOverrides,\n setNewDocToolContext,\n} from \"./NewDocTool.tsx\";\nimport { isPatchworkDrag, parseDroppedDocs } from \"./dnd.ts\";\nimport { MigratePrompt, TLDRAW4_TYPE, getDocType } from \"./migrate.tsx\";\nimport { useColorScheme } from \"./color-scheme.ts\";\nimport {\n TldrFileContext,\n TldrFileMainMenu,\n importArchiveFile,\n isTldrArchiveFile,\n} from \"./file-io.tsx\";\n\n// Custom shapes / tools that let a tldraw canvas embed other Patchwork\n// documents. These must be registered both on the Automerge-backed store (so\n// the shape type persists) and on the <Tldraw> component (so it renders).\nconst customShapeUtils = [PatchworkDocShapeUtil];\nconst customTools = [NewDocShapeTool];\n\n// Diff baseline (fork-point heads) served by the draft overlay\n// (`draft:baseline`). `heads` is `null` when there is no baseline and no\n// diff is rendered (e.g. on \"main\"). It is `null` rather than optional so the\n// value is a valid structured-cloneable `JSONValue` crossing the provider\n// channel.\ntype Baseline = { heads: UrlHeads | null };\n\nconst MIME_TO_EXT: Record<string, string> = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpg\",\n \"image/gif\": \"gif\",\n \"image/webp\": \"webp\",\n \"image/svg+xml\": \"svg\",\n \"image/bmp\": \"bmp\",\n \"image/tiff\": \"tiff\",\n \"image/avif\": \"avif\",\n \"video/mp4\": \"mp4\",\n \"video/webm\": \"webm\",\n \"video/quicktime\": \"mov\",\n};\n\nfunction extensionForMimeType(mimeType: string): string {\n return MIME_TO_EXT[mimeType] || mimeType.split(\"/\")[1] || \"bin\";\n}\n\ninterface ContactDoc {\n type: string;\n name?: string;\n color?: string;\n}\n\nfunction useContactInfo() {\n const repo = useRepo();\n const [contactUrl, setContactUrl] = useState<AutomergeUrl | undefined>();\n\n useEffect(() => {\n const accountDocHandle = (window as any).accountDocHandle as\n | DocHandle<{ contactUrl: AutomergeUrl }>\n | undefined;\n if (!accountDocHandle) return;\n const doc = accountDocHandle.doc();\n if (doc?.contactUrl) {\n setContactUrl(doc.contactUrl);\n }\n }, []);\n\n const [contactDoc] = useDocument<ContactDoc>(contactUrl);\n\n return {\n // Compose userId as `${contactUrl}-${repo.peerId}` to uniquely identify a session;\n // this prevents tldraw from hiding local cursors across multiple sessions under the same account.\n userId: contactUrl ? `${contactUrl}-${repo.peerId}` : repo.peerId,\n name: contactDoc?.name ?? \"Anonymous\",\n color: contactDoc?.color,\n };\n}\n\n// Parses a userId of the form `${contactUrl}-${peerId}` to recover contactUrl and actorId.\nexport function splitPresenceUserId(userId: string): {\n contactUrl?: AutomergeUrl;\n actorId?: string;\n} {\n if (!userId.startsWith(\"automerge:\")) return { actorId: userId };\n const i = userId.indexOf(\"-\");\n if (i === -1) return { contactUrl: userId as AutomergeUrl };\n return {\n contactUrl: userId.slice(0, i) as AutomergeUrl,\n actorId: userId.slice(i + 1),\n };\n}\n\n// A tldraw4 document has to be migrated before the canvas mounts: a v5 store\n// migrates the snapshot as it loads it, and the store->Automerge sync would\n// then persist that silently. So the type is checked first, and an unmigrated\n// document gets the prompt instead of an editor.\nexport function TldrawTool({\n docUrl,\n element,\n}: {\n docUrl: AutomergeUrl;\n element: HTMLElement;\n}) {\n const handle = useDocHandle<TLDrawDoc>(docUrl, { suspense: true });\n const readOnly = useIsHandleReadOnly(handle);\n // Suspending: without it the doc is undefined on the first render, the type\n // check wouldn't match, and the canvas would mount on a tldraw4 document and\n // migrate it before this ever ran. Still reactive, so the prompt gives way to\n // the canvas as soon as a migration retypes the document.\n const [doc] = useDocument<TLDrawDoc>(docUrl, { suspense: true });\n\n if (doc && getDocType(doc) === TLDRAW4_TYPE) {\n return <MigratePrompt handle={handle} readOnly={readOnly} />;\n }\n\n return <TldrawCanvas docUrl={docUrl} element={element} />;\n}\n\n// `config.js` builds the shape utils, tools, overlays and components the canvas\n// is made of, so it has to run before anything mounts \u2014 including the Automerge\n// store, which needs the same shape utils to validate records of a script's\n// custom types. Nothing renders until it has.\nfunction TldrawCanvas({\n docUrl,\n element,\n}: {\n docUrl: AutomergeUrl;\n element: HTMLElement;\n}) {\n const repo = useRepo();\n // Suspending: a doc that's undefined on the first render would settle the\n // config as the base one \u2014 without the script's shape utils \u2014 and the store,\n // created once, would then fail to validate the script's own shape types.\n const [doc] = useDocument<TLDrawDoc>(docUrl, { suspense: true });\n const config = useScriptConfig(repo, doc?.docs);\n\n if (!config) return null;\n\n // The editor is built from the config, so a rebuilt config only takes effect\n // on a fresh editor: the version is the key that remounts it.\n return (\n <TldrawConfiguredCanvas\n key={config.version}\n docUrl={docUrl}\n element={element}\n config={config.config}\n />\n );\n}\n\nfunction baseConfig(): TldrawConfig {\n return {\n shapeUtils: [...defaultShapeUtils, ...customShapeUtils],\n bindingUtils: [...defaultBindingUtils],\n assetUtils: [...defaultAssetUtils],\n overlayUtils: [...defaultOverlayUtils],\n tools: [...defaultTools, ...customTools],\n components: {\n ShapeWrapper: DiffShapeWrapper,\n Toolbar: NewDocToolbar,\n MainMenu: TldrFileMainMenu,\n },\n options: {},\n };\n}\n\n// Re-runs `config.js` whenever the files it imports are edited, and bumps the\n// version so the canvas remounts onto the new config.\nfunction useScriptConfig(repo: Repo, docs: DocLink[] | undefined) {\n const [config, setConfig] = useState<{\n config: TldrawConfig;\n version: number;\n } | null>(null);\n // The doc object is new on every change, so key the effect on the links \u2014\n // otherwise every canvas edit would tear the watcher down and rebuild it.\n const key = docs?.length ? JSON.stringify(docs) : \"\";\n\n useEffect(() => {\n if (!key) {\n setConfig({ config: baseConfig(), version: 0 });\n return;\n }\n\n let cancelled = false;\n let unwatch: (() => void) | undefined;\n let current: {\n deps: string[];\n signature: string;\n dispose: () => void;\n } | null = null;\n const settle = (config: TldrawConfig) =>\n setConfig((previous) => ({\n config,\n version: (previous?.version ?? 0) + 1,\n }));\n\n void (async () => {\n const { watchScriptTree, runConfigScript, signatureOf } = await import(\n \"./script.ts\"\n );\n if (cancelled) return;\n\n let queue: Promise<void> = Promise.resolve();\n unwatch = watchScriptTree(repo, JSON.parse(key), (tree) => {\n queue = queue.then(async () => {\n if (cancelled) return;\n // Only the files `config.js` imports matter: editing `main.js` mustn't\n // remount the editor out from under it.\n if (\n current &&\n signatureOf(current.deps, tree.versions) === current.signature\n ) {\n return;\n }\n try {\n const result = await runConfigScript(repo, tree.files, baseConfig());\n if (cancelled) {\n result.dispose();\n return;\n }\n current?.dispose();\n current = {\n deps: result.deps,\n signature: signatureOf(result.deps, tree.versions),\n dispose: result.dispose,\n };\n settle(result.config);\n } catch (error) {\n console.error(\"[tldraw5] config script failed\", error);\n if (cancelled || current) return;\n current = { deps: [], signature: \"\", dispose: () => {} };\n settle(baseConfig());\n }\n });\n });\n })();\n\n return () => {\n cancelled = true;\n unwatch?.();\n current?.dispose();\n };\n }, [repo, key]);\n\n return config;\n}\n\nfunction TldrawConfiguredCanvas({\n docUrl,\n element,\n config,\n}: {\n docUrl: AutomergeUrl;\n element: HTMLElement;\n config: TldrawConfig;\n}) {\n const handle = useDocHandle<TLDrawDoc>(docUrl, { suspense: true });\n // A history-pinned handle (url carries heads) is at fixed heads and rejects\n // writes, so the whole tool renders read-only. Tracked live: it flips in\n // place when the handle's backing is swapped.\n const readOnly = useIsHandleReadOnly(handle);\n const contactInfo = useContactInfo();\n const colorScheme = useColorScheme(element);\n const store = useAutomergeStore({\n handle,\n userId: contactInfo.userId,\n readOnly,\n shapeUtils: config.shapeUtils as TLAnyShapeUtilConstructor[],\n bindingUtils: config.bindingUtils as TLAnyBindingUtilConstructor[],\n });\n\n useAutomergePresence({\n handle: handle as DocHandle<any>,\n store,\n userMetadata: contactInfo,\n element,\n });\n\n const baseline = useSubscribe<Baseline>(\n element,\n { type: \"draft:baseline\", url: docUrl },\n { heads: null }\n );\n const diff = useShapeDiff(handle, baseline.heads ?? undefined);\n\n // Per-tool atom feeding `DiffShapeWrapper` (read via `useValue`). Created once\n // per mount so multiple tldraw tools don't share styling state.\n const [statusAtom] = useState<DiffStatusAtom>(() =>\n atom(\"diff status\", new Map<TLShapeId, DiffStatus>())\n );\n useEffect(() => {\n statusAtom.set(buildStatusMap(diff));\n }, [diff, statusAtom]);\n\n // Deleted shapes are gone from the live store, so re-insert them as locked\n // ghosts (styled `tl-diff-deleted`). They never reach Automerge \u2014 see\n // `useDeletedGhosts`.\n useDeletedGhosts(store, handle, diff);\n\n const components = config.components as TLComponents;\n\n const fileContext = useMemo(() => ({ handle, element }), [handle, element]);\n\n return (\n <DiffStatusContext.Provider value={statusAtom}>\n <TldrFileContext.Provider value={fileContext}>\n <Tldraw\n colorScheme={colorScheme}\n autoFocus\n store={store}\n shapeUtils={config.shapeUtils as TLAnyShapeUtilConstructor[]}\n bindingUtils={config.bindingUtils as TLAnyBindingUtilConstructor[]}\n assetUtils={config.assetUtils as TldrawProps[\"assetUtils\"]}\n overlayUtils={config.overlayUtils as TldrawProps[\"overlayUtils\"]}\n tools={config.tools as TldrawProps[\"tools\"]}\n options={config.options as TldrawProps[\"options\"]}\n overrides={newDocUiOverrides}\n components={components}\n >\n <TldrawInner docUrl={docUrl} element={element} readOnly={readOnly} />\n </Tldraw>\n </TldrFileContext.Provider>\n </DiffStatusContext.Provider>\n );\n}\n\n// Recomputes the diff against `heads` on every doc change. `baseline.heads`\n// only moves when the draft is forked (copy-on-write), so without listening to\n// the handle the diff would freeze after the first computation. The bump is\n// deferred to a microtask so we never recompute synchronously from inside the\n// sync layer's own `handle.change` callback.\nfunction useShapeDiff(\n handle: DocHandle<TLDrawDoc>,\n heads: UrlHeads | undefined\n): ShapeDiff | null {\n const [tick, setTick] = useState(0);\n\n useEffect(() => {\n let scheduled = false;\n const onChange = () => {\n if (scheduled) return;\n scheduled = true;\n queueMicrotask(() => {\n scheduled = false;\n setTick((t) => t + 1);\n });\n };\n handle.on(\"change\", onChange);\n return () => {\n handle.off(\"change\", onChange);\n };\n }, [handle]);\n\n return useMemo(() => {\n if (!heads) return null;\n const doc = handle.doc();\n if (!doc) return null;\n try {\n return diffStore(doc, decodeHeads(heads));\n } catch (error) {\n console.warn(\"[tldraw5/diff] failed to compute diff\", error);\n return null;\n }\n // `tick` is intentionally a dependency: it forces recompute on doc change.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [handle, heads, tick]);\n}\n\nfunction buildStatusMap(diff: ShapeDiff | null): Map<TLShapeId, DiffStatus> {\n const map = new Map<TLShapeId, DiffStatus>();\n if (!diff) return map;\n for (const id of diff.added) map.set(id, \"added\");\n for (const id of diff.changed) map.set(id, \"changed\");\n for (const record of diff.deleted) map.set(record.id as TLShapeId, \"deleted\");\n return map;\n}\n\n// Renders deleted shapes by putting their baseline records back into the\n// *tldraw* store as locked ghosts. These are applied via `mergeRemoteChanges`\n// (source: \"remote\"), and the only TLStore->Automerge sync path listens for\n// source: \"user\" \u2014 so ghosts never sync back to the doc. `diffStore` reads the\n// Automerge doc (not the tldraw store), so ghosts also never re-enter the diff.\nfunction useDeletedGhosts(\n store: TLStoreWithStatus,\n handle: DocHandle<TLDrawDoc>,\n diff: ShapeDiff | null\n) {\n const ghostIds = useRef<Set<TLShapeId>>(new Set());\n\n useEffect(() => {\n const inner = store.store;\n if (!inner) return;\n\n const desired = new Map<TLShapeId, TLRecord>();\n if (diff) {\n for (const record of diff.deleted) {\n desired.set(record.id as TLShapeId, record);\n }\n }\n\n // A ghost is only safe to remove if it isn't currently a real record in the\n // doc: if a deleted shape was re-added upstream, the sync layer puts the\n // real record back at the same id, and removing it then would drop the real\n // shape from the view.\n const liveStore = (handle.doc()?.store ?? {}) as Record<string, unknown>;\n const toRemove = [...ghostIds.current].filter(\n (id) => !desired.has(id) && !(id in liveStore)\n );\n const toAdd: TLRecord[] = [];\n for (const [id, record] of desired) {\n if (!ghostIds.current.has(id)) {\n // Fade the ghost via tldraw's first-class `opacity` prop. tldraw writes\n // `opacity` as an inline style on the shape element (Shape.tsx), so a CSS\n // class (`.tl-diff-deleted`) can't override it \u2014 the fade has to live on\n // the record itself. The red \"removed\" glow stays in CSS as a `filter`.\n toAdd.push({ ...record, isLocked: true, opacity: 0.1 } as TLRecord);\n }\n }\n\n if (toRemove.length === 0 && toAdd.length === 0) return;\n\n inner.mergeRemoteChanges(() => {\n if (toRemove.length) inner.remove(toRemove);\n if (toAdd.length) inner.put(toAdd);\n });\n\n for (const id of toRemove) ghostIds.current.delete(id);\n for (const record of toAdd) ghostIds.current.add(record.id as TLShapeId);\n }, [store, handle, diff]);\n}\n\nfunction TldrawInner(props: {\n docUrl: AutomergeUrl;\n element: HTMLElement;\n readOnly: boolean;\n}) {\n const key = useMemo(() => `${props.docUrl}-camera`, [props.docUrl]);\n\n const editor = useEditor();\n const repo = useRepo();\n const handle = useDocHandle<TLDrawDoc>(props.docUrl, { suspense: true });\n\n usePatchworkDrop(props.element);\n useClearHistoryOnScopeSwap(handle);\n useDocumentScript(props.docUrl, editor, repo);\n\n const onChange = useCallback(() => {\n if (!editor) return;\n const camstate = editor.getCameraState();\n if (camstate == \"moving\") {\n // todo debounce?\n localStorage.setItem(key, JSON.stringify(editor.getCamera()));\n }\n }, []);\n\n useEffect(() => {\n if (!editor) return;\n\n // History-pinned views block all canvas editing (the store write-back is\n // also disabled in useAutomergeStore).\n editor.updateInstanceState({ isReadonly: props.readOnly });\n\n // Give the NewDocTool the repo it needs to create embedded documents.\n setNewDocToolContext(repo, editor);\n\n // Handle pasted/dropped files (images, videos) by storing them as\n // UnixFileEntry automerge docs and referencing them via service-worker URLs.\n editor.registerExternalAssetHandler(\"file\", async ({ file, assetId }) => {\n // Create a stable asset ID if one wasn't provided\n const id = assetId ?? (`asset:${crypto.randomUUID()}` as TLAssetId);\n\n // Read the file bytes\n const bytes = new Uint8Array(await file.arrayBuffer());\n\n // Determine extension and name\n const ext = extensionForMimeType(file.type);\n const name =\n file.name && file.name !== \"image.png\"\n ? file.name\n : `Pasted image on ${new Date().toLocaleDateString()}.${ext}`;\n\n // Create an automerge doc for the file\n const fileHandle = repo.create<UnixFileEntry>();\n fileHandle.change((doc) => {\n doc.content = bytes;\n doc.extension = ext;\n doc.mimeType = file.type;\n doc.name = name;\n });\n\n // Build the asset using tldraw's helper to get dimensions etc.\n const asset = await getAssetInfo(editor, file, id);\n if (!asset) throw new Error(`unsupported asset type: ${file.type}`);\n\n // Point the asset's src at the service-worker URL for this doc\n (asset.props as { src?: string }).src = automergeUrlToServiceWorkerUrl(\n fileHandle.url\n );\n\n return asset;\n });\n\n // Override the tldraw paste handler to avoid \"could not migrate content\"\n // errors when pasting from newer tldraw versions (e.g. tldraw.com may\n // run a canary build whose schema sequence versions are ahead of ours).\n editor.registerExternalContentHandler(\n \"tldraw\",\n ({ point, content }: { point?: VecLike; content: TLContent }) => {\n editor.run(() => {\n const selectionBoundsBefore = editor.getSelectionPageBounds();\n editor.markHistoryStoppingPoint(\"paste\");\n\n for (const shape of content.shapes) {\n if (content.rootShapeIds.includes(shape.id)) {\n shape.isLocked = false;\n }\n }\n\n // Replace the pasted content's schema with ours so that\n // migrateStoreSnapshot sees matching versions and skips migration\n // rather than failing on unknown future sequence versions.\n content.schema = editor.store.schema.serialize();\n\n editor.putContentOntoCurrentPage(content, {\n point,\n select: true,\n });\n\n const selectedBoundsAfter = editor.getSelectionPageBounds();\n if (\n selectionBoundsBefore &&\n selectedBoundsAfter &&\n selectionBoundsBefore.collides(selectedBoundsAfter)\n ) {\n editor.updateInstanceState({ isChangingStyle: true });\n }\n });\n }\n );\n\n const existing = localStorage.getItem(key);\n if (existing) {\n try {\n const cam = JSON.parse(existing);\n editor.setCamera(cam);\n } catch {\n localStorage.removeItem(key);\n }\n }\n editor.on(\"change\", onChange);\n return () => void editor.off(\"change\", onChange);\n }, [editor, props.readOnly]);\n return null;\n}\n\n// Runs the document's `script/main.js`, if it has one, on canvas mount and\n// again whenever the script's own files are edited \u2014 the running script is\n// aborted first, so an edit takes effect on the canvas immediately.\nfunction useDocumentScript(\n docUrl: AutomergeUrl,\n editor: Editor | null,\n repo: Repo\n) {\n const [doc] = useDocument<TLDrawDoc>(docUrl);\n // Keyed on the links, not the doc object: `useDocument` returns a fresh object\n // on every change, so keying on identity would abort the script's signal and\n // tear down its listeners on every stroke.\n const key = doc?.docs?.length ? JSON.stringify(doc.docs) : \"\";\n\n useEffect(() => {\n if (!editor || !key) return;\n\n let cancelled = false;\n let unwatch: (() => void) | undefined;\n let current: {\n deps: string[];\n signature: string;\n dispose: () => void;\n } | null = null;\n\n void (async () => {\n const { watchScriptTree, hasScript, runScript, signatureOf } =\n await import(\"./script.ts\");\n if (cancelled) return;\n\n let queue: Promise<void> = Promise.resolve();\n unwatch = watchScriptTree(repo, JSON.parse(key), (tree) => {\n queue = queue.then(async () => {\n if (cancelled || !hasScript(tree.files)) return;\n // Nothing the script was built from moved, so leave it running.\n if (\n current &&\n signatureOf(current.deps, tree.versions) === current.signature\n ) {\n return;\n }\n current?.dispose();\n current = null;\n try {\n const result = await runScript(repo, tree.files, editor);\n if (cancelled) {\n result.dispose();\n return;\n }\n current = {\n deps: result.deps,\n signature: signatureOf(result.deps, tree.versions),\n dispose: result.dispose,\n };\n } catch (error) {\n console.error(\"[tldraw5] document script failed\", error);\n }\n });\n });\n })();\n\n return () => {\n cancelled = true;\n unwatch?.();\n current?.dispose();\n };\n }, [editor, key, repo]);\n}\n\n// Accept documents dragged in from the folder-tree-view / sideboard and other\n// Patchwork tools, embedding each as a `patchwork-doc` shape at the drop point.\nfunction usePatchworkDrop(element: HTMLElement) {\n const editor = useEditor();\n const repo = useRepo();\n\n useEffect(() => {\n if (!editor || !element) return;\n\n // If the drop lands inside an already-embedded <patchwork-view>, let that\n // inner tool handle it instead of creating a nested embed. The outer\n // <patchwork-view> hosting this canvas appears at/after `element` in the\n // path, so we stop the walk once we reach `element`.\n const isInsideEmbeddedPatchworkView = (e: DragEvent) => {\n for (const el of e.composedPath()) {\n if (el === element) break;\n if ((el as Element).tagName?.toLowerCase() === \"patchwork-view\") return true;\n }\n return false;\n };\n\n const allowDrop = (e: DragEvent) => {\n if (e.dataTransfer && isPatchworkDrag(e.dataTransfer.types)) e.preventDefault();\n };\n\n // A dropped `.tldraw` archive becomes its own Patchwork document, embedded\n // at the drop point like any other dragged-in document.\n const handleArchiveDrop = (e: DragEvent, file: File) => {\n e.preventDefault();\n e.stopImmediatePropagation();\n\n const dropPoint = editor.screenToPage({ x: e.clientX, y: e.clientY });\n\n void (async () => {\n try {\n const url = await importArchiveFile(file, repo);\n const shapeId = makeShapeId(url);\n if (editor.getShape(shapeId)) {\n editor.select(shapeId);\n return;\n }\n editor.createShape({\n id: shapeId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n x: dropPoint.x,\n y: dropPoint.y,\n rotation: 0,\n parentId: editor.getCurrentPageId(),\n props: {\n w: 640,\n h: 480,\n docUrl: url,\n docName: file.name,\n docType: \"tldraw5\",\n toolId: \"tldraw5\",\n },\n });\n editor.setSelectedShapes([shapeId]);\n } catch (error) {\n console.error(\"[tldraw5] failed to import dropped archive\", error);\n }\n })();\n };\n\n const handleDrop = (e: DragEvent) => {\n const archive = Array.from(e.dataTransfer?.files ?? []).find(\n isTldrArchiveFile\n );\n if (archive) {\n if (isInsideEmbeddedPatchworkView(e)) return;\n handleArchiveDrop(e, archive);\n return;\n }\n\n if (!e.dataTransfer || !isPatchworkDrag(e.dataTransfer.types)) return;\n e.preventDefault();\n if (isInsideEmbeddedPatchworkView(e)) return;\n e.stopImmediatePropagation();\n\n const docs = parseDroppedDocs(e.dataTransfer);\n if (docs.length === 0) return;\n\n const dropPoint = editor.screenToPage({ x: e.clientX, y: e.clientY });\n const STAGGER = 24;\n\n docs.forEach((item, i) => {\n const shapeId = makeShapeId(item.url);\n\n // Already embedded: select it rather than creating a duplicate.\n if (editor.getShape(shapeId)) {\n editor.select(shapeId);\n return;\n }\n\n const knownType = item.type ?? \"\";\n editor.createShape({\n id: shapeId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n x: dropPoint.x + i * STAGGER,\n y: dropPoint.y + i * STAGGER,\n rotation: 0,\n parentId: editor.getCurrentPageId(),\n props: {\n w: 640,\n h: 480,\n docUrl: item.url,\n docName: item.name ?? \"Loading\\u2026\",\n docType: knownType,\n toolId: getDefaultToolId(knownType),\n },\n });\n\n // Resolve datatype/name from the doc when the drag payload didn't\n // include them (e.g. bare-URL drags).\n if (!item.type || !item.name) {\n void (async () => {\n try {\n const handle = await repo.find<{ \"@patchwork\"?: { type?: string } }>(item.url);\n const doc = handle.doc();\n const datatypeId = doc?.[\"@patchwork\"]?.type ?? knownType;\n if (!editor.getShape(shapeId)) return;\n editor.updateShape({\n id: shapeId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n props: {\n docName: item.name ?? datatypeId ?? item.url,\n docType: datatypeId,\n toolId: getDefaultToolId(datatypeId),\n },\n });\n } catch (err) {\n console.error(\"[tldraw5] failed to resolve dropped doc\", err);\n }\n })();\n }\n });\n\n editor.setSelectedShapes(docs.map((d) => makeShapeId(d.url)));\n };\n\n element.addEventListener(\"dragenter\", allowDrop, { capture: true });\n element.addEventListener(\"dragover\", allowDrop, { capture: true });\n element.addEventListener(\"drop\", handleDrop, { capture: true });\n return () => {\n element.removeEventListener(\"dragenter\", allowDrop, { capture: true });\n element.removeEventListener(\"dragover\", allowDrop, { capture: true });\n element.removeEventListener(\"drop\", handleDrop, { capture: true });\n };\n }, [editor, repo, element]);\n}\n\nexport function render(handle: any, element: any) {\n const root = createRoot(element);\n root.render(\n <RepoContext.Provider value={element.repo}>\n <TldrawTool docUrl={handle.url} element={element} />\n </RepoContext.Provider>\n );\n return () => root.unmount();\n}\n", "export * from \"@automerge/automerge-repo\"\nexport * from \"./default-exports.js\"\n", "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/** Restore the built-in logger factory (mainly for tests). */\nexport function resetLoggerFactory() {\n factory = defaultFactory;\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<any>>\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(\"pruned\", () => 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", "/**\n *\n * A `NetworkAdapter` which uses [BroadcastChannel](https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel)\n * to communicate with other peers in the same browser tab. This is a bit of a\n * hack because `NetworkAdapter`s are supposed to be used as point to\n * point communication channels. To get around this the {@link BroadcastChannelNetworkAdapter}\n * broadcasts messages to all peers and then filters out messages not intended\n * for the current peer. This is quite inefficient as messages get duplicated\n * for every peer in the tab, but as it's all local communication anyway\n * it's not too bad. If efficiency is becoming an issue you can switch to\n * `automerge-repo-network-messagechannel`.\n *\n * @module\n *\n */\n\nimport {\n makeLogger,\n NetworkAdapter,\n type Message,\n type PeerId,\n type PeerMetadata,\n} from \"@automerge/automerge-repo/slim\"\n\nconst log = makeLogger(\"automerge-repo:broadcastchannel\")\n\nexport type BroadcastChannelNetworkAdapterOptions = {\n /** BroadcastChannel name to use */\n channelName: string\n /** How long to wait for peers to arrive before declaring this adapter is ready */\n peerWaitMs?: number\n}\n\nexport class BroadcastChannelNetworkAdapter extends NetworkAdapter {\n #broadcastChannel: BroadcastChannel\n // Held on the instance so disconnect() can remove it and connect() can avoid\n // stacking duplicates.\n #messageListener?: (e: { data: BroadcastChannelMessage }) => void\n #disconnected = false\n #ready = false\n // reassigned in constructor, but keeps TS from complaining\n #markReady = () => {}\n #readyPromise: Promise<void>\n\n #options: BroadcastChannelNetworkAdapterOptions\n\n #connectedPeers: PeerId[] = []\n\n isReady() {\n return this.#ready\n }\n\n whenReady() {\n return this.#readyPromise\n }\n\n constructor(options?: BroadcastChannelNetworkAdapterOptions) {\n super()\n this.#options = {\n channelName: \"broadcast\",\n peerWaitMs: 1000,\n ...(options ?? {}),\n }\n this.#broadcastChannel = new BroadcastChannel(this.#options.channelName)\n this.#readyPromise = new Promise<void>(resolve => {\n this.#markReady = () => {\n this.#ready = true\n resolve()\n }\n setTimeout(() => this.#markReady(), this.#options.peerWaitMs)\n })\n }\n\n connect(peerId: PeerId, peerMetadata?: PeerMetadata) {\n this.peerId = peerId\n this.peerMetadata = peerMetadata\n\n if (this.#disconnected) {\n this.#broadcastChannel = new BroadcastChannel(this.#options.channelName)\n } else if (this.#messageListener) {\n this.#broadcastChannel.removeEventListener(\n \"message\",\n this.#messageListener\n )\n }\n this.#disconnected = false\n\n this.#messageListener = (e: { data: BroadcastChannelMessage }) => {\n const message = e.data\n if (\"targetId\" in message && message.targetId !== this.peerId) {\n return\n }\n\n if (this.#disconnected) {\n return\n }\n\n const { senderId, type } = message\n\n switch (type) {\n case \"arrive\":\n {\n const { peerMetadata } = message as ArriveMessage\n this.#broadcastChannel.postMessage({\n senderId: this.peerId,\n targetId: senderId,\n type: \"welcome\",\n peerMetadata: this.peerMetadata,\n })\n this.#announceConnection(senderId, peerMetadata)\n }\n break\n case \"welcome\":\n {\n const { peerMetadata } = message as WelcomeMessage\n this.#announceConnection(senderId, peerMetadata)\n }\n break\n case \"leave\":\n this.#connectedPeers = this.#connectedPeers.filter(\n p => p !== senderId\n )\n this.emit(\"peer-disconnected\", { peerId: senderId })\n break\n default:\n if (!(\"data\" in message)) {\n this.emit(\"message\", message)\n } else {\n if (!message.data) {\n // A throw inside this \"message\" listener escapes dispatch and can\n // crash the process under Node, so log and drop the malformed\n // message.\n log.warn(\"dropping a data message with no data from %o\", senderId)\n return\n }\n const data = message.data\n this.emit(\"message\", {\n ...message,\n data: new Uint8Array(data),\n })\n }\n break\n }\n }\n this.#broadcastChannel.addEventListener(\"message\", this.#messageListener)\n\n this.#broadcastChannel.postMessage({\n senderId: this.peerId,\n type: \"arrive\",\n peerMetadata,\n })\n }\n\n #announceConnection(peerId: PeerId, peerMetadata: PeerMetadata) {\n this.#markReady()\n this.#connectedPeers.push(peerId)\n this.emit(\"peer-candidate\", { peerId, peerMetadata })\n }\n\n send(message: Message) {\n if (this.#disconnected) {\n return false\n }\n if (\"data\" in message) {\n this.#broadcastChannel.postMessage({\n ...message,\n data: message.data\n ? message.data.buffer.slice(\n message.data.byteOffset,\n message.data.byteOffset + message.data.byteLength\n )\n : undefined,\n })\n } else {\n this.#broadcastChannel.postMessage(message)\n }\n }\n\n disconnect() {\n if (this.#disconnected) {\n return\n }\n this.#broadcastChannel.postMessage({\n senderId: this.peerId,\n type: \"leave\",\n })\n for (const peerId of this.#connectedPeers) {\n this.emit(\"peer-disconnected\", { peerId })\n }\n this.#disconnected = true\n\n // Detach the listener and close the channel so nothing is retained after\n // disconnect; connect() reopens a fresh channel.\n if (this.#messageListener) {\n this.#broadcastChannel.removeEventListener(\n \"message\",\n this.#messageListener\n )\n this.#messageListener = undefined\n }\n this.#broadcastChannel.close()\n }\n}\n\n/** Notify the network that we have arrived so everyone knows our peer ID */\ntype ArriveMessage = {\n type: \"arrive\"\n\n /** The peer ID of the sender of this message */\n senderId: PeerId\n\n /** The peer metadata of the sender of this message */\n peerMetadata: PeerMetadata\n\n /** Arrive messages don't have a targetId */\n targetId: never\n}\n\n/** Respond to an arriving peer with our peer ID */\ntype WelcomeMessage = {\n type: \"welcome\"\n\n /** The peer ID of the recipient sender this message */\n senderId: PeerId\n\n /** The peer metadata of the sender of this message */\n peerMetadata: PeerMetadata\n\n /** The peer ID of the recipient of this message */\n targetId: PeerId\n}\n\ntype BroadcastChannelMessage = ArriveMessage | WelcomeMessage | Message\n", "export * from \"@automerge/automerge-repo-react-hooks\"\n\nexport { BroadcastChannelNetworkAdapter } from \"@automerge/automerge-repo-network-broadcastchannel\"\nexport { MessageChannelNetworkAdapter } from \"@automerge/automerge-repo-network-messagechannel\"\nexport { WebSocketClientAdapter } from \"@automerge/automerge-repo-network-websocket\"\nexport { IndexedDBStorageAdapter } from \"@automerge/automerge-repo-storage-indexeddb\"\n", "import {\n NetworkAdapter,\n PeerId,\n PeerMetadata,\n cbor,\n} from \"@automerge/automerge-repo/slim\"\n\nimport debug from \"debug\"\n\nimport {\n FromClientMessage,\n FromServerMessage,\n JoinMessage,\n isErrorMessage,\n isPeerMessage,\n} from \"./messages.js\"\nimport { ProtocolV1 } from \"./protocolVersion.js\"\nimport { assert } from \"./assert.js\"\nimport { toArrayBuffer } from \"./toArrayBuffer.js\"\n\nabstract class WebSocketNetworkAdapter extends NetworkAdapter {\n socket?: WebSocket\n}\n\nexport class WebSocketClientAdapter extends WebSocketNetworkAdapter {\n #ready = false\n #readyResolver?: () => void\n #readyPromise: Promise<void> = new Promise<void>(resolve => {\n this.#readyResolver = resolve\n })\n\n isReady() {\n return this.#ready\n }\n\n whenReady() {\n return this.#readyPromise\n }\n\n #forceReady() {\n if (!this.#ready) {\n this.#ready = true\n this.#readyResolver?.()\n }\n }\n\n #retryIntervalId?: TimeoutId\n #reconnectTimeoutId?: TimeoutId\n #forceReadyTimeoutId?: TimeoutId\n #disconnected = false\n #log = debug(\"automerge-repo:websocket:browser\")\n\n remotePeerId?: PeerId // this adapter only connects to one remote client at a time\n\n constructor(\n public readonly url: string,\n public readonly retryInterval = 5000\n ) {\n super()\n this.#log = this.#log.extend(url)\n }\n\n connect(peerId: PeerId, peerMetadata?: PeerMetadata) {\n this.#disconnected = false\n if (!this.socket || !this.peerId) {\n // first time connecting\n this.#log(\"connecting\")\n this.peerId = peerId\n this.peerMetadata = peerMetadata ?? {}\n } else {\n this.#log(\"reconnecting\")\n assert(peerId === this.peerId)\n // Remove the old event listeners before creating a new connection.\n this.socket.removeEventListener(\"open\", this.onOpen)\n this.socket.removeEventListener(\"close\", this.onClose)\n this.socket.removeEventListener(\"message\", this.onMessage)\n this.socket.removeEventListener(\"error\", this.onError)\n }\n // Wire up retries\n if (!this.#retryIntervalId)\n this.#retryIntervalId = setInterval(() => {\n this.connect(peerId, peerMetadata)\n }, this.retryInterval)\n\n this.socket = new WebSocket(this.url)\n\n this.socket.binaryType = \"arraybuffer\"\n\n this.socket.addEventListener(\"open\", this.onOpen)\n this.socket.addEventListener(\"close\", this.onClose)\n this.socket.addEventListener(\"message\", this.onMessage)\n this.socket.addEventListener(\"error\", this.onError)\n\n // Mark this adapter as ready if we haven't received an ack in 1 second.\n // We might hear back from the other end at some point but we shouldn't\n // hold up marking things as unavailable for any longer. Clear any pending\n // fallback so reconnects don't accumulate timers.\n clearTimeout(this.#forceReadyTimeoutId)\n this.#forceReadyTimeoutId = setTimeout(() => this.#forceReady(), 1000)\n this.join()\n }\n\n onOpen = () => {\n this.#log(\"open\")\n clearInterval(this.#retryIntervalId)\n this.#retryIntervalId = undefined\n this.join()\n }\n\n // When a socket closes, or disconnects, remove it from the array.\n onClose = () => {\n this.#log(\"close\")\n if (this.remotePeerId)\n this.emit(\"peer-disconnected\", { peerId: this.remotePeerId })\n\n if (this.retryInterval > 0 && !this.#retryIntervalId)\n // try to reconnect\n this.#reconnectTimeoutId = setTimeout(() => {\n // Skip the reconnect if disconnect() ran after it was scheduled.\n if (this.#disconnected) return\n assert(this.peerId)\n return this.connect(this.peerId, this.peerMetadata)\n }, this.retryInterval)\n }\n\n onMessage = (event: MessageEvent) => {\n this.receiveMessage(event.data as Uint8Array)\n }\n\n /** Native WebSocket error events are intentionally opaque \u2014 on both the\n * browser and Node the error detail is withheld from scripts by design\n * (https://stackoverflow.com/a/31003057/239663) \u2014 so we just log and let\n * the retry logic reconnect. */\n onError = () => {\n this.#log(\"Connection failed, retrying...\")\n }\n\n join() {\n assert(this.peerId)\n assert(this.socket)\n if (this.socket.readyState === WebSocket.OPEN) {\n this.send(joinMessage(this.peerId!, this.peerMetadata!))\n } else {\n // We'll try again in the `onOpen` handler\n }\n }\n\n disconnect() {\n if (this.#disconnected) return\n assert(this.peerId)\n assert(this.socket)\n this.#disconnected = true\n const socket = this.socket\n if (socket) {\n socket.removeEventListener(\"open\", this.onOpen)\n socket.removeEventListener(\"close\", this.onClose)\n socket.removeEventListener(\"message\", this.onMessage)\n socket.removeEventListener(\"error\", this.onError)\n socket.close()\n }\n clearInterval(this.#retryIntervalId)\n this.#retryIntervalId = undefined\n clearTimeout(this.#reconnectTimeoutId)\n this.#reconnectTimeoutId = undefined\n clearTimeout(this.#forceReadyTimeoutId)\n this.#forceReadyTimeoutId = undefined\n if (this.remotePeerId)\n this.emit(\"peer-disconnected\", { peerId: this.remotePeerId })\n this.socket = undefined\n }\n\n send(message: FromClientMessage) {\n if (\"data\" in message && message.data?.byteLength === 0)\n throw new Error(\"Tried to send a zero-length message\")\n assert(this.peerId)\n if (!this.socket) {\n this.#log(\"Tried to send on a disconnected socket.\")\n return\n }\n if (this.socket.readyState !== WebSocket.OPEN) {\n // CONNECTING / CLOSING / CLOSED. Drop silently \u2014 sync state and\n // reconnect logic will replay once the socket is OPEN again.\n this.#log(\n `Tried to send on a non-OPEN socket (readyState=${this.socket.readyState}); dropping.`\n )\n return\n }\n\n const encoded = cbor.encode(message)\n this.socket.send(toArrayBuffer(encoded))\n }\n\n peerCandidate(remotePeerId: PeerId, peerMetadata: PeerMetadata) {\n assert(this.socket)\n this.#forceReady()\n this.remotePeerId = remotePeerId\n this.emit(\"peer-candidate\", {\n peerId: remotePeerId,\n peerMetadata,\n })\n }\n\n receiveMessage(messageBytes: Uint8Array) {\n let message: FromServerMessage\n try {\n message = cbor.decode(new Uint8Array(messageBytes))\n } catch (e) {\n this.#log(\"error decoding message:\", e)\n return\n }\n\n assert(this.socket)\n if (messageBytes.byteLength === 0)\n throw new Error(\"received a zero-length message\")\n\n if (isPeerMessage(message)) {\n const { peerMetadata } = message\n this.#log(`peer: ${message.senderId}`)\n this.peerCandidate(message.senderId, peerMetadata)\n } else if (isErrorMessage(message)) {\n this.#log(`error: ${message.message}`)\n } else {\n this.emit(\"message\", message)\n }\n }\n}\n\nfunction joinMessage(\n senderId: PeerId,\n peerMetadata: PeerMetadata\n): JoinMessage {\n return {\n type: \"join\",\n senderId,\n peerMetadata,\n supportedProtocolVersions: [ProtocolV1],\n }\n}\n\ntype TimeoutId = ReturnType<typeof setTimeout> // https://stackoverflow.com/questions/45802988\n", "import type {\n Message,\n PeerId,\n PeerMetadata,\n} from \"@automerge/automerge-repo/slim\"\nimport type { ProtocolVersion } from \"./protocolVersion.js\"\n\n/** Sent by the client to the server to tell the server the clients PeerID */\nexport type JoinMessage = {\n type: \"join\"\n /** The PeerID of the client */\n senderId: PeerId\n\n /** Metadata presented by the peer */\n peerMetadata: PeerMetadata\n\n /** The protocol version the client supports */\n supportedProtocolVersions: ProtocolVersion[]\n}\n\n/** Sent by the server in response to a \"join\" message to advertise the servers PeerID */\nexport type PeerMessage = {\n type: \"peer\"\n /** The PeerID of the server */\n senderId: PeerId\n\n /** Metadata presented by the peer */\n peerMetadata: PeerMetadata\n\n /** The protocol version the server selected for this connection */\n selectedProtocolVersion: ProtocolVersion\n /** The PeerID of the client */\n targetId: PeerId\n}\n\n/** An error occurred. The other end will terminate the connection after sending this message */\nexport type ErrorMessage = {\n type: \"error\"\n /** The peer sending the message */\n senderId: PeerId\n /** A description of the error*/\n message: string\n /** The PeerID of the client */\n targetId: PeerId\n}\n\n/** A message from the client to the server */\nexport type FromClientMessage = JoinMessage | Message\n\n/** A message from the server to the client */\nexport type FromServerMessage = PeerMessage | ErrorMessage | Message\n\n// TYPE GUARDS\n\nexport const isJoinMessage = (\n message: FromClientMessage\n): message is JoinMessage => message.type === \"join\"\n\nexport const isPeerMessage = (\n message: FromServerMessage\n): message is PeerMessage => message.type === \"peer\"\n\nexport const isErrorMessage = (\n message: FromServerMessage\n): message is ErrorMessage => message.type === \"error\"\n", "export const ProtocolV1 = \"1\"\n/** The versions of the websocket protocol */\nexport type ProtocolVersion = typeof ProtocolV1\n", "/* c8 ignore start */\n\nexport function assert(value: boolean, message?: string): asserts value\nexport function assert<T>(\n value: T | undefined,\n message?: string\n): asserts value is T\nexport function assert(value: any, message = \"Assertion failed\") {\n if (value === false || value === null || value === undefined) {\n const error = new Error(trimLines(message))\n error.stack = removeLine(error.stack, \"assert.ts\")\n throw error\n }\n}\n\nconst trimLines = (s: string) =>\n s\n .split(\"\\n\")\n .map(s => s.trim())\n .join(\"\\n\")\n\nconst removeLine = (s = \"\", targetText: string) =>\n s\n .split(\"\\n\")\n .filter(line => !line.includes(targetText))\n .join(\"\\n\")\n\n/* c8 ignore end */\n", "/**\n * This incantation deals with websocket sending the whole underlying buffer even if we just have a\n * uint8array view on it\n */\nexport const toArrayBuffer = (bytes: Uint8Array): ArrayBuffer => {\n const { buffer, byteOffset, byteLength } = bytes\n return buffer.slice(byteOffset, byteOffset + byteLength) as ArrayBuffer\n}\n", "import {\n NetworkAdapter,\n type PeerId,\n type PeerMetadata,\n} from \"@automerge/automerge-repo/slim\"\n\nimport debug from \"debug\"\n\nimport {\n type FromClientMessage,\n type FromServerMessage,\n isErrorMessage,\n isPeerMessage,\n} from \"./messages.js\"\nimport { ProtocolV1 } from \"./protocolVersion.js\"\nimport { WebSocketClientAdapter } from \"./WebSocketClientAdapter.js\"\nimport {\n WS_WORKER_RPC,\n type WsWorkerCommandBody,\n type WsWorkerEvent,\n} from \"./websocket-worker-rpc.js\"\n\n/**\n * A drop-in {@link WebSocketClientAdapter} (same API) that runs the socket and\n * CBOR encode/decode on a Worker, so inbound frames are read and decoded off\n * the host thread. Falls back to a main-thread {@link WebSocketClientAdapter}\n * where Workers aren't available.\n */\nexport class WebSocketWorkerClientAdapter extends NetworkAdapter {\n #ready = false\n #readyResolver?: () => void\n #readyPromise: Promise<void> = new Promise(resolve => {\n this.#readyResolver = resolve\n })\n\n #worker?: Worker\n #fallback?: WebSocketClientAdapter\n #log = debug(\"automerge-repo:websocket:worker\")\n\n /** This adapter only connects to one remote at a time. */\n remotePeerId?: PeerId\n\n /** @param worker - an existing Worker to use instead of spawning one. */\n constructor(\n public readonly url: string,\n public readonly retryInterval = 5000,\n worker?: Worker\n ) {\n super()\n this.#log = this.#log.extend(url)\n if (worker) {\n this.#worker = worker\n this.#worker.addEventListener(\"message\", this.#onWorkerMessage)\n this.#worker.addEventListener(\"error\", this.#onWorkerError)\n }\n }\n\n isReady() {\n return this.#fallback ? this.#fallback.isReady() : this.#ready\n }\n\n whenReady() {\n return this.#fallback ? this.#fallback.whenReady() : this.#readyPromise\n }\n\n #forceReady() {\n if (!this.#ready) {\n this.#ready = true\n this.#readyResolver?.()\n }\n }\n\n connect(peerId: PeerId, peerMetadata?: PeerMetadata) {\n this.peerId = peerId\n this.peerMetadata = peerMetadata ?? {}\n\n if (!this.#worker && !this.#fallback) {\n if (typeof Worker === \"undefined\") {\n this.#useFallback()\n } else {\n try {\n this.#worker = new Worker(\n new URL(\"./websocket.worker.js\", import.meta.url),\n { type: \"module\" }\n )\n this.#worker.addEventListener(\"message\", this.#onWorkerMessage)\n this.#worker.addEventListener(\"error\", this.#onWorkerError)\n } catch (err) {\n this.#log(\n \"worker unavailable, falling back to a main-thread socket: %o\",\n err\n )\n this.#useFallback()\n }\n }\n }\n\n if (this.#fallback) {\n this.#fallback.connect(peerId, peerMetadata)\n return\n }\n\n this.#post({\n type: \"connect\",\n url: this.url,\n retryInterval: this.retryInterval,\n })\n\n // Ready after 1s without a peer ack (matches WebSocketClientAdapter).\n setTimeout(() => this.#forceReady(), 1000)\n }\n\n #useFallback() {\n const fallback = new WebSocketClientAdapter(this.url, this.retryInterval)\n this.#fallback = fallback\n fallback.on(\"message\", message => this.emit(\"message\", message))\n fallback.on(\"peer-candidate\", payload =>\n this.emit(\"peer-candidate\", payload)\n )\n fallback.on(\"peer-disconnected\", payload =>\n this.emit(\"peer-disconnected\", payload)\n )\n fallback.on(\"close\", () => this.emit(\"close\"))\n }\n\n #onWorkerMessage = (e: MessageEvent) => {\n const event = e.data as WsWorkerEvent\n if (!event || event.channel !== WS_WORKER_RPC) return\n switch (event.type) {\n case \"open\":\n this.#join()\n return\n case \"message\":\n this.#receiveMessage(event.message)\n return\n case \"close\":\n if (this.remotePeerId)\n this.emit(\"peer-disconnected\", { peerId: this.remotePeerId })\n return\n case \"error\":\n this.#log(\"websocket error (in worker)\")\n return\n }\n }\n\n #onWorkerError = (e: Event) => {\n this.#log(\"websocket worker error: %o\", e)\n }\n\n #join() {\n if (!this.peerId) return\n this.#post({\n type: \"send\",\n message: {\n type: \"join\",\n senderId: this.peerId,\n peerMetadata: this.peerMetadata ?? {},\n supportedProtocolVersions: [ProtocolV1],\n },\n })\n }\n\n #receiveMessage(message: FromServerMessage) {\n if (isPeerMessage(message)) {\n this.#log(`peer: ${message.senderId}`)\n this.remotePeerId = message.senderId\n this.#forceReady()\n this.emit(\"peer-candidate\", {\n peerId: message.senderId,\n peerMetadata: message.peerMetadata,\n })\n } else if (isErrorMessage(message)) {\n this.#log(`error: ${message.message}`)\n } else {\n this.emit(\"message\", message)\n }\n }\n\n send(message: FromClientMessage) {\n if (\"data\" in message && message.data?.byteLength === 0)\n throw new Error(\"Tried to send a zero-length message\")\n\n if (this.#fallback) {\n this.#fallback.send(message)\n return\n }\n if (!this.#worker) {\n this.#log(\"Tried to send on a disconnected adapter.\")\n return\n }\n this.#post({ type: \"send\", message })\n }\n\n disconnect() {\n if (this.#fallback) {\n this.#fallback.disconnect()\n return\n }\n if (this.remotePeerId)\n this.emit(\"peer-disconnected\", { peerId: this.remotePeerId })\n this.#post({ type: \"disconnect\" })\n if (this.#worker) {\n this.#worker.removeEventListener(\"message\", this.#onWorkerMessage)\n this.#worker.removeEventListener(\"error\", this.#onWorkerError)\n this.#worker.terminate()\n this.#worker = undefined\n }\n }\n\n #post(command: WsWorkerCommandBody) {\n this.#worker?.postMessage({ channel: WS_WORKER_RPC, ...command })\n }\n}\n", "import WebSocket, { type WebSocketServer } from \"ws\"\n\nimport debug from \"debug\"\nconst log = debug(\"WebsocketServer\")\n\nimport {\n cbor as cborHelpers,\n NetworkAdapter,\n type PeerMetadata,\n type PeerId,\n} from \"@automerge/automerge-repo/slim\"\nimport {\n FromClientMessage,\n FromServerMessage,\n isJoinMessage,\n} from \"./messages.js\"\nimport { ProtocolV1, ProtocolVersion } from \"./protocolVersion.js\"\nimport { assert } from \"./assert.js\"\nimport { toArrayBuffer } from \"./toArrayBuffer.js\"\n\nconst { encode, decode } = cborHelpers\n\nexport class WebSocketServerAdapter extends NetworkAdapter {\n sockets: { [peerId: PeerId]: WebSocket } = {}\n\n #ready = false\n #readyResolver?: () => void\n #readyPromise: Promise<void> = new Promise<void>(resolve => {\n this.#readyResolver = resolve\n })\n\n isReady() {\n return this.#ready\n }\n\n whenReady() {\n return this.#readyPromise\n }\n\n #forceReady() {\n if (!this.#ready) {\n this.#ready = true\n this.#readyResolver?.()\n }\n }\n\n // Server-level wiring registered in connect(), held on the instance so\n // disconnect() can clear the keepalive interval and remove the listeners we\n // add to the long-lived WebSocketServer, and so a repeated connect() does not\n // stack duplicates.\n #keepAliveId?: ReturnType<typeof setInterval>\n #onServerClose?: () => void\n #onServerConnection?: (socket: WebSocketWithIsAlive) => void\n\n constructor(\n private server: WebSocketServer,\n private keepAliveInterval = 5000\n ) {\n super()\n }\n\n connect(peerId: PeerId, peerMetadata?: PeerMetadata) {\n this.peerId = peerId\n this.peerMetadata = peerMetadata\n\n // Detach any wiring from an earlier connect() so repeated calls don't stack\n // listeners or intervals on the shared server.\n this.#teardownServerWiring()\n\n this.#onServerClose = () => {\n this.disconnect()\n }\n this.server.on(\"close\", this.#onServerClose)\n\n this.#onServerConnection = (socket: WebSocketWithIsAlive) => {\n // When a socket closes, or disconnects, remove it from our list\n socket.on(\"close\", () => {\n this.#removeSocket(socket)\n })\n\n socket.on(\"message\", message =>\n this.receiveMessage(message as Uint8Array, socket)\n )\n\n // Start out \"alive\", and every time we get a pong, reset that state.\n socket.isAlive = true\n socket.on(\"pong\", () => (socket.isAlive = true))\n\n this.#forceReady()\n }\n this.server.on(\"connection\", this.#onServerConnection)\n\n this.#keepAliveId = setInterval(() => {\n // Terminate connections to lost clients\n const clients = this.server.clients as Set<WebSocketWithIsAlive>\n clients.forEach(socket => {\n if (socket.isAlive) {\n // Mark all clients as potentially dead until we hear from them\n socket.isAlive = false\n socket.ping()\n } else {\n this.#terminate(socket)\n }\n })\n }, this.keepAliveInterval)\n }\n\n disconnect() {\n this.#teardownServerWiring()\n\n const clients = this.server.clients as Set<WebSocketWithIsAlive>\n clients.forEach(socket => {\n this.#terminate(socket)\n this.#removeSocket(socket)\n })\n }\n\n #teardownServerWiring() {\n if (this.#keepAliveId !== undefined) {\n clearInterval(this.#keepAliveId)\n this.#keepAliveId = undefined\n }\n if (this.#onServerClose) {\n this.server.off(\"close\", this.#onServerClose)\n this.#onServerClose = undefined\n }\n if (this.#onServerConnection) {\n this.server.off(\"connection\", this.#onServerConnection)\n this.#onServerConnection = undefined\n }\n }\n\n send(message: FromServerMessage) {\n assert(\"targetId\" in message && message.targetId !== undefined)\n if (\"data\" in message && message.data?.byteLength === 0)\n throw new Error(\"Tried to send a zero-length message\")\n\n const senderId = this.peerId\n assert(senderId, \"No peerId set for the websocket server network adapter.\")\n\n const socket = this.sockets[message.targetId]\n\n if (!socket) {\n log(`Tried to send to disconnected peer: ${message.targetId}`)\n return\n }\n\n if (socket.readyState !== WebSocket.OPEN) {\n // Peer's socket is CONNECTING / CLOSING / CLOSED. Drop silently \u2014\n // once the peer reconnects and rejoins, normal sync state resumes.\n log(\n `Tried to send to peer ${message.targetId} with non-OPEN socket (readyState=${socket.readyState}); dropping.`\n )\n return\n }\n\n const encoded = encode(message)\n const arrayBuf = toArrayBuffer(encoded)\n\n socket.send(arrayBuf)\n }\n\n receiveMessage(messageBytes: Uint8Array, socket: WebSocket) {\n let message: FromClientMessage\n try {\n message = decode(messageBytes)\n } catch (e) {\n log(\"invalid message received, closing connection\")\n socket.close()\n return\n }\n\n // A decoded message is still untrusted: a malformed one (e.g. CBOR null,\n // which makes the destructure below throw) can throw while being handled.\n // This runs in the socket \"message\" event-loop callback, so an uncaught\n // throw would terminate a Node process by default. Drop the message and\n // close the misbehaving connection.\n // See https://nodejs.org/api/process.html#event-uncaughtexception\n try {\n const { type, senderId } = message\n\n const myPeerId = this.peerId\n assert(myPeerId)\n\n const documentId = \"documentId\" in message ? \"@\" + message.documentId : \"\"\n const { byteLength } = messageBytes\n log(\n `[${senderId}->${myPeerId}${documentId}] ${type} | ${byteLength} bytes`\n )\n\n if (isJoinMessage(message)) {\n const { peerMetadata, supportedProtocolVersions } = message\n const existingSocket = this.sockets[senderId]\n if (existingSocket) {\n if (existingSocket.readyState === WebSocket.OPEN) {\n existingSocket.close()\n }\n this.emit(\"peer-disconnected\", { peerId: senderId })\n }\n\n // Let the repo know that we have a new connection.\n this.emit(\"peer-candidate\", { peerId: senderId, peerMetadata })\n this.sockets[senderId] = socket\n\n const selectedProtocolVersion = selectProtocol(\n supportedProtocolVersions\n )\n if (selectedProtocolVersion === null) {\n this.send({\n type: \"error\",\n senderId: this.peerId!,\n message: \"unsupported protocol version\",\n targetId: senderId,\n })\n this.sockets[senderId].close()\n delete this.sockets[senderId]\n } else {\n this.send({\n type: \"peer\",\n senderId: this.peerId!,\n peerMetadata: this.peerMetadata!,\n selectedProtocolVersion: ProtocolV1,\n targetId: senderId,\n })\n }\n } else {\n if (this.sockets[senderId] !== socket) {\n return\n }\n this.emit(\"message\", message)\n }\n } catch (e) {\n log(\"error handling inbound message, closing connection\", e)\n socket.close()\n }\n }\n\n #terminate(socket: WebSocketWithIsAlive) {\n this.#removeSocket(socket)\n socket.terminate()\n }\n\n #removeSocket(socket: WebSocketWithIsAlive) {\n const peerId = this.#peerIdBySocket(socket)\n if (!peerId) return\n this.emit(\"peer-disconnected\", { peerId })\n delete this.sockets[peerId as PeerId]\n }\n\n #peerIdBySocket = (socket: WebSocket) => {\n const isThisSocket = (peerId: string) =>\n this.sockets[peerId as PeerId] === socket\n const result = Object.keys(this.sockets).find(isThisSocket) as PeerId\n return result ?? null\n }\n}\n\nconst selectProtocol = (versions?: ProtocolVersion[]) => {\n if (versions === undefined) return ProtocolV1\n if (versions.includes(ProtocolV1)) return ProtocolV1\n return null\n}\n\ninterface WebSocketWithIsAlive extends WebSocket {\n isAlive: boolean\n}\n", "import {\n type TLAnyShapeUtilConstructor,\n type TLRecord,\n type TLStoreWithStatus,\n createTLStore,\n type TLAnyBindingUtilConstructor,\n type HistoryEntry,\n defaultUserPreferences,\n createUserId,\n type TLUser,\n createPresenceStateDerivation,\n InstancePresenceRecordType,\n computed,\n react,\n type TLStoreSnapshot,\n type TLInstancePresence,\n sortById,\n useEditor,\n} from \"@tldraw/tldraw\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n type DocHandle,\n type DocHandleChangePayload,\n} from \"@automerge/automerge-repo/slim\";\nimport { usePresence } from \"@automerge/automerge-repo-react-hooks\";\n\nimport { applyAutomergePatchesToTLStore } from \"./AutomergeToTLStore.js\";\nimport { applyTLStoreChangesToAutomerge } from \"./TLStoreToAutomerge.js\";\n\n// `shapeUtils` / `bindingUtils` are the complete lists \u2014 a document script's\n// `config.js` may have added to or replaced the defaults, and the store has to\n// agree with the editor about them or records of a custom type fail validation.\nexport function useAutomergeStore({\n handle,\n shapeUtils = [],\n bindingUtils = [],\n readOnly = false,\n}: {\n handle: DocHandle<TLStoreSnapshot>;\n userId: string;\n shapeUtils?: TLAnyShapeUtilConstructor[];\n bindingUtils?: TLAnyBindingUtilConstructor[];\n readOnly?: boolean;\n}): TLStoreWithStatus {\n const [store] = useState(() => {\n const store = createTLStore({ shapeUtils, bindingUtils });\n return store;\n });\n\n const [storeWithStatus, setStoreWithStatus] = useState<TLStoreWithStatus>({\n status: \"loading\",\n });\n\n // Read through a ref inside the write-back listener so a mid-session flip\n // (see `useIsHandleReadOnly`) doesn't re-run the store effect below \u2014 that\n // would re-load the snapshot and clear session records (camera, selection).\n const readOnlyRef = useRef(readOnly);\n readOnlyRef.current = readOnly;\n\n /* -------------------- TLDraw <--> Automerge -------------------- */\n useEffect(() => {\n const unsubs: (() => void)[] = [];\n\n // A hacky workaround to prevent local changes from being applied twice\n // once into the automerge doc and then back again.\n let preventPatchApplications = false;\n\n /* TLDraw to Automerge */\n function syncStoreChangesToAutomergeDoc({\n changes,\n }: HistoryEntry<TLRecord>) {\n // A read-only (history-pinned) handle is at fixed heads and rejects\n // `handle.change`, so never forward store edits back to Automerge.\n if (readOnlyRef.current) return;\n preventPatchApplications = true;\n handle.change((doc) => {\n applyTLStoreChangesToAutomerge(doc, changes);\n });\n preventPatchApplications = false;\n }\n\n unsubs.push(\n store.listen(syncStoreChangesToAutomergeDoc, {\n source: \"user\",\n scope: \"document\",\n })\n );\n\n /* Automerge to TLDraw */\n const syncAutomergeDocChangesToStore = ({\n patches,\n scopeReplaced,\n doc,\n }: DocHandleChangePayload<TLStoreSnapshot>) => {\n if (preventPatchApplications) return;\n\n // A wholesale scope replacement (e.g. the draft overlay re-pointing\n // this handle at a different clone) carries no patch stream connecting\n // the old doc to the new one. Diff the new doc's *document*-scope\n // records into the store rather than `loadStoreSnapshot`: that would\n // `clear()` the session-scope records too (camera/zoom, current page,\n // selection), which should survive a draft switch. Drafts are forks of\n // each other, so most records are identical and `put` skips them.\n if (scopeReplaced) {\n const swapped = handle.doc();\n if (!swapped?.store) return;\n const migrated = store.schema.migrateStoreSnapshot({\n store: JSON.parse(JSON.stringify(swapped.store)),\n schema: JSON.parse(JSON.stringify(swapped.schema)),\n });\n if (migrated.type === \"error\") {\n console.error(\n \"[tldraw5] failed to migrate swapped-in snapshot:\",\n migrated.reason\n );\n return;\n }\n const next = migrated.value;\n store.mergeRemoteChanges(() => {\n const toRemove = store\n .allRecords()\n .filter(\n (record) =>\n store.scopedTypes.document.has(record.typeName) &&\n !(record.id in next)\n )\n .map((record) => record.id);\n if (toRemove.length) store.remove(toRemove);\n store.put(Object.values(next));\n });\n return;\n }\n\n applyAutomergePatchesToTLStore(patches, store, doc ?? handle.doc());\n };\n\n handle.on(\"change\", syncAutomergeDocChangesToStore);\n unsubs.push(() => handle.off(\"change\", syncAutomergeDocChangesToStore));\n\n /* Load the initial document snapshot into the store. */\n // TODO: need to think through the various status possibilities here and how they map\n const doc = handle.doc();\n if (!doc) throw new Error(\"Document not found\");\n if (!doc.store) throw new Error(\"Document store not initialized\");\n\n store.mergeRemoteChanges(() => {\n store.loadStoreSnapshot({\n store: structuredClone(doc.store),\n schema: structuredClone(doc.schema),\n });\n });\n\n setStoreWithStatus({\n store,\n status: \"synced-remote\",\n connectionStatus: \"online\",\n });\n\n return () => {\n unsubs.forEach((fn) => fn());\n unsubs.length = 0;\n };\n }, [handle, store]);\n\n return storeWithStatus;\n}\n\n// A handle's read-only state (`isReadOnly()`, true at fixed heads) can flip in\n// place: its backing may be swapped without the handle identity changing (a\n// `change` event with `scopeReplaced: true`). Track it as state re-read on\n// every swap rather than sampling it once per mount.\nexport function useIsHandleReadOnly(\n handle: DocHandle<TLStoreSnapshot>\n): boolean {\n const [readOnly, setReadOnly] = useState(() => handle.isReadOnly());\n\n useEffect(() => {\n setReadOnly(handle.isReadOnly());\n const onChange = (payload: DocHandleChangePayload<TLStoreSnapshot>) => {\n if (payload.scopeReplaced) setReadOnly(handle.isReadOnly());\n };\n handle.on(\"change\", onChange);\n return () => void handle.off(\"change\", onChange);\n }, [handle]);\n\n return readOnly;\n}\n\n// A scope swap (a `change` event with `scopeReplaced: true` -- the draft\n// overlay re-pointing this handle at a different clone when scrubbing history\n// or switching drafts) invalidates the undo stack: its entries describe a\n// different timeline. The swapped-in records themselves are applied via\n// `mergeRemoteChanges` in `useAutomergeStore` above (so they are never\n// recorded); clearing the stale stack is all that's left to do.\n//\n// This can't live in `useAutomergeStore` directly: undo history is not a\n// store concern -- the `HistoryManager` belongs to the `Editor`, which tldraw\n// only creates internally once `<Tldraw store={...}>` mounts. The store hook\n// runs outside `<Tldraw>`, before any editor exists, so the history-clearing\n// half of the swap handling has to be a separate hook rendered *inside*\n// `<Tldraw>`, where `useEditor()` can reach the editor.\nexport function useClearHistoryOnScopeSwap(handle: DocHandle<TLStoreSnapshot>) {\n const editor = useEditor();\n\n useEffect(() => {\n if (!editor) return;\n const onChange = (payload: DocHandleChangePayload<TLStoreSnapshot>) => {\n if (payload.scopeReplaced) editor.clearHistory();\n };\n handle.on(\"change\", onChange);\n return () => void handle.off(\"change\", onChange);\n }, [editor, handle]);\n}\n\n// Ephemeral state shared with peers: our tldraw presence record, or null if window is not focused\ntype PresenceChannels = { presence: TLInstancePresence | null };\n\nexport function useAutomergePresence({\n handle,\n store,\n userMetadata,\n element,\n}: {\n handle: DocHandle<TLStoreSnapshot>;\n store: TLStoreWithStatus;\n userMetadata: any;\n element: HTMLElement;\n}) {\n const innerStore = store?.store;\n\n const { userId, name, color } = userMetadata;\n\n const isCursorActive = useIsCursorActive(element);\n\n const { peerStates, update, stop } = usePresence<PresenceChannels>({\n handle,\n initialState: { presence: null },\n });\n\n useEffect(() => {\n if (!innerStore) return;\n\n // Records are keyed by peerId so multiple sessions of the same user stay distinct.\n const toPut: TLRecord[] = peerStates.peers\n .filter((peer) => peer.value?.presence)\n .map((peer) => ({\n ...peer.value.presence!,\n id: InstancePresenceRecordType.createId(peer.peerId),\n }));\n\n const toRemove = innerStore.query\n .records(\"instance_presence\")\n .get()\n .sort(sortById)\n .map((record) => record.id)\n .filter((id) => !toPut.find((record) => record.id === id));\n\n if (toRemove.length) innerStore.remove(toRemove);\n if (toPut.length) innerStore.put(toPut);\n }, [innerStore, peerStates]);\n\n useEffect(() => {\n if (!innerStore) return;\n // tldraw 5 derives presence from a `TLUser` signal rather than from local\n // user preferences, so the identity we get from the Patchwork contact goes\n // straight in instead of round-tripping through `setUserPreferences`.\n const user = computed<TLUser>(\"user\", () => ({\n typeName: \"user\",\n id: createUserId(userId),\n name,\n color: color ?? defaultUserPreferences.color,\n imageUrl: \"\",\n meta: {},\n }));\n\n const presenceDerivation = createPresenceStateDerivation(user)(innerStore);\n\n // Closing the page sends a goodbye, which removes our record from peers.\n window.addEventListener(\"pagehide\", stop);\n\n let cancelled = false;\n let dispose: (() => void) | undefined;\n\n if (isCursorActive) {\n dispose = react(\"broadcast presence\", () => {\n const presence = presenceDerivation.get();\n // rAF throttles broadcasts to frame rate.\n requestAnimationFrame(() => {\n if (cancelled) return;\n // Stamp activity so becoming active again shows the cursor without\n // waiting for a pointer move to refresh the store's stale timestamp.\n update(\n \"presence\",\n presence ? { ...presence, lastActivityTimestamp: Date.now() } : null\n );\n });\n });\n } else {\n // Keep the record but clear the cursor when blurred or pointer leaves\n const presence = presenceDerivation.get();\n update(\"presence\", presence ? { ...presence, cursor: null } : null);\n }\n\n return () => {\n // Invalidate pending rAF broadcasts so stale updates don't overwrite deactivated cursors.\n cancelled = true;\n dispose?.();\n window.removeEventListener(\"pagehide\", stop);\n };\n }, [innerStore, userId, name, color, update, stop, isCursorActive]);\n}\n\n// The local cursor is active only when the window is focused and the pointer is over this tool.\nfunction useIsCursorActive(element: HTMLElement) {\n const [isFocused, setIsFocused] = useState(() => document.hasFocus());\n const [isPointerOver, setIsPointerOver] = useState(() =>\n element.matches(\":hover\")\n );\n\n useEffect(() => {\n const onFocus = () => setIsFocused(true);\n const onBlur = () => setIsFocused(false);\n const onEnter = () => setIsPointerOver(true);\n const onLeave = () => setIsPointerOver(false);\n window.addEventListener(\"focus\", onFocus);\n window.addEventListener(\"blur\", onBlur);\n element.addEventListener(\"mouseenter\", onEnter);\n element.addEventListener(\"mouseleave\", onLeave);\n return () => {\n window.removeEventListener(\"focus\", onFocus);\n window.removeEventListener(\"blur\", onBlur);\n element.removeEventListener(\"mouseenter\", onEnter);\n element.removeEventListener(\"mouseleave\", onLeave);\n };\n }, [element]);\n\n return isFocused && isPointerOver;\n}\n", "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/** Restore the built-in logger factory (mainly for tests). */\nexport function resetLoggerFactory() {\n factory = defaultFactory;\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<any>>\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(\"pruned\", () => 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", "import type { TLRecord, TLStore } from \"@tldraw/tldraw\";\nimport * as Automerge from \"@automerge/automerge/slim\";\n\n/**\n * Sync automerge doc changes into the tldraw store.\n *\n * The patches are only used to find out *which* records changed; the record\n * contents are rebuilt wholesale from the doc. Replaying patch mechanics\n * against store records would require modeling every patch shape automerge\n * can emit (nested `del`, `splice`, `conflict`, ...) and any gap silently\n * diverges the view from the doc until reload. Rebuilding from the doc makes\n * the doc the single source of truth: after every change the store record is\n * exactly what the doc says, regardless of what the patches looked like.\n * tldraw records are small, so the per-record rebuild cost is negligible.\n */\nexport function applyAutomergePatchesToTLStore(\n patches: Automerge.Patch[],\n store: TLStore,\n doc: { store: Record<string, unknown> }\n) {\n const changedIds = new Set<string>();\n for (const patch of patches) {\n if (patch.path[0] === \"store\" && patch.path.length > 1) {\n changedIds.add(`${patch.path[1]}`);\n }\n }\n\n const toRemove: TLRecord[\"id\"][] = [];\n const toPut: TLRecord[] = [];\n for (const id of changedIds) {\n const record = doc.store[id];\n if (record === undefined) {\n toRemove.push(id as TLRecord[\"id\"]);\n } else {\n toPut.push(structuredClone(record) as TLRecord);\n }\n }\n\n store.mergeRemoteChanges(() => {\n if (toRemove.length) store.remove(toRemove);\n if (toPut.length) store.put(toPut);\n });\n}\n", "import { useEffect, useState } from \"react\";\nimport { useDocument, useDocHandle } from \"@automerge/automerge-repo-react-hooks\";\nimport * as Providers from \"@inkandswitch/patchwork-providers\";\n/**\n * Generic reactive request hook. Resolves the first value a provider emits for\n * `selector` (via the one-shot `request` helper) and returns it once it\n * arrives (and whenever `element`/`selector` change). `T` is the response type.\n */\nexport function useRequest(element, selector) {\n const [value, setValue] = useState(undefined);\n const key = JSON.stringify(selector);\n useEffect(() => {\n let canceled = false;\n Providers.request(element, selector).then((v) => {\n if (canceled || v == null)\n return;\n setValue(() => v);\n });\n return () => {\n canceled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [element, key]);\n return value;\n}\nexport function useSubscribe(element, selector, initialValue) {\n const [value, setValue] = useState(initialValue);\n const key = JSON.stringify(selector);\n useEffect(() => {\n const unsubscribe = Providers.subscribe(element, selector, (v) => {\n setValue(() => v);\n });\n return unsubscribe;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [element, key]);\n return value;\n}\n/**\n * Handle-specialized subscription hook. Use when the answering provider emits\n * an `AutomergeUrl`. The handle is recovered locally from the global repo, so\n * it stays fully live. Returns `[doc, handle]` matching the shape of\n * `useDocument`; both read `undefined` until the first url arrives. `T` is the\n * doc shape inside the handle.\n */\nexport function useSubscribeDoc(element, selector) {\n const url = useSubscribe(element, selector);\n const [doc] = useDocument(url);\n const handle = useDocHandle(url);\n return [doc, handle];\n}\n", "/**\n * Open a streaming subscription. Dispatches a `patchwork:subscribe` for the\n * given `selector` carrying a fresh `MessageChannel` port; the answering\n * provider pushes values back over that channel for as long as the\n * subscription is live. `listener` is invoked once per emission (the first\n * delivery is always async because `MessagePort.postMessage` queues a task).\n *\n * The event is dispatched from the nearest enclosing `<patchwork-view>` so\n * callers can pass any node inside a provider subtree. An unclaimed\n * subscription is never settled: if no provider answers, `listener` simply\n * never fires.\n *\n * Returns an unsubscribe function. Calling it tells the provider to tear down\n * (via an `unsubscribe` message) and closes the consumer's port; any values\n * the provider emits after that are dropped.\n */\nexport function subscribe(element, selector, listener) {\n const view = element.closest(\"patchwork-view\");\n const dispatchEl = view ?? element;\n const channel = new MessageChannel();\n const port = channel.port2;\n const controller = new AbortController();\n const { signal } = controller;\n port.addEventListener(\"message\", (event) => {\n if (event.data?.type === \"change\")\n listener(event.data.value);\n }, { signal });\n // addEventListener (unlike assigning onmessage) does not implicitly start\n // the port, so message delivery has to be kicked off explicitly.\n port.start();\n const detail = {\n selector,\n port: channel.port1,\n };\n dispatchEl.dispatchEvent(new CustomEvent(\"patchwork:subscribe\", {\n detail,\n bubbles: true,\n composed: true,\n }));\n return () => {\n if (signal.aborted)\n return;\n controller.abort();\n port.postMessage({ type: \"unsubscribe\" });\n port.close();\n };\n}\n/**\n * Answer a `patchwork:subscribe`. The `producer` receives a `respond`\n * callback it can call any number of times to push values to the consumer,\n * and may return a teardown that runs when the consumer unsubscribes. Stops\n * propagation so ancestor providers don't double-answer. Values emitted after\n * the consumer unsubscribes are dropped.\n */\nexport function accept(event, producer) {\n event.stopPropagation();\n const port = event.detail.port;\n let alive = true;\n const respond = (value) => {\n if (!alive)\n return;\n port.postMessage({ type: \"change\", value });\n };\n let teardown;\n try {\n teardown = producer(respond);\n }\n catch (err) {\n console.error(\"[patchwork-providers] subscribe producer threw:\", err);\n }\n const stop = () => {\n if (!alive)\n return;\n alive = false;\n try {\n teardown?.();\n }\n catch (err) {\n console.error(\"[patchwork-providers] subscribe teardown threw:\", err);\n }\n port.close();\n };\n port.onmessage = (event) => {\n if (event.data?.type === \"unsubscribe\")\n stop();\n };\n}\n/**\n * One-shot convenience wrapper over {@link subscribe}: opens a subscription\n * for `selector`, resolves with the first value a provider emits, then\n * immediately unsubscribes. Because there is no fallback provider, an\n * unclaimed selector never resolves \u2014 use `subscribe` directly if you need to\n * handle the \"no provider\" case.\n */\nexport function request(element, selector) {\n return new Promise((resolve) => {\n const unsubscribe = subscribe(element, selector, (value) => {\n // The first emission is always async (postMessage queues a task), so\n // `unsubscribe` is assigned by the time this fires.\n unsubscribe();\n resolve(value);\n });\n });\n}\nexport { registerRepoProviderElement, } from \"./repo-provider.js\";\n", "import * as Automerge from \"@automerge/automerge/slim\";\nimport { isEqual } from \"lodash\";\nimport type { TLRecord, TLShapeId } from \"@tldraw/tldraw\";\nimport type { TLDrawDoc } from \"./datatype.ts\";\n\n// A record-level diff of the tldraw store between a baseline version and the\n// current one. Modelled on how `codemirror-base` diffs text: we view the doc\n// at the baseline heads and compare it against the live doc. The granularity\n// here is whole records (shapes) rather than text spans.\nexport type ShapeDiff = {\n added: Set<TLShapeId>;\n changed: Set<TLShapeId>;\n // Deleted shapes no longer exist in the live store, so we keep a plain\n // clone of the baseline record to re-render it as a ghost.\n deleted: TLRecord[];\n};\n\nconst isShapeId = (id: string): id is TLShapeId => id.startsWith(\"shape:\");\n\n// Compute which shapes were added / changed / deleted between the doc at\n// `headsBefore` and its current state. Only `shape:*` records are considered\n// \u2014 the store also holds `camera:`, `instance:`, `pointer:` and\n// `instance_presence:` records (presence is written live by every peer) which\n// must not show up as diffs.\nexport function diffStore(\n doc: TLDrawDoc,\n headsBefore: Automerge.Heads\n): ShapeDiff {\n const before = Automerge.view<TLDrawDoc>(doc, headsBefore);\n const beforeStore = (before.store ?? {}) as Record<string, TLRecord>;\n const afterStore = (doc.store ?? {}) as Record<string, TLRecord>;\n\n const added = new Set<TLShapeId>();\n const changed = new Set<TLShapeId>();\n const deleted: TLRecord[] = [];\n\n for (const id in afterStore) {\n if (!isShapeId(id)) continue;\n if (!(id in beforeStore)) {\n added.add(id);\n } else if (!isEqual(beforeStore[id], afterStore[id])) {\n changed.add(id);\n }\n }\n\n for (const id in beforeStore) {\n if (!isShapeId(id)) continue;\n if (!(id in afterStore)) {\n // Clone via JSON so the record survives outside the Automerge doc and\n // carries no proxies (matches how the store snapshot is loaded).\n deleted.push(JSON.parse(JSON.stringify(beforeStore[id])) as TLRecord);\n }\n }\n\n return { added, changed, deleted };\n}\n\nexport const hasDiff = (d: ShapeDiff | null | undefined): d is ShapeDiff =>\n !!d && (d.added.size > 0 || d.changed.size > 0 || d.deleted.length > 0);\n", "import { createContext, forwardRef, useContext } from \"react\";\nimport {\n DefaultShapeWrapper,\n useValue,\n type Atom,\n type TLShapeId,\n type TLShapeWrapperProps,\n} from \"@tldraw/tldraw\";\n\nexport type DiffStatus = \"added\" | \"changed\" | \"deleted\";\n\n// Per-tool atom mapping each shape id to its diff status. It lives in a tldraw\n// `atom` (not React state) so the wrapper can read it via `useValue` and only\n// the shapes whose status actually changed re-render. It reaches the wrapper\n// through context because tldraw instantiates `ShapeWrapper` internally \u2014 props\n// can't be passed to it, but context (which flows down from `<Tldraw>`) can.\nexport type DiffStatusAtom = Atom<Map<TLShapeId, DiffStatus>>;\n\nexport const DiffStatusContext = createContext<DiffStatusAtom | null>(null);\n\n// Wraps every shape's DOM and tags it with a `tl-diff-*` class so a CSS\n// `drop-shadow` glow can hug the shape outline (added / changed) or fade it out\n// (deleted ghosts). Re-uses `DefaultShapeWrapper` so all default behaviour is\n// preserved.\nexport const DiffShapeWrapper = forwardRef<HTMLDivElement, TLShapeWrapperProps>(\n function DiffShapeWrapper({ children, shape, isBackground }, ref) {\n const statusAtom = useContext(DiffStatusContext);\n const status = useValue(\n \"diff status\",\n () => statusAtom?.get().get(shape.id),\n [statusAtom, shape.id]\n );\n return (\n <DefaultShapeWrapper\n ref={ref}\n shape={shape}\n isBackground={isBackground}\n className={status ? `tl-diff-${status}` : undefined}\n >\n {children}\n </DefaultShapeWrapper>\n );\n }\n);\n", "import {\n Geometry2d,\n HTMLContainer,\n Rectangle2d,\n ShapeUtil,\n T,\n createShapeId,\n resizeBox,\n useEditor,\n useValue,\n type RecordProps,\n type TLResizeInfo,\n type TLShape,\n type TLShapeId,\n} from \"@tldraw/tldraw\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n getRegistry,\n getSupportedToolsForType,\n type DatatypeDescription,\n type LoadedDatatype,\n type LoadedTool,\n} from \"@inkandswitch/patchwork-plugins\";\nimport type { AutomergeUrl } from \"@automerge/automerge-repo/slim\";\nimport { useDocument, useRepo } from \"@automerge/react\";\nimport { automergeUrlToServiceWorkerUrl } from \"@inkandswitch/patchwork-filesystem\";\n\n// A tldraw shape that embeds another Patchwork document, rendered via the\n// host-provided `<patchwork-view>` custom element. The document reference and\n// its display metadata live in the shape props, so they persist through the\n// normal tldraw <-> Automerge sync like any other shape.\n\nexport const PATCHWORK_DOC_SHAPE_TYPE = \"patchwork-doc\" as const;\n\ndeclare module \"@tldraw/tldraw\" {\n export interface TLGlobalShapePropsMap {\n [PATCHWORK_DOC_SHAPE_TYPE]: {\n w: number;\n h: number;\n docUrl: string;\n docName: string;\n docType: string;\n toolId: string;\n };\n }\n}\n\nexport type PatchworkDocShape = TLShape<typeof PATCHWORK_DOC_SHAPE_TYPE>;\n\n// Deterministic shape id derived from the doc url, so remote peers that create\n// a shape for the same document converge on a single shape instead of dupes.\nexport function makeShapeId(docUrl: string): TLShapeId {\n return createShapeId(docUrl.replace(/[^a-zA-Z0-9]/g, \"_\"));\n}\n\nexport class PatchworkDocShapeUtil extends ShapeUtil<PatchworkDocShape> {\n static override type = PATCHWORK_DOC_SHAPE_TYPE;\n\n static override props: RecordProps<PatchworkDocShape> = {\n w: T.number,\n h: T.number,\n docUrl: T.string,\n docName: T.string,\n docType: T.string,\n toolId: T.string,\n };\n\n getDefaultProps(): PatchworkDocShape[\"props\"] {\n return {\n w: 640,\n h: 480,\n docUrl: \"\",\n docName: \"Untitled\",\n docType: \"\",\n toolId: \"\",\n };\n }\n\n getGeometry(shape: PatchworkDocShape): Geometry2d {\n return new Rectangle2d({\n width: shape.props.w,\n height: shape.props.h,\n isFilled: true,\n });\n }\n\n override canResize() {\n return true;\n }\n override canEdit() {\n return true;\n }\n override isAspectRatioLocked() {\n return false;\n }\n override hideRotateHandle() {\n return true;\n }\n\n override onResize(shape: PatchworkDocShape, info: TLResizeInfo<PatchworkDocShape>) {\n return resizeBox(shape, info);\n }\n\n component(shape: PatchworkDocShape) {\n return <PatchworkDocComponent shape={shape} />;\n }\n\n getIndicatorPath(shape: PatchworkDocShape) {\n const path = new Path2D();\n path.rect(0, 0, shape.props.w, shape.props.h);\n return path;\n }\n}\n\n// Best default tool for a datatype: prefer a tool that explicitly lists the\n// datatype over a wildcard (\"*\") tool; fall back to the first available.\nexport function getDefaultToolId(datatypeId: string): string {\n if (!datatypeId) return \"\";\n try {\n const tools = getSupportedToolsForType(datatypeId).filter(\n (t) => !(t as { unlisted?: boolean }).unlisted,\n );\n const specific = tools.find((t) => {\n const supported = (t as { supportedDatatypes?: unknown }).supportedDatatypes;\n return Array.isArray(supported) && supported.includes(datatypeId);\n });\n return (specific ?? tools[0])?.id ?? \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction useSupportedTools(docType: string): LoadedTool[] {\n return useMemo(() => {\n if (!docType) return [];\n try {\n return getSupportedToolsForType(docType).filter((t) => !(t as { unlisted?: boolean }).unlisted);\n } catch {\n return [];\n }\n }, [docType]);\n}\n\nfunction useIsImage(docUrl: string): boolean {\n const [doc] = useDocument<{ \"@patchwork\"?: { type?: string }; mimeType?: string }>(\n docUrl ? (docUrl as AutomergeUrl) : undefined,\n );\n return doc?.[\"@patchwork\"]?.type === \"file\" && !!doc?.mimeType?.startsWith(\"image/\");\n}\n\n// Fire the host event that opens the document full-screen in Patchwork. The\n// event contract lives in @inkandswitch/patchwork-elements; we dispatch it\n// directly to avoid taking a hard dependency on that (externalized) package.\nfunction openDocumentInHost(el: HTMLElement, url: string, toolId?: string) {\n el.dispatchEvent(\n new CustomEvent(\"patchwork:open-document\", {\n detail: { url, toolId: toolId || undefined },\n composed: true,\n bubbles: true,\n }),\n );\n}\n\nfunction PatchworkDocComponent({ shape }: { shape: PatchworkDocShape }) {\n const { docUrl, docName, docType, toolId } = shape.props;\n const editor = useEditor();\n const repo = useRepo();\n const isImage = useIsImage(docUrl);\n const tools = useSupportedTools(docType);\n\n const isSelectTool = useValue(\"is select tool\", () => editor.getCurrentToolId() === \"select\", [\n editor,\n ]);\n const isEditingShape = useValue(\n \"is editing shape\",\n () => editor.getEditingShapeId() === shape.id,\n [editor, shape.id],\n );\n const isFocused = isEditingShape;\n\n const [isEditingName, setIsEditingName] = useState(false);\n const [toolMenuOpen, setToolMenuOpen] = useState(false);\n const nameInputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const toolMenuRef = useRef<HTMLDivElement>(null);\n\n const currentTool = tools.find((t) => t.id === toolId) ?? tools[0];\n\n useEffect(() => {\n if (isEditingName && nameInputRef.current) {\n nameInputRef.current.focus();\n nameInputRef.current.select();\n }\n }, [isEditingName]);\n\n // Close the tool menu on outside pointerdown.\n useEffect(() => {\n if (!toolMenuOpen) return;\n const handler = (e: PointerEvent) => {\n if (toolMenuRef.current && !toolMenuRef.current.contains(e.target as Node)) {\n setToolMenuOpen(false);\n }\n };\n window.addEventListener(\"pointerdown\", handler, true);\n return () => window.removeEventListener(\"pointerdown\", handler, true);\n }, [toolMenuOpen]);\n\n // While the embedded content is focused, stop tldraw from swallowing\n // keyboard / wheel / pointer events so the inner tool stays interactive.\n useEffect(() => {\n if (!isFocused) return;\n const el = contentRef.current;\n if (!el) return;\n\n const stopKey = (e: KeyboardEvent) => e.stopPropagation();\n const stopWheel = (e: WheelEvent) => {\n if (!e.ctrlKey) e.stopPropagation();\n };\n const stopPointer = (e: PointerEvent) => e.stopPropagation();\n\n el.addEventListener(\"keydown\", stopKey);\n el.addEventListener(\"keyup\", stopKey);\n el.addEventListener(\"keypress\", stopKey);\n el.addEventListener(\"wheel\", stopWheel);\n el.addEventListener(\"pointerdown\", stopPointer, true);\n el.addEventListener(\"pointermove\", stopPointer, true);\n el.addEventListener(\"pointerup\", stopPointer, true);\n return () => {\n el.removeEventListener(\"keydown\", stopKey);\n el.removeEventListener(\"keyup\", stopKey);\n el.removeEventListener(\"keypress\", stopKey);\n el.removeEventListener(\"wheel\", stopWheel);\n el.removeEventListener(\"pointerdown\", stopPointer, true);\n el.removeEventListener(\"pointermove\", stopPointer, true);\n el.removeEventListener(\"pointerup\", stopPointer, true);\n };\n }, [isFocused]);\n\n const handleToolChange = useCallback(\n (newToolId: string) => {\n editor.updateShape({\n id: shape.id,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n props: { toolId: newToolId },\n });\n setToolMenuOpen(false);\n },\n [editor, shape.id],\n );\n\n const handleOpenDocument = useCallback(() => {\n const el = containerRef.current;\n if (!el || !docUrl) return;\n openDocumentInHost(el, docUrl, toolId || undefined);\n }, [docUrl, toolId]);\n\n const handleRename = useCallback(\n async (newName: string) => {\n const trimmed = newName.trim();\n if (!trimmed || trimmed === docName || !docUrl || !docType) {\n setIsEditingName(false);\n return;\n }\n\n try {\n const datatype = await loadDatatype(docType);\n if (datatype?.module.setTitle) {\n const childHandle = await repo.find<Record<string, unknown>>(docUrl as AutomergeUrl);\n childHandle.change((d) => {\n datatype.module.setTitle!(d, trimmed);\n });\n const childDoc = childHandle.doc();\n const canonicalName = childDoc ? datatype.module.getTitle(childDoc) : trimmed;\n editor.updateShape({\n id: shape.id,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n props: { docName: canonicalName },\n });\n } else {\n editor.updateShape({\n id: shape.id,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n props: { docName: trimmed },\n });\n }\n } catch (err) {\n console.warn(\"[tldraw5] rename failed\", err);\n }\n\n setIsEditingName(false);\n },\n [editor, shape.id, docName, docUrl, docType, repo],\n );\n\n return (\n <HTMLContainer>\n <div\n ref={containerRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n border: \"1px solid var(--color-panel-contrast, #e5e7eb)\",\n borderRadius: \"8px\",\n background: \"var(--color-panel, #ffffff)\",\n boxShadow: \"0 1px 4px rgba(0,0,0,0.10)\",\n pointerEvents: \"all\",\n }}\n >\n {/* Titlebar */}\n <div\n onPointerDown={() => {\n if (isEditingShape) editor.setEditingShape(null);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n height: \"30px\",\n padding: \"0 6px\",\n borderBottom: \"1px solid var(--color-divider, #e5e7eb)\",\n flexShrink: 0,\n cursor: \"grab\",\n userSelect: \"none\",\n background: \"var(--color-low, #fafafa)\",\n }}\n >\n {/* Open button */}\n <button\n type=\"button\"\n title=\"Open document\"\n onClick={(e) => {\n e.stopPropagation();\n handleOpenDocument();\n }}\n onPointerDown={(e) => e.stopPropagation()}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"20px\",\n height: \"20px\",\n border: \"none\",\n borderRadius: \"4px\",\n background: \"transparent\",\n cursor: \"pointer\",\n color: \"var(--color-text, #374151)\",\n flexShrink: 0,\n }}\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M6 3H3.5A1.5 1.5 0 0 0 2 4.5v8A1.5 1.5 0 0 0 3.5 14h8a1.5 1.5 0 0 0 1.5-1.5V10M9 3h4v4M13 3 7 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {/* Doc name */}\n <div style={{ flex: 1, minWidth: 0 }}>\n {isEditingName ? (\n <input\n ref={nameInputRef}\n defaultValue={docName}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\") handleRename((e.target as HTMLInputElement).value);\n if (e.key === \"Escape\") setIsEditingName(false);\n }}\n onBlur={(e) => handleRename(e.target.value)}\n style={{\n width: \"100%\",\n fontSize: \"13px\",\n fontWeight: 600,\n fontFamily: \"inherit\",\n color: \"var(--color-text, #111827)\",\n background: \"var(--color-panel, #fff)\",\n border: \"1px solid var(--color-selected, #2f80ed)\",\n borderRadius: \"4px\",\n padding: \"1px 4px\",\n outline: \"none\",\n boxSizing: \"border-box\",\n }}\n />\n ) : (\n <span\n onPointerDown={(e) => {\n // Let a plain click start rename without dragging the shape.\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n setIsEditingName(true);\n }}\n title={docName}\n style={{\n display: \"block\",\n fontSize: \"13px\",\n fontWeight: 600,\n color: \"var(--color-text, #111827)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n cursor: \"text\",\n }}\n >\n {docName || \"Untitled\"}\n </span>\n )}\n </div>\n\n {/* Tool picker */}\n {currentTool && (\n <div ref={toolMenuRef} style={{ position: \"relative\", flexShrink: 0 }}>\n <button\n type=\"button\"\n title=\"Choose view\"\n onClick={(e) => {\n e.stopPropagation();\n if (tools.length > 1) setToolMenuOpen((v) => !v);\n }}\n onPointerDown={(e) => e.stopPropagation()}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n maxWidth: \"140px\",\n padding: \"2px 8px\",\n border: \"1px solid var(--color-divider, #e5e7eb)\",\n borderRadius: \"9999px\",\n background: \"var(--color-panel, #fff)\",\n cursor: tools.length > 1 ? \"pointer\" : \"default\",\n fontSize: \"11px\",\n fontWeight: 500,\n color: \"var(--color-text-1, #4b5563)\",\n whiteSpace: \"nowrap\",\n }}\n >\n <span\n style={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}\n >\n {currentTool.name}\n </span>\n {tools.length > 1 && (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" style={{ opacity: 0.6 }}>\n <path\n d=\"M1 2.5 4 5.5 7 2.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n\n {toolMenuOpen && tools.length > 1 && (\n <div\n onPointerDown={(e) => e.stopPropagation()}\n style={{\n position: \"absolute\",\n top: \"100%\",\n right: 0,\n marginTop: \"4px\",\n background: \"var(--color-panel, #fff)\",\n border: \"1px solid var(--color-divider, #e5e7eb)\",\n borderRadius: \"6px\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.12)\",\n padding: \"4px\",\n minWidth: \"140px\",\n zIndex: 10000,\n }}\n >\n {tools.map((t) => (\n <button\n key={t.id}\n type=\"button\"\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handleToolChange(t.id);\n }}\n style={{\n display: \"block\",\n width: \"100%\",\n padding: \"5px 10px\",\n border: \"none\",\n borderRadius: \"4px\",\n background: t.id === currentTool.id ? \"var(--color-selected, #e8f0fe)\" : \"transparent\",\n cursor: \"pointer\",\n fontSize: \"12px\",\n color: \"var(--color-text, #374151)\",\n textAlign: \"left\",\n whiteSpace: \"nowrap\",\n }}\n >\n {t.name}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Content */}\n <div\n ref={contentRef}\n style={{\n flex: 1,\n minHeight: 0,\n overflow: \"hidden\",\n position: \"relative\",\n pointerEvents: isSelectTool ? \"auto\" : \"none\",\n userSelect: isFocused ? \"text\" : \"none\",\n cursor: isFocused ? \"auto\" : undefined,\n }}\n onPointerDown={\n isSelectTool\n ? (e) => {\n e.stopPropagation();\n if (!isEditingShape) editor.setEditingShape(shape.id);\n }\n : undefined\n }\n onPointerUp={\n isSelectTool\n ? (e) => {\n e.stopPropagation();\n // Synthesize a click for frameworks that rely on\n // document-level event delegation (e.g. Solid.js); tldraw's\n // preventDefault on pointerdown suppresses the native click.\n (e.target as HTMLElement)?.dispatchEvent(\n new MouseEvent(\"click\", {\n bubbles: true,\n cancelable: true,\n view: window,\n clientX: e.clientX,\n clientY: e.clientY,\n }),\n );\n }\n : undefined\n }\n >\n {docUrl && isImage ? (\n <img\n src={automergeUrlToServiceWorkerUrl(docUrl as AutomergeUrl)}\n alt={docName}\n style={{ width: \"100%\", height: \"100%\", objectFit: \"contain\" }}\n />\n ) : docUrl ? (\n // @ts-expect-error Custom element from @inkandswitch/patchwork-elements\n <patchwork-view\n doc-url={docUrl}\n {...(toolId ? { \"tool-id\": toolId } : {})}\n key={toolId || \"default\"}\n style={{ display: \"block\", width: \"100%\", height: \"100%\" }}\n />\n ) : (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n color: \"var(--color-text-3, #9ca3af)\",\n fontSize: \"12px\",\n }}\n >\n No document\n </div>\n )}\n </div>\n </div>\n </HTMLContainer>\n );\n}\n\nasync function loadDatatype(id: string): Promise<LoadedDatatype | undefined> {\n try {\n const registry = getRegistry<DatatypeDescription>(\"patchwork:datatype\");\n return (await registry.load(id)) as unknown as LoadedDatatype | undefined;\n } catch {\n return undefined;\n }\n}\n", "/**\n * NewDocTool \u2014 a tldraw tool that lets the user draw a box to create a new\n * embedded Patchwork document of a chosen datatype.\n *\n * Exports:\n * - NewDocShapeTool \u2014 pass to Tldraw `tools`\n * - newDocUiOverrides \u2014 spread into Tldraw `overrides`\n * - NewDocToolbar \u2014 pass as Tldraw `components.Toolbar`\n * - setNewDocToolContext() \u2014 call once per editor when it's ready\n */\n\nimport {\n DefaultToolbar,\n DefaultToolbarContent,\n StateNode,\n createShapeId,\n useEditor,\n useValue,\n type Editor,\n type TLPointerEventInfo,\n type TLUiOverrides,\n type TLUiToolsContextType,\n} from \"@tldraw/tldraw\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { Repo } from \"@automerge/automerge-repo/slim\";\nimport {\n createDocOfDatatype2,\n getRegistry,\n type DatatypeDescription,\n type LoadedDatatype,\n} from \"@inkandswitch/patchwork-plugins\";\nimport { PATCHWORK_DOC_SHAPE_TYPE, makeShapeId } from \"./PatchworkDocShape.tsx\";\n\n// Per-editor context, keyed by editor instance, so a nested canvas embedded in\n// another canvas doesn't clobber the outer one's repo reference.\ninterface NewDocContext {\n repo: Repo;\n}\n\nconst _contextByEditor = new WeakMap<Editor, NewDocContext>();\nlet _selectedDatatypeId = \"\";\n\nexport function setNewDocToolContext(repo: Repo, editor: Editor) {\n _contextByEditor.set(editor, { repo });\n}\n\nexport function setSelectedDatatypeId(id: string) {\n _selectedDatatypeId = id;\n}\n\nfunction getListedDatatypeDescriptions(): DatatypeDescription[] {\n try {\n const registry = getRegistry<DatatypeDescription>(\"patchwork:datatype\");\n return registry.filter((d) => !(d as DatatypeDescription).unlisted) as unknown as DatatypeDescription[];\n } catch {\n return [];\n }\n}\n\nasync function loadDatatype(id: string): Promise<LoadedDatatype | undefined> {\n try {\n const registry = getRegistry<DatatypeDescription>(\"patchwork:datatype\");\n return (await registry.load(id)) as unknown as LoadedDatatype | undefined;\n } catch {\n return undefined;\n }\n}\n\nexport class NewDocShapeTool extends StateNode {\n static override id = \"new-doc\";\n\n private startPoint = { x: 0, y: 0 };\n private previewId: ReturnType<typeof createShapeId> | null = null;\n\n override onPointerDown(_info: TLPointerEventInfo) {\n const { currentPagePoint } = this.editor.inputs;\n this.startPoint = { x: currentPagePoint.x, y: currentPagePoint.y };\n\n this.previewId = createShapeId();\n this.editor.createShape({\n id: this.previewId,\n type: \"geo\",\n x: currentPagePoint.x,\n y: currentPagePoint.y,\n parentId: this.editor.getCurrentPageId(),\n props: { w: 1, h: 1, geo: \"rectangle\", dash: \"dashed\", fill: \"none\" },\n });\n }\n\n override onPointerMove(_info: TLPointerEventInfo) {\n if (!this.previewId) return;\n const { currentPagePoint } = this.editor.inputs;\n const x = Math.min(this.startPoint.x, currentPagePoint.x);\n const y = Math.min(this.startPoint.y, currentPagePoint.y);\n const w = Math.max(1, Math.abs(currentPagePoint.x - this.startPoint.x));\n const h = Math.max(1, Math.abs(currentPagePoint.y - this.startPoint.y));\n this.editor.updateShape({ id: this.previewId, type: \"geo\", x, y, props: { w, h } });\n }\n\n override onCancel() {\n this.cleanup();\n this.editor.setCurrentTool(\"select\");\n }\n\n override onInterrupt() {\n this.cleanup();\n }\n\n private cleanup() {\n if (this.previewId) {\n if (this.editor.getShape(this.previewId)) {\n this.editor.deleteShapes([this.previewId]);\n }\n this.previewId = null;\n }\n }\n\n override onPointerUp(_info: TLPointerEventInfo) {\n if (!this.previewId) return;\n\n const preview = this.editor.getShape(this.previewId);\n this.editor.deleteShapes([this.previewId]);\n this.previewId = null;\n\n if (!preview) {\n this.editor.setCurrentTool(\"select\");\n return;\n }\n\n const px = (preview as { x: number }).x;\n const py = (preview as { y: number }).y;\n const pw = (preview as { props: { w: number } }).props.w;\n const ph = (preview as { props: { h: number } }).props.h;\n\n const finalW = Math.max(pw, 240);\n const finalH = Math.max(ph, 180);\n\n const ctx = _contextByEditor.get(this.editor);\n if (!ctx) {\n console.warn(\"[tldraw5] NewDocTool: context not set for this editor\");\n this.editor.setCurrentTool(\"select\");\n return;\n }\n\n const datatypeId = _selectedDatatypeId;\n if (!datatypeId) {\n console.warn(\"[tldraw5] NewDocTool: no datatype selected\");\n this.editor.setCurrentTool(\"select\");\n return;\n }\n\n const editor = this.editor;\n const repo = ctx.repo;\n const placeholderId = createShapeId();\n\n editor.createShape({\n id: placeholderId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n x: px,\n y: py,\n rotation: 0,\n parentId: editor.getCurrentPageId(),\n props: {\n w: finalW,\n h: finalH,\n docUrl: \"\",\n docName: \"Creating\\u2026\",\n docType: datatypeId,\n toolId: \"\",\n },\n });\n\n editor.setCurrentTool(\"select\");\n editor.setSelectedShapes([placeholderId]);\n\n void (async () => {\n try {\n const datatype = await loadDatatype(datatypeId);\n if (!datatype) throw new Error(`Could not load datatype: ${datatypeId}`);\n\n // `createDocOfDatatype2` in the installed plugins package is typed\n // against an older @automerge/automerge-repo Repo; cast to bridge the\n // version skew (same pattern used by the space / llm-canvas tools).\n const docHandle = await (\n createDocOfDatatype2 as (d: LoadedDatatype, r: unknown) => Promise<{ url: string }>\n )(datatype, repo);\n const docUrl = docHandle.url;\n const deterministicId = makeShapeId(docUrl);\n\n const tempShape = editor.getShape(placeholderId) as\n | { x: number; y: number; props: { w: number; h: number } }\n | undefined;\n const sx = tempShape?.x ?? px;\n const sy = tempShape?.y ?? py;\n const sw = tempShape?.props?.w ?? finalW;\n const sh = tempShape?.props?.h ?? finalH;\n\n if (editor.getShape(placeholderId)) {\n editor.deleteShapes([placeholderId]);\n }\n\n if (editor.getShape(deterministicId)) {\n editor.updateShape({\n id: deterministicId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n props: {\n docUrl,\n docName: datatype.name ?? datatypeId,\n docType: datatypeId,\n toolId: \"\",\n },\n });\n } else {\n editor.createShape({\n id: deterministicId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n x: sx,\n y: sy,\n rotation: 0,\n parentId: editor.getCurrentPageId(),\n props: {\n w: sw,\n h: sh,\n docUrl,\n docName: datatype.name ?? datatypeId,\n docType: datatypeId,\n toolId: \"\",\n },\n });\n }\n\n editor.setSelectedShapes([deterministicId]);\n } catch (err) {\n console.error(\"[tldraw5] new doc creation failed:\", err);\n if (editor.getShape(placeholderId)) {\n editor.updateShape({\n id: placeholderId,\n type: PATCHWORK_DOC_SHAPE_TYPE,\n props: { docName: `Error creating ${datatypeId}` },\n });\n }\n }\n })();\n }\n}\n\nexport const newDocUiOverrides: TLUiOverrides = {\n tools(editor: Editor, tools: TLUiToolsContextType) {\n tools[\"new-doc\"] = {\n id: \"new-doc\",\n icon: \"plus\",\n label: \"New document\",\n kbd: \"c\",\n onSelect() {\n editor.setCurrentTool(\"new-doc\");\n },\n };\n return tools;\n },\n};\n\nexport function NewDocToolbar() {\n const editor = useEditor();\n const isActive = useValue(\"new-doc active\", () => editor.getCurrentToolId() === \"new-doc\", [\n editor,\n ]);\n\n const [datatypes, setDatatypes] = useState<DatatypeDescription[]>([]);\n const [menuOpen, setMenuOpen] = useState(false);\n const [selectedId, setSelectedId] = useState(_selectedDatatypeId);\n const [menuPos, setMenuPos] = useState<{ x: number; y: number } | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const dt = getListedDatatypeDescriptions();\n setDatatypes(dt);\n if (dt.length > 0 && !_selectedDatatypeId) {\n setSelectedDatatypeId(dt[0].id);\n setSelectedId(dt[0].id);\n }\n }, []);\n\n useEffect(() => {\n if (!menuOpen) return;\n const handler = (e: PointerEvent) => {\n const t = e.target as Node;\n if (buttonRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n setMenuOpen(false);\n };\n document.addEventListener(\"pointerdown\", handler, true);\n return () => document.removeEventListener(\"pointerdown\", handler, true);\n }, [menuOpen]);\n\n const openMenu = useCallback(() => {\n if (buttonRef.current) {\n const rect = buttonRef.current.getBoundingClientRect();\n setMenuPos({ x: rect.left + rect.width / 2, y: rect.top });\n }\n setDatatypes(getListedDatatypeDescriptions());\n setMenuOpen(true);\n }, []);\n\n const handlePlusClick = useCallback(() => {\n if (datatypes.length > 0 && !_selectedDatatypeId) {\n setSelectedDatatypeId(datatypes[0].id);\n setSelectedId(datatypes[0].id);\n }\n editor.setCurrentTool(\"new-doc\");\n if (datatypes.length > 1) {\n if (menuOpen) setMenuOpen(false);\n else requestAnimationFrame(openMenu);\n }\n }, [datatypes, editor, menuOpen, openMenu]);\n\n const handlePick = useCallback(\n (id: string) => {\n setSelectedDatatypeId(id);\n setSelectedId(id);\n setMenuOpen(false);\n editor.setCurrentTool(\"new-doc\");\n },\n [editor],\n );\n\n if (datatypes.length === 0) {\n return (\n <DefaultToolbar>\n <DefaultToolbarContent />\n </DefaultToolbar>\n );\n }\n\n const selectedName = datatypes.find((d) => d.id === selectedId)?.name ?? \"document\";\n\n return (\n <DefaultToolbar>\n <DefaultToolbarContent />\n\n <div style={{ width: \"1px\", height: \"20px\", background: \"#ddd\", margin: \"0 4px\", flexShrink: 0 }} />\n\n <div\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={handlePlusClick}\n title={`New document (${selectedName})`}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"32px\",\n height: \"32px\",\n border: \"none\",\n borderRadius: \"6px\",\n background: isActive || menuOpen ? \"var(--color-selected, #e8f0fe)\" : \"transparent\",\n cursor: \"pointer\",\n color: isActive || menuOpen ? \"var(--color-selected-contrast, #2f80ed)\" : \"currentColor\",\n flexShrink: 0,\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 2v12M2 8h12\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" />\n </svg>\n </button>\n\n {menuOpen &&\n menuPos &&\n datatypes.length > 1 &&\n createPortal(\n <div\n ref={menuRef}\n style={{\n position: \"fixed\",\n left: menuPos.x,\n top: menuPos.y,\n transform: \"translate(-50%, -100%)\",\n marginTop: \"-8px\",\n background: \"#fff\",\n border: \"1px solid #ddd\",\n borderRadius: \"8px\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.12)\",\n padding: \"4px\",\n minWidth: \"160px\",\n zIndex: 100000,\n }}\n >\n {datatypes.map((dt) => (\n <button\n key={dt.id}\n type=\"button\"\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handlePick(dt.id);\n }}\n style={{\n display: \"block\",\n width: \"100%\",\n padding: \"6px 10px\",\n border: \"none\",\n borderRadius: \"4px\",\n background: dt.id === selectedId ? \"#e8f0fe\" : \"transparent\",\n cursor: \"pointer\",\n fontSize: \"13px\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#333\",\n textAlign: \"left\",\n whiteSpace: \"nowrap\",\n }}\n >\n {dt.name}\n </button>\n ))}\n </div>,\n document.body,\n )}\n </div>\n </DefaultToolbar>\n );\n}\n", "/**\n * Patchwork drag-and-drop payload parsing.\n *\n * Patchwork document drags (from the folder-tree-view / sideboard and most\n * tools) carry these DataTransfer formats:\n * - `text/x-patchwork-urls` \u2014 JSON `AutomergeUrl[]` (the detection hook)\n * - `text/x-patchwork-dnd` \u2014 JSON `{ source, items: [{ id, url, type, name }] }`\n * - `text/uri-list` / `text/plain` \u2014 one Patchwork web link per line\n *\n * Only `text/x-patchwork-urls` is guaranteed; the richer `-dnd` payload, when\n * present, gives us the datatype id and display name without a repo lookup.\n */\n\nimport {\n isValidAutomergeUrl,\n parseAutomergeUrl,\n stringifyAutomergeUrl,\n type AutomergeUrl,\n type DocumentId,\n} from \"@automerge/automerge-repo/slim\";\n\nexport const PATCHWORK_URLS_MIME = \"text/x-patchwork-urls\" as const;\nexport const PATCHWORK_DND_MIME = \"text/x-patchwork-dnd\" as const;\n\nexport interface DroppedDoc {\n url: AutomergeUrl;\n /** Datatype id (from the `-dnd` payload), if known. */\n type?: string;\n /** Display name (from the `-dnd` payload), if known. */\n name?: string;\n}\n\n/** True when the drag carries Patchwork document URLs. */\nexport function isPatchworkDrag(types: readonly string[]): boolean {\n return types.includes(PATCHWORK_URLS_MIME);\n}\n\ntype DndItem = { url?: unknown; type?: unknown; name?: unknown };\ntype DndPayload = { items?: DndItem[] };\n\n/** Extract the dropped documents, preferring the richest payload available. */\nexport function parseDroppedDocs(dt: DataTransfer | null): DroppedDoc[] {\n if (!dt) return [];\n\n // 1. Structured payload with datatype + name.\n const dnd = dt.getData(PATCHWORK_DND_MIME);\n if (dnd) {\n try {\n const parsed = JSON.parse(dnd) as DndPayload;\n const items = (parsed.items ?? [])\n .map((it): DroppedDoc | null => {\n const url = typeof it.url === \"string\" ? it.url : undefined;\n if (!url || !isValidAutomergeUrl(url)) return null;\n return {\n url,\n type: typeof it.type === \"string\" ? it.type : undefined,\n name: typeof it.name === \"string\" ? it.name : undefined,\n };\n })\n .filter((it): it is DroppedDoc => it !== null);\n if (items.length > 0) return dedupe(items);\n } catch {\n // fall through\n }\n }\n\n // 2. Bare URL list.\n const urls = dt.getData(PATCHWORK_URLS_MIME);\n if (urls) {\n try {\n const parsed: unknown = JSON.parse(urls);\n const items = (Array.isArray(parsed) ? parsed : [])\n .filter((u): u is AutomergeUrl => typeof u === \"string\" && isValidAutomergeUrl(u))\n .map((url) => ({ url }));\n if (items.length > 0) return dedupe(items);\n } catch {\n // fall through\n }\n }\n\n // 3. Plain-text / uri-list fallback (external links, \"#doc=<id>\" form).\n const text = dt.getData(\"text/uri-list\") || dt.getData(\"text/plain\");\n if (text) {\n const items = text\n .split(/\\r?\\n/)\n .map(urlFromText)\n .filter((url): url is AutomergeUrl => url !== null)\n .map((url) => ({ url }));\n if (items.length > 0) return dedupe(items);\n }\n\n return [];\n}\n\nfunction dedupe(items: DroppedDoc[]): DroppedDoc[] {\n const seen = new Set<string>();\n const out: DroppedDoc[] = [];\n for (const it of items) {\n if (seen.has(it.url)) continue;\n seen.add(it.url);\n out.push(it);\n }\n return out;\n}\n\n// Accept `automerge:\u2026` directly, or a Patchwork web link containing\n// `#doc=<documentId>` / `?doc=<documentId>`.\nfunction urlFromText(line: string): AutomergeUrl | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) return null;\n if (isValidAutomergeUrl(trimmed)) return trimmed;\n\n const match = trimmed.match(/[#?&]doc=([^&\\s]+)/);\n if (match) {\n const raw = decodeURIComponent(match[1]);\n if (isValidAutomergeUrl(raw)) return raw;\n try {\n const url = stringifyAutomergeUrl({ documentId: raw as DocumentId });\n // Round-trip to reject malformed ids.\n parseAutomergeUrl(url);\n return url;\n } catch {\n return null;\n }\n }\n return null;\n}\n", "// A tldraw4 document opened in this tool is offered a one-way migration to\n// tldraw5. The migration runs tldraw's own schema migrations by loading the\n// stored snapshot into a v5 store, then writes the migrated records back and\n// retypes the document.\n//\n// It has to be offered rather than done implicitly: mounting a v5 store on a v4\n// document migrates the records in memory, and the store->Automerge sync would\n// then write them back the moment anything moved. The gate in `tool.tsx` runs\n// before that store exists.\n\nimport { useState } from \"react\";\nimport { createTLStore, defaultShapeUtils } from \"@tldraw/tldraw\";\nimport {\n getRegistry,\n type DatatypeDescription,\n} from \"@inkandswitch/patchwork-plugins\";\nimport type { DocHandle } from \"@automerge/react\";\n\nimport type { TLDrawDoc } from \"./datatype.ts\";\nimport { PatchworkDocShapeUtil } from \"./PatchworkDocShape.tsx\";\n\nexport const TLDRAW4_TYPE = \"tldraw4\";\nexport const TLDRAW5_TYPE = \"tldraw5\";\n\ntype PatchworkMeta = {\n \"@patchwork\"?: { type?: string; suggestedImportUrl?: string };\n};\n\nexport function getDocType(doc: unknown): string | undefined {\n return (doc as PatchworkMeta | undefined)?.[\"@patchwork\"]?.type;\n}\n\nfunction tldraw5ImportUrl(): string | undefined {\n try {\n const registry = getRegistry<DatatypeDescription>(\"patchwork:datatype\");\n return registry.get(TLDRAW5_TYPE)?.importUrl;\n } catch {\n return undefined;\n }\n}\n\nexport function migrateToTldraw5(handle: DocHandle<TLDrawDoc>) {\n const doc = handle.doc();\n if (!doc) throw new Error(\"document not loaded\");\n\n const store = createTLStore({\n shapeUtils: [...defaultShapeUtils, PatchworkDocShapeUtil],\n });\n store.loadStoreSnapshot({\n store: JSON.parse(JSON.stringify(doc.store)),\n schema: JSON.parse(JSON.stringify(doc.schema)),\n });\n\n // Through JSON so the snapshot carries no `undefined`, which Automerge\n // refuses to store.\n const snapshot = JSON.parse(\n JSON.stringify(store.getStoreSnapshot())\n ) as TLDrawDoc;\n const importUrl = tldraw5ImportUrl();\n\n handle.change((d) => {\n d.store = snapshot.store;\n d.schema = snapshot.schema;\n const meta = (d as TLDrawDoc & PatchworkMeta)[\"@patchwork\"];\n if (meta) {\n meta.type = TLDRAW5_TYPE;\n if (importUrl) meta.suggestedImportUrl = importUrl;\n }\n });\n}\n\nexport function MigratePrompt({\n handle,\n readOnly,\n}: {\n handle: DocHandle<TLDrawDoc>;\n readOnly: boolean;\n}) {\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n\n const onMigrate = () => {\n setBusy(true);\n setError(null);\n try {\n migrateToTldraw5(handle);\n } catch (err) {\n console.error(\"[tldraw5] migration failed\", err);\n setError(String(err));\n setBusy(false);\n }\n };\n\n return (\n <div className=\"tldraw5-migrate\">\n <h2>This is a tldraw 4 document</h2>\n <p>\n Migrating rewrites its shapes to the tldraw 5 schema and retypes the\n document, so the tldraw 4 tool will no longer open it. Anyone else with\n this document is affected too.\n </p>\n <p>\n <strong>There is no undo for this</strong> \u2014 copy the document first if\n you want to keep a tldraw 4 version.\n </p>\n {readOnly ? (\n <p data-note>\n This view is pinned to a point in history and can't be written to.\n Open the document at its latest version to migrate it.\n </p>\n ) : (\n <button type=\"button\" onClick={onMigrate} disabled={busy}>\n {busy ? \"Migrating\u2026\" : \"Migrate to tldraw 5\"}\n </button>\n )}\n {error && <p data-error>{error}</p>}\n </div>\n );\n}\n", "// tldraw wants an explicit \"light\" | \"dark\". Take it from the CSS context\n// rather than from the OS: Patchwork themes declare `color-scheme`, and that\n// property inherits, so its computed value on our element is whatever the\n// closest theme says. A theme that names both (`light dark`) or names nothing\n// is deferring to the OS, so we do too.\n\nimport { useEffect, useState } from \"react\";\n\nexport type ColorScheme = \"light\" | \"dark\";\n\nfunction prefersDark() {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n}\n\nexport function resolveColorScheme(element: HTMLElement): ColorScheme {\n const scheme = getComputedStyle(element).colorScheme;\n const dark = /\\bdark\\b/.test(scheme);\n const light = /\\blight\\b/.test(scheme);\n if (dark && !light) return \"dark\";\n if (light && !dark) return \"light\";\n return prefersDark() ? \"dark\" : \"light\";\n}\n\nexport function useColorScheme(element: HTMLElement): ColorScheme {\n const [scheme, setScheme] = useState<ColorScheme>(() =>\n resolveColorScheme(element)\n );\n\n useEffect(() => {\n const update = () => setScheme(resolveColorScheme(element));\n update();\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n media.addEventListener(\"change\", update);\n\n // Switching themes swaps stylesheets and sets an attribute on <html>;\n // neither fires an event, so watch for both.\n const observer = new MutationObserver(update);\n observer.observe(document.documentElement, { attributes: true });\n observer.observe(document.head, { childList: true, subtree: true });\n\n return () => {\n media.removeEventListener(\"change\", update);\n observer.disconnect();\n };\n }, [element]);\n\n return scheme;\n}\n", "// Import/export of `.tldraw` archives (the offline.tldraw.com format).\n//\n// Import creates a new Patchwork tldraw5 document from the archive; export\n// writes the current document back out as an archive.\n\nimport { createContext, useContext, type FC, type ReactNode } from \"react\";\nimport { useRepo, type DocHandle, type Repo } from \"@automerge/react\";\nimport {\n DefaultMainMenu,\n DefaultMainMenuContent,\n TldrawUiMenuGroup,\n TldrawUiMenuItem,\n useToasts,\n type TLRecord,\n type SerializedStore,\n} from \"@tldraw/tldraw\";\nimport {\n createDocOfDatatype2,\n getRegistry,\n type DatatypeDescription,\n type LoadedDatatype,\n} from \"@inkandswitch/patchwork-plugins\";\n\nimport type { TLDrawDoc } from \"./datatype.ts\";\nimport { getTitle } from \"./datatype.ts\";\nimport { PATCHWORK_DOC_SHAPE_TYPE } from \"./PatchworkDocShape.tsx\";\n\n// `tldr-archive` pulls in the SQLite wasm build, so it is only fetched when\n// the user actually imports or exports.\nconst archiveModule = () => import(\"./tldr-archive.ts\");\n\nexport const ARCHIVE_EXTENSIONS = [\".tldraw\", \".tldr\"];\nconst SCRIPT_ENTRY = \"main.js\";\n\nexport function isTldrArchiveFile(file: File) {\n const name = file.name.toLowerCase();\n return ARCHIVE_EXTENSIONS.some((ext) => name.endsWith(ext));\n}\n\n/** Creates a new Patchwork document from a `.tldraw` archive, returning its url. */\nexport async function importArchiveFile(\n file: File,\n repo: Repo\n): Promise<string> {\n const bytes = new Uint8Array(await file.arrayBuffer());\n const { readTldrArchive } = await archiveModule();\n const archive = await readTldrArchive(bytes, baseName(file.name));\n\n const { extractScriptFiles, storeScriptFiles } = await import(\"./script.ts\");\n const docs = await storeScriptFiles(repo, extractScriptFiles(archive.files));\n\n const pageId = Object.keys(archive.store).find((id) => id.startsWith(\"page:\"));\n if (pageId) {\n (archive.store as Record<string, { name: string }>)[pageId].name =\n archive.displayName;\n }\n\n const registry = getRegistry<DatatypeDescription>(\"patchwork:datatype\");\n const datatype = (await registry.load(\"tldraw5\")) as unknown as\n | LoadedDatatype\n | undefined;\n if (!datatype) throw new Error(\"could not load the tldraw5 datatype\");\n\n // `createDocOfDatatype2` in the installed plugins package is typed against an\n // older @automerge/automerge-repo Repo; cast to bridge the version skew.\n const handle = await (\n createDocOfDatatype2 as (\n d: LoadedDatatype,\n r: unknown,\n change: (doc: TLDrawDoc) => void\n ) => Promise<{ url: string }>\n )(datatype, repo, (doc) => {\n doc.store = archive.store;\n doc.schema = archive.schema;\n doc.docs = docs;\n });\n\n return handle.url;\n}\n\nfunction baseName(fileName: string) {\n for (const ext of ARCHIVE_EXTENSIONS) {\n if (fileName.toLowerCase().endsWith(ext)) {\n return fileName.slice(0, -ext.length);\n }\n }\n return fileName;\n}\n\nexport function pickArchiveFile(): Promise<File | null> {\n return new Promise((resolve) => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = ARCHIVE_EXTENSIONS.join(\",\");\n input.style.display = \"none\";\n input.addEventListener(\"change\", () => {\n resolve(input.files?.[0] ?? null);\n input.remove();\n });\n input.addEventListener(\"cancel\", () => {\n resolve(null);\n input.remove();\n });\n document.body.append(input);\n input.click();\n });\n}\n\nfunction download(bytes: Uint8Array, fileName: string) {\n const url = URL.createObjectURL(\n new Blob([bytes as BlobPart], { type: \"application/zip\" })\n );\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = fileName;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\n// Embedded Patchwork documents have no meaning outside Patchwork, and a store\n// containing an unknown shape type fails to load in stock tldraw \u2014 so they are\n// left out of the archive.\nfunction withoutEmbeddedDocs(store: SerializedStore<TLRecord>) {\n const kept = {} as Record<string, TLRecord>;\n let dropped = 0;\n for (const [id, record] of Object.entries(store) as [string, TLRecord][]) {\n if ((record as { type?: string }).type === PATCHWORK_DOC_SHAPE_TYPE) {\n dropped++;\n continue;\n }\n kept[id] = record;\n }\n return { store: kept as SerializedStore<TLRecord>, dropped };\n}\n\nexport async function exportDoc(handle: DocHandle<TLDrawDoc>, repo: Repo) {\n const doc = handle.doc();\n if (!doc) throw new Error(\"document not loaded\");\n\n const snapshot = JSON.parse(JSON.stringify(doc)) as TLDrawDoc;\n const title = getTitle(snapshot) || \"Untitled\";\n const { store, dropped } = withoutEmbeddedDocs(snapshot.store);\n\n const scriptFiles = doc.docs?.length\n ? await (await import(\"./script.ts\")).readScriptFiles(repo, doc.docs)\n : undefined;\n\n const { writeTldrArchive } = await archiveModule();\n const bytes = await writeTldrArchive({\n displayName: title,\n store,\n schema: snapshot.schema,\n scriptFiles,\n });\n download(bytes, `${title}.tldraw`);\n return { dropped };\n}\n\n// React 18's types reject tldraw's menu-group return type; it renders fine.\nconst MenuGroup = TldrawUiMenuGroup as unknown as FC<{\n id: string;\n children?: ReactNode;\n}>;\n\nexport const TldrFileContext = createContext<{\n handle: DocHandle<TLDrawDoc>;\n element: HTMLElement;\n} | null>(null);\n\nexport function TldrFileMainMenu() {\n const context = useContext(TldrFileContext);\n const repo = useRepo();\n const { addToast } = useToasts();\n\n const onImport = async () => {\n try {\n const file = await pickArchiveFile();\n if (!file || !context) return;\n const url = await importArchiveFile(file, repo);\n context.element.dispatchEvent(\n new CustomEvent(\"patchwork:open-document\", {\n detail: { url, toolId: \"tldraw5\" },\n bubbles: true,\n composed: true,\n })\n );\n } catch (error) {\n console.error(\"[tldraw5] import failed\", error);\n addToast({ title: \"Import failed\", description: String(error) });\n }\n };\n\n const onExport = async () => {\n try {\n if (!context) return;\n const { dropped } = await exportDoc(context.handle, repo);\n if (dropped > 0) {\n addToast({\n title: \"Exported without embedded documents\",\n description: `${dropped} embedded Patchwork document${\n dropped === 1 ? \"\" : \"s\"\n } left out \u2014 stock tldraw can't read them.`,\n });\n }\n } catch (error) {\n console.error(\"[tldraw5] export failed\", error);\n addToast({ title: \"Export failed\", description: String(error) });\n }\n };\n\n // `main.js` may sit behind nested folder documents, so finding it is async.\n const docs = context?.handle.doc()?.docs;\n const hasScript = !!docs?.some((link) => link.name === SCRIPT_ENTRY);\n\n const onOpenScript = async () => {\n if (!context || !docs) return;\n try {\n const { resolveScriptFiles } = await import(\"./script.ts\");\n const url = (await resolveScriptFiles(repo, docs))[SCRIPT_ENTRY];\n if (!url) return;\n context.element.dispatchEvent(\n new CustomEvent(\"patchwork:open-document\", {\n detail: { url },\n bubbles: true,\n composed: true,\n })\n );\n } catch (error) {\n console.error(\"[tldraw5] could not open the script\", error);\n }\n };\n\n return (\n <DefaultMainMenu>\n <MenuGroup id=\"tldraw-archive\">\n {hasScript && (\n <TldrawUiMenuItem\n id=\"open-tldraw-script\"\n label={`Open ${SCRIPT_ENTRY}`}\n readonlyOk\n onSelect={onOpenScript}\n />\n )}\n <TldrawUiMenuItem\n id=\"import-tldraw-archive\"\n label=\"Import .tldraw file\u2026\"\n readonlyOk\n onSelect={onImport}\n />\n <TldrawUiMenuItem\n id=\"export-tldraw-archive\"\n label=\"Export .tldraw file\"\n readonlyOk\n onSelect={onExport}\n />\n </MenuGroup>\n <DefaultMainMenuContent />\n </DefaultMainMenu>\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["require_ms", "parse", "require_common", "debug", "require_browser", "REGEX", "view", "sha256n", "encode", "decode", "basex", "base58", "bs58checkBase", "parse", "debug", "handle", "__toESM", "peerStates", "heartbeats", "initialState", "peerMetadata", "NetworkAdapter", "s", "NetworkAdapter", "debug", "import_debug", "NetworkAdapter", "import_debug", "NetworkAdapter", "log", "debug", "import_react", "RepoContext", "isBytes", "abytes", "aexists", "aoutput", "clean", "createView", "rotr", "utf8ToBytes", "toBytes", "Hash", "createHasher", "setBigUint64", "view", "Chi", "Maj", "HashMD", "SHA256_IV", "SHA256_K", "SHA256_W", "SHA256", "sha256", "sha256n", "base", "encode", "decode", "esm_default$1", "basex", "base_default", "base58", "sha256x2", "esm_default", "bs58checkBase", "parse", "require_ms", "debug", "require_common", "peerEvents", "__toESM", "__commonJSMin", "usePresence", "PeerStateView", "Presence", "initialState", "store", "doc", "usePresence", "import_react", "automergeUrlToServiceWorkerUrl", "import_react", "view", "import_react", "DiffShapeWrapper", "import_react", "import_jsx_runtime", "import_react", "import_react", "getRegistry", "import_jsx_runtime", "getRegistry", "loadDatatype", "isValidAutomergeUrl", "parseAutomergeUrl", "stringifyAutomergeUrl", "import_react", "getRegistry", "import_jsx_runtime", "getRegistry", "import_react", "import_react", "createDocOfDatatype2", "getRegistry", "import_jsx_runtime", "getRegistry", "createDocOfDatatype2", "import_jsx_runtime", "config", "automergeUrlToServiceWorkerUrl"]
7
7
  }