holosphere 2.0.0-alpha11 → 2.0.0-alpha13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{2019-D2OG2idw.js → 2019-CLMqIAfQ.js} +1722 -1668
- package/dist/{2019-D2OG2idw.js.map → 2019-CLMqIAfQ.js.map} +1 -1
- package/dist/2019-Cp3uYhyY.cjs +8 -0
- package/dist/{2019-EION3wKo.cjs.map → 2019-Cp3uYhyY.cjs.map} +1 -1
- package/dist/browser-D6cNVl0v.cjs +2 -0
- package/dist/{browser-Cq59Ij19.cjs.map → browser-D6cNVl0v.cjs.map} +1 -1
- package/dist/{browser-BSniCNqO.js → browser-nUQt1cnB.js} +2 -2
- package/dist/{browser-BSniCNqO.js.map → browser-nUQt1cnB.js.map} +1 -1
- package/dist/cjs/holosphere.cjs +1 -1
- package/dist/esm/holosphere.js +67 -50
- package/dist/{index-D-jZhliX.js → index-BN_uoxQK.js} +20324 -735
- package/dist/index-BN_uoxQK.js.map +1 -0
- package/dist/{index-Bl6rM1NW.js → index-CoAjtqsD.js} +2 -2
- package/dist/{index-Bl6rM1NW.js.map → index-CoAjtqsD.js.map} +1 -1
- package/dist/{index-Bwg3OzRM.cjs → index-Cp3tI53z.cjs} +3 -3
- package/dist/{index-Bwg3OzRM.cjs.map → index-Cp3tI53z.cjs.map} +1 -1
- package/dist/index-DJjGSwXG.cjs +13 -0
- package/dist/index-DJjGSwXG.cjs.map +1 -0
- package/dist/index-V8EHMYEY.cjs +29 -0
- package/dist/index-V8EHMYEY.cjs.map +1 -0
- package/dist/index-Z5TstN1e.js +11663 -0
- package/dist/index-Z5TstN1e.js.map +1 -0
- package/dist/indexeddb-storage-CZK5A7XH.cjs +2 -0
- package/dist/indexeddb-storage-CZK5A7XH.cjs.map +1 -0
- package/dist/{indexeddb-storage-5eiUNsHC.js → indexeddb-storage-bpA01pAU.js} +39 -2
- package/dist/indexeddb-storage-bpA01pAU.js.map +1 -0
- package/dist/{memory-storage-DMt36uZO.cjs → memory-storage-B1k8Jszd.cjs} +2 -2
- package/dist/{memory-storage-DMt36uZO.cjs.map → memory-storage-B1k8Jszd.cjs.map} +1 -1
- package/dist/{memory-storage-CI-gfmuG.js → memory-storage-BqhmytP_.js} +2 -2
- package/dist/{memory-storage-CI-gfmuG.js.map → memory-storage-BqhmytP_.js.map} +1 -1
- package/docs/FEDERATION.md +474 -0
- package/package.json +3 -1
- package/src/crypto/nostr-utils.js +7 -0
- package/src/crypto/secp256k1.js +104 -38
- package/src/federation/capabilities.js +162 -0
- package/src/federation/card-storage.js +376 -0
- package/src/federation/handshake.js +561 -9
- package/src/federation/hologram.js +194 -57
- package/src/federation/holon-registry.js +187 -0
- package/src/federation/index.js +68 -0
- package/src/federation/registry.js +164 -6
- package/src/federation/request-card.js +373 -0
- package/src/hierarchical/upcast.js +19 -3
- package/src/index.js +209 -75
- package/src/lib/federation-methods.js +527 -5
- package/src/storage/indexeddb-storage.js +41 -0
- package/src/storage/nostr-async.js +14 -5
- package/src/storage/nostr-client.js +471 -155
- package/src/storage/nostr-wrapper.js +6 -3
- package/dist/2019-EION3wKo.cjs +0 -8
- package/dist/_commonjsHelpers-C37NGDzP.cjs +0 -2
- package/dist/_commonjsHelpers-C37NGDzP.cjs.map +0 -1
- package/dist/_commonjsHelpers-CUmg6egw.js +0 -7
- package/dist/_commonjsHelpers-CUmg6egw.js.map +0 -1
- package/dist/browser-Cq59Ij19.cjs +0 -2
- package/dist/index-D-jZhliX.js.map +0 -1
- package/dist/index-Dc6Z8Aob.cjs +0 -18
- package/dist/index-Dc6Z8Aob.cjs.map +0 -1
- package/dist/indexeddb-storage-5eiUNsHC.js.map +0 -1
- package/dist/indexeddb-storage-FNFUVvTJ.cjs +0 -2
- package/dist/indexeddb-storage-FNFUVvTJ.cjs.map +0 -1
- package/dist/secp256k1-CEwJNcfV.js +0 -1890
- package/dist/secp256k1-CEwJNcfV.js.map +0 -1
- package/dist/secp256k1-CiEONUnj.cjs +0 -12
- package/dist/secp256k1-CiEONUnj.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-Z5TstN1e.js","sources":["../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/node_modules/@noble/hashes/esm/crypto.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/node_modules/@noble/hashes/esm/utils.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/node_modules/@noble/hashes/esm/_md.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/node_modules/@noble/hashes/esm/sha2.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/node_modules/@noble/hashes/esm/hmac.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/node_modules/@noble/curves/esm/utils.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/node_modules/@noble/curves/esm/abstract/modular.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/node_modules/@noble/curves/esm/abstract/curve.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/node_modules/@noble/curves/esm/abstract/weierstrass.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/node_modules/@noble/curves/esm/_shortw_utils.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/node_modules/@noble/curves/esm/secp256k1.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/node_modules/@noble/hashes/esm/sha256.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/nostr-tools/lib/esm/nip19.js","../node_modules/@nostr-dev-kit/ndk-cache-dexie/node_modules/@nostr-dev-kit/ndk/dist/index.mjs","../node_modules/dexie/dist/dexie.min.js","../node_modules/dexie/import-wrapper-prod.mjs","../node_modules/@nostr-dev-kit/ndk-cache-dexie/dist/index.mjs"],"sourcesContent":["export const crypto = typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;\n//# sourceMappingURL=crypto.js.map","/**\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 * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, Hash, toBytes } from \"./utils.js\";\nexport class HMAC extends Hash {\n constructor(hash, _key) {\n super();\n this.finished = false;\n this.destroyed = false;\n ahash(hash);\n const key = toBytes(_key);\n this.iHash = hash.create();\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create();\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf) {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out) {\n aexists(this);\n abytes(out, this.outputLen);\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest() {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to) {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to || (to = Object.create(Object.getPrototypeOf(this), {}));\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n destroy() {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest();\nhmac.create = (hash, key) => new HMAC(hash, key);\n//# sourceMappingURL=hmac.js.map","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { abytes as abytes_, bytesToHex as bytesToHex_, concatBytes as concatBytes_, hexToBytes as hexToBytes_, isBytes as isBytes_, } from '@noble/hashes/utils.js';\nexport { abytes, anumber, bytesToHex, bytesToUtf8, concatBytes, hexToBytes, isBytes, randomBytes, utf8ToBytes, } from '@noble/hashes/utils.js';\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nexport function abool(title, value) {\n if (typeof value !== 'boolean')\n throw new Error(title + ' boolean expected, got ' + value);\n}\n// tmp name until v2\nexport function _abool2(value, title = '') {\n if (typeof value !== 'boolean') {\n const prefix = title && `\"${title}\"`;\n throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n }\n return value;\n}\n// tmp name until v2\n/** Asserts something is Uint8Array. */\nexport function _abytes2(value, length, title = '') {\n const bytes = isBytes_(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n// Used in weierstrass, der\nexport function numberToHexUnpadded(num) {\n const hex = num.toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\nexport function hexToNumber(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes) {\n return hexToNumber(bytesToHex_(bytes));\n}\nexport function bytesToNumberLE(bytes) {\n abytes_(bytes);\n return hexToNumber(bytesToHex_(Uint8Array.from(bytes).reverse()));\n}\nexport function numberToBytesBE(n, len) {\n return hexToBytes_(n.toString(16).padStart(len * 2, '0'));\n}\nexport function numberToBytesLE(n, len) {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n) {\n return hexToBytes_(numberToHexUnpadded(n));\n}\n/**\n * Takes hex string or Uint8Array, converts to Uint8Array.\n * Validates output length.\n * Will throw error for other types.\n * @param title descriptive title for an error e.g. 'secret key'\n * @param hex hex string or Uint8Array\n * @param expectedLength optional, will compare to result array's length\n * @returns\n */\nexport function ensureBytes(title, hex, expectedLength) {\n let res;\n if (typeof hex === 'string') {\n try {\n res = hexToBytes_(hex);\n }\n catch (e) {\n throw new Error(title + ' must be hex string or Uint8Array, cause: ' + e);\n }\n }\n else if (isBytes_(hex)) {\n // Uint8Array.from() instead of hash.slice() because node.js Buffer\n // is instance of Uint8Array, and its slice() creates **mutable** copy\n res = Uint8Array.from(hex);\n }\n else {\n throw new Error(title + ' must be hex string or Uint8Array');\n }\n const len = res.length;\n if (typeof expectedLength === 'number' && len !== expectedLength)\n throw new Error(title + ' of length ' + expectedLength + ' expected, got ' + len);\n return res;\n}\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a, b) {\n if (a.length !== b.length)\n return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++)\n diff |= a[i] ^ b[i];\n return diff === 0;\n}\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nexport function copyBytes(bytes) {\n return Uint8Array.from(bytes);\n}\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as utf8ToBytes for ASCII or throws.\n */\nexport function asciiToBytes(ascii) {\n return Uint8Array.from(ascii, (c, i) => {\n const charCode = c.charCodeAt(0);\n if (c.length !== 1 || charCode > 127) {\n throw new Error(`string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`);\n }\n return charCode;\n });\n}\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\n// export const utf8ToBytes: typeof utf8ToBytes_ = utf8ToBytes_;\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\n// export const bytesToUtf8: typeof bytesToUtf8_ = bytesToUtf8_;\n// Is positive bigint\nconst isPosBig = (n) => typeof n === 'bigint' && _0n <= n;\nexport function inRange(n, min, max) {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title, n, min, max) {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n// Bit operations\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n) {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1)\n ;\n return len;\n}\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n, pos) {\n return (n >> BigInt(pos)) & _1n;\n}\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n, pos, value) {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n) => (_1n << BigInt(n)) - _1n;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG<Key>(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg(hashLen, qByteLen, hmacFn) {\n if (typeof hashLen !== 'number' || hashLen < 2)\n throw new Error('hashLen must be a number');\n if (typeof qByteLen !== 'number' || qByteLen < 2)\n throw new Error('qByteLen must be a number');\n if (typeof hmacFn !== 'function')\n throw new Error('hmacFn must be a function');\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n const u8n = (len) => new Uint8Array(len); // creates Uint8Array\n const u8of = (byte) => Uint8Array.of(byte); // another shortcut\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...b) => hmacFn(k, v, ...b); // hmac(k)(v, ...values)\n const reseed = (seed = u8n(0)) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(u8of(0x00), seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0)\n return;\n k = h(u8of(0x01), seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= 1000)\n throw new Error('drbg: tried 1000 values');\n let len = 0;\n const out = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes_(...out);\n };\n const genUntil = (seed, pred) => {\n reset();\n reseed(seed); // Steps D-G\n let res = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen())))\n reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n// Validating curves and fields\nconst validatorFns = {\n bigint: (val) => typeof val === 'bigint',\n function: (val) => typeof val === 'function',\n boolean: (val) => typeof val === 'boolean',\n string: (val) => typeof val === 'string',\n stringOrUint8Array: (val) => typeof val === 'string' || isBytes_(val),\n isSafeInteger: (val) => Number.isSafeInteger(val),\n array: (val) => Array.isArray(val),\n field: (val, object) => object.Fp.isValid(val),\n hash: (val) => typeof val === 'function' && Number.isSafeInteger(val.outputLen),\n};\n// type Record<K extends string | number | symbol, T> = { [P in K]: T; }\nexport function validateObject(object, validators, optValidators = {}) {\n const checkField = (fieldName, type, isOptional) => {\n const checkVal = validatorFns[type];\n if (typeof checkVal !== 'function')\n throw new Error('invalid validator function');\n const val = object[fieldName];\n if (isOptional && val === undefined)\n return;\n if (!checkVal(val, object)) {\n throw new Error('param ' + String(fieldName) + ' is invalid. Expected ' + type + ', got ' + val);\n }\n };\n for (const [fieldName, type] of Object.entries(validators))\n checkField(fieldName, type, false);\n for (const [fieldName, type] of Object.entries(optValidators))\n checkField(fieldName, type, true);\n return object;\n}\n// validate type tests\n// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };\n// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!\n// // Should fail type-check\n// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });\n// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });\n// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });\n// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });\nexport function isHash(val) {\n return typeof val === 'function' && Number.isSafeInteger(val.outputLen);\n}\nexport function _validateObject(object, fields, optFields = {}) {\n if (!object || typeof object !== 'object')\n throw new Error('expected valid options object');\n function checkField(fieldName, expectedType, isOpt) {\n const val = object[fieldName];\n if (isOpt && val === undefined)\n return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n }\n Object.entries(fields).forEach(([k, v]) => checkField(k, v, false));\n Object.entries(optFields).forEach(([k, v]) => checkField(k, v, true));\n}\n/**\n * throws not implemented error\n */\nexport const notImplemented = () => {\n throw new Error('not implemented');\n};\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized(fn) {\n const map = new WeakMap();\n return (arg, ...args) => {\n const val = map.get(arg);\n if (val !== undefined)\n return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n//# sourceMappingURL=utils.js.map","/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { _validateObject, anumber, bitMask, bytesToNumberBE, bytesToNumberLE, ensureBytes, numberToBytesBE, numberToBytesLE, } from \"../utils.js\";\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = /* @__PURE__ */ BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5), _7n = /* @__PURE__ */ BigInt(7);\n// prettier-ignore\nconst _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9), _16n = /* @__PURE__ */ BigInt(16);\n// Calculates a modulo b\nexport function mod(a, b) {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num, power, modulo) {\n return FpPow(Field(modulo), num, power);\n}\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x, power, modulo) {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number, modulo) {\n if (number === _0n)\n throw new Error('invert: expected non-zero number');\n if (modulo <= _0n)\n throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n)\n throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\nfunction assertIsSquare(Fp, root, n) {\n if (!Fp.eql(Fp.sqr(root), n))\n throw new Error('Cannot find square root');\n}\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4(Fp, n) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n assertIsSquare(Fp, root, n);\n return root;\n}\nfunction sqrt5mod8(Fp, n) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n assertIsSquare(Fp, root, n);\n return root;\n}\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P) {\n const Fp_ = Field(P);\n const tn = tonelliShanks(P);\n const c1 = tn(Fp_, Fp_.neg(Fp_.ONE)); // 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n return (Fp, n) => {\n let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1\n const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1\n const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1\n const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n const root = Fp.cmov(tv1, tv2, e3); // 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2\n assertIsSquare(Fp, root, n);\n return root;\n };\n}\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P) {\n // Initialization (precomputation).\n // Caching initialization could boost perf by 7%.\n if (P < _3n)\n throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000)\n throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1)\n return sqrt3mod4;\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow(Fp, n) {\n if (Fp.is0(n))\n return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1)\n throw new Error('Cannot find square root');\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t))\n return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M)\n throw new Error('Cannot find square root');\n }\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. P ≡ 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P) {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n)\n return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n)\n return sqrt5mod8;\n // P ≡ 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n if (P % _16n === _9n)\n return sqrt9mod16(P);\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num, modulo) => (mod(num, modulo) & _1n) === _1n;\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n];\nexport function validateField(field) {\n const initial = {\n ORDER: 'bigint',\n MASK: 'bigint',\n BYTES: 'number',\n BITS: 'number',\n };\n const opts = FIELD_FIELDS.reduce((map, val) => {\n map[val] = 'function';\n return map;\n }, initial);\n _validateObject(field, opts);\n // const max = 16384;\n // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n return field;\n}\n// Generic field functions\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow(Fp, num, power) {\n if (power < _0n)\n throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n)\n return Fp.ONE;\n if (power === _1n)\n return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n)\n p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch(Fp, nums, passZero = false) {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num))\n return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num))\n return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n// TODO: remove\nexport function FpDiv(Fp, lhs, rhs) {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nexport function FpLegendre(Fp, n) {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no)\n throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare(Fp, n) {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n// CURVE.n lengths\nexport function nLength(n, nBitLength) {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined)\n anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(ORDER, bitLenOrOpts, // TODO: use opts only in v2?\nisLE = false, opts = {}) {\n if (ORDER <= _0n)\n throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n let _nbitLength = undefined;\n let _sqrt = undefined;\n let modFromBytes = false;\n let allowedLengths = undefined;\n if (typeof bitLenOrOpts === 'object' && bitLenOrOpts != null) {\n if (opts.sqrt || isLE)\n throw new Error('cannot specify opts in two arguments');\n const _opts = bitLenOrOpts;\n if (_opts.BITS)\n _nbitLength = _opts.BITS;\n if (_opts.sqrt)\n _sqrt = _opts.sqrt;\n if (typeof _opts.isLE === 'boolean')\n isLE = _opts.isLE;\n if (typeof _opts.modFromBytes === 'boolean')\n modFromBytes = _opts.modFromBytes;\n allowedLengths = _opts.allowedLengths;\n }\n else {\n if (typeof bitLenOrOpts === 'number')\n _nbitLength = bitLenOrOpts;\n if (opts.sqrt)\n _sqrt = opts.sqrt;\n }\n const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, _nbitLength);\n if (BYTES > 2048)\n throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n let sqrtP; // cached sqrtP\n const f = Object.freeze({\n ORDER,\n isLE,\n BITS,\n BYTES,\n MASK: bitMask(BITS),\n ZERO: _0n,\n ONE: _1n,\n allowedLengths: allowedLengths,\n create: (num) => mod(num, ORDER),\n isValid: (num) => {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible\n },\n is0: (num) => num === _0n,\n // is valid and invertible\n isValidNot0: (num) => !f.is0(num) && f.isValid(num),\n isOdd: (num) => (num & _1n) === _1n,\n neg: (num) => mod(-num, ORDER),\n eql: (lhs, rhs) => lhs === rhs,\n sqr: (num) => mod(num * num, ORDER),\n add: (lhs, rhs) => mod(lhs + rhs, ORDER),\n sub: (lhs, rhs) => mod(lhs - rhs, ORDER),\n mul: (lhs, rhs) => mod(lhs * rhs, ORDER),\n pow: (num, power) => FpPow(f, num, power),\n div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),\n // Same as above, but doesn't normalize\n sqrN: (num) => num * num,\n addN: (lhs, rhs) => lhs + rhs,\n subN: (lhs, rhs) => lhs - rhs,\n mulN: (lhs, rhs) => lhs * rhs,\n inv: (num) => invert(num, ORDER),\n sqrt: _sqrt ||\n ((n) => {\n if (!sqrtP)\n sqrtP = FpSqrt(ORDER);\n return sqrtP(f, n);\n }),\n toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)),\n fromBytes: (bytes, skipValidation = true) => {\n if (allowedLengths) {\n if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n throw new Error('Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length);\n }\n const padded = new Uint8Array(BYTES);\n // isLE add 0 to right, !isLE to the left.\n padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n bytes = padded;\n }\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n if (modFromBytes)\n scalar = mod(scalar, ORDER);\n if (!skipValidation)\n if (!f.isValid(scalar))\n throw new Error('invalid field element: outside of range 0..ORDER');\n // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n // protocol may allow non-reduced scalar that reduced later or changed some other way.\n return scalar;\n },\n // TODO: we don't need it here, move out to separate fn\n invertBatch: (lst) => FpInvertBatch(f, lst),\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov: (a, b, c) => (c ? b : a),\n });\n return Object.freeze(f);\n}\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n// const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n// if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n// const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n// // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n// const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n// return reduced;\n// },\nexport function FpSqrtOdd(Fp, elm) {\n if (!Fp.isOdd)\n throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\nexport function FpSqrtEven(Fp, elm) {\n if (!Fp.isOdd)\n throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n/**\n * \"Constant-time\" private key generation utility.\n * Same as mapKeyToField, but accepts less bytes (40 instead of 48 for 32-byte field).\n * Which makes it slightly more biased, less secure.\n * @deprecated use `mapKeyToField` instead\n */\nexport function hashToPrivateScalar(hash, groupOrder, isLE = false) {\n hash = ensureBytes('privateHash', hash);\n const hashLen = hash.length;\n const minLen = nLength(groupOrder).nByteLength + 8;\n if (minLen < 24 || hashLen < minLen || hashLen > 1024)\n throw new Error('hashToPrivateScalar: expected ' + minLen + '-1024 bytes of input, got ' + hashLen);\n const num = isLE ? bytesToNumberLE(hash) : bytesToNumberBE(hash);\n return mod(num, groupOrder - _1n) + _1n;\n}\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder) {\n if (typeof fieldOrder !== 'bigint')\n throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder) {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key, fieldOrder, isLE = false) {\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n//# sourceMappingURL=modular.js.map","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { bitLen, bitMask, validateObject } from \"../utils.js\";\nimport { Field, FpInvertBatch, nLength, validateField } from \"./modular.js\";\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nexport function negateCt(condition, item) {\n const neg = item.negate();\n return condition ? neg : item;\n}\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nexport function normalizeZ(c, points) {\n const invertedZs = FpInvertBatch(c.Fp, points.map((p) => p.Z));\n return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\nfunction validateW(W, bits) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\nfunction calcWOpts(W, scalarBits) {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\nfunction calcOffsets(n, window, wOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\nfunction validateMSMPoints(points, c) {\n if (!Array.isArray(points))\n throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c))\n throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars, field) {\n if (!Array.isArray(scalars))\n throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s))\n throw new Error('invalid scalar at index ' + i);\n });\n}\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap();\nconst pointWindowSizes = new WeakMap();\nfunction getW(P) {\n // To disable precomputes:\n // return 1;\n return pointWindowSizes.get(P) || 1;\n}\nfunction assert0(n) {\n if (n !== _0n)\n throw new Error('invalid wNAF');\n}\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport class wNAF {\n // Parametrized with a given Point class (not individual point)\n constructor(Point, bits) {\n this.BASE = Point.BASE;\n this.ZERO = Point.ZERO;\n this.Fn = Point.Fn;\n this.bits = bits;\n }\n // non-const time multiplication ladder\n _unsafeLadder(elm, n, p = this.ZERO) {\n let d = elm;\n while (n > _0n) {\n if (n & _1n)\n p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n }\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n precomputeWindow(point, W) {\n const { windows, windowSize } = calcWOpts(W, this.bits);\n const points = [];\n let p = point;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n }\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n wNAF(W, precomputes, n) {\n // Scalar should be smaller than field order\n if (!this.Fn.isValid(n))\n throw new Error('invalid scalar');\n // Accumulators\n let p = this.ZERO;\n let f = this.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(negateCt(isNegF, precomputes[offsetF]));\n }\n else {\n // bits are 1: add to result point\n p = p.add(negateCt(isNeg, precomputes[offset]));\n }\n }\n assert0(n);\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n }\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n wNAFUnsafe(W, precomputes, n, acc = this.ZERO) {\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n)\n break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n }\n else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n assert0(n);\n return acc;\n }\n getPrecomputes(W, point, transform) {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(point);\n if (!comp) {\n comp = this.precomputeWindow(point, W);\n if (W !== 1) {\n // Doing transform outside of if brings 15% perf hit\n if (typeof transform === 'function')\n comp = transform(comp);\n pointPrecomputes.set(point, comp);\n }\n }\n return comp;\n }\n cached(point, scalar, transform) {\n const W = getW(point);\n return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n }\n unsafe(point, scalar, transform, prev) {\n const W = getW(point);\n if (W === 1)\n return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n }\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(P, W) {\n validateW(W, this.bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n }\n hasCache(elm) {\n return getW(elm) !== 1;\n }\n}\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nexport function mulEndoUnsafe(Point, point, k1, k2) {\n let acc = point;\n let p1 = Point.ZERO;\n let p2 = Point.ZERO;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n)\n p1 = p1.add(acc);\n if (k2 & _1n)\n p2 = p2.add(acc);\n acc = acc.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n return { p1, p2 };\n}\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nexport function pippenger(c, fieldN, points, scalars) {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength)\n throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12)\n windowSize = wbits - 3;\n else if (wbits > 4)\n windowSize = wbits - 2;\n else if (wbits > 0)\n windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0)\n for (let j = 0; j < windowSize; j++)\n sum = sum.double();\n }\n return sum;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe(c, fieldN, points, windowSize) {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars) => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero)\n for (let j = 0; j < windowSize; j++)\n res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr)\n continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n// TODO: remove\n/** @deprecated */\nexport function validateBasic(curve) {\n validateField(curve.Fp);\n validateObject(curve, {\n n: 'bigint',\n h: 'bigint',\n Gx: 'field',\n Gy: 'field',\n }, {\n nBitLength: 'isSafeInteger',\n nByteLength: 'isSafeInteger',\n });\n // Set defaults\n return Object.freeze({\n ...nLength(curve.n, curve.nBitLength),\n ...curve,\n ...{ p: curve.Fp.ORDER },\n });\n}\nfunction createField(order, field, isLE) {\n if (field) {\n if (field.ORDER !== order)\n throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n validateField(field);\n return field;\n }\n else {\n return Field(order, { isLE });\n }\n}\n/** Validates CURVE opts and creates fields */\nexport function _createCurveFields(type, CURVE, curveOpts = {}, FpFnLE) {\n if (FpFnLE === undefined)\n FpFnLE = type === 'edwards';\n if (!CURVE || typeof CURVE !== 'object')\n throw new Error(`expected valid ${type} CURVE object`);\n for (const p of ['p', 'n', 'h']) {\n const val = CURVE[p];\n if (!(typeof val === 'bigint' && val > _0n))\n throw new Error(`CURVE.${p} must be positive bigint`);\n }\n const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n const _b = type === 'weierstrass' ? 'b' : 'd';\n const params = ['Gx', 'Gy', 'a', _b];\n for (const p of params) {\n // @ts-ignore\n if (!Fp.isValid(CURVE[p]))\n throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n }\n CURVE = Object.freeze(Object.assign({}, CURVE));\n return { CURVE, Fp, Fn };\n}\n//# sourceMappingURL=curve.js.map","/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac as nobleHmac } from '@noble/hashes/hmac.js';\nimport { ahash } from '@noble/hashes/utils';\nimport { _validateObject, _abool2 as abool, _abytes2 as abytes, aInRange, bitLen, bitMask, bytesToHex, bytesToNumberBE, concatBytes, createHmacDrbg, ensureBytes, hexToBytes, inRange, isBytes, memoized, numberToHexUnpadded, randomBytes as randomBytesWeb, } from \"../utils.js\";\nimport { _createCurveFields, mulEndoUnsafe, negateCt, normalizeZ, pippenger, wNAF, } from \"./curve.js\";\nimport { Field, FpInvertBatch, getMinHashLength, mapHashToField, nLength, validateField, } from \"./modular.js\";\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num, den) => (num + (num >= 0 ? den : -den) / _2n) / den;\n/**\n * Splits scalar for GLV endomorphism.\n */\nexport function _splitEndoScalar(k, basis, n) {\n // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n // Since part can be negative, we need to do this on point.\n // TODO: verifyScalar function which consumes lambda\n const [[a1, b1], [a2, b2]] = basis;\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n // |k1|/|k2| is < sqrt(N), but can be negative.\n // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n let k1 = k - c1 * a1 - c2 * a2;\n let k2 = -c1 * b1 - c2 * b2;\n const k1neg = k1 < _0n;\n const k2neg = k2 < _0n;\n if (k1neg)\n k1 = -k1;\n if (k2neg)\n k2 = -k2;\n // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n const MAX_NUM = bitMask(Math.ceil(bitLen(n) / 2)) + _1n; // Half bits of N\n if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n throw new Error('splitScalar (endomorphism): failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n}\nfunction validateSigFormat(format) {\n if (!['compact', 'recovered', 'der'].includes(format))\n throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n return format;\n}\nfunction validateSigOpts(opts, def) {\n const optsn = {};\n for (let optName of Object.keys(def)) {\n // @ts-ignore\n optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n }\n abool(optsn.lowS, 'lowS');\n abool(optsn.prehash, 'prehash');\n if (optsn.format !== undefined)\n validateSigFormat(optsn.format);\n return optsn;\n}\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag, data) => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256)\n throw new E('tlv.encode: wrong tag');\n if (data.length & 1)\n throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 128)\n throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 128) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag, data) {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256)\n throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag)\n throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 128); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong)\n length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 127;\n if (!lenLen)\n throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4)\n throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen)\n throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0)\n throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes)\n length = (length << 8) | b;\n pos += lenLen;\n if (length < 128)\n throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length)\n throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num) {\n const { Err: E } = DER;\n if (num < _0n)\n throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000)\n hex = '00' + hex;\n if (hex.length & 1)\n throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data) {\n const { Err: E } = DER;\n if (data[0] & 128)\n throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 128))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(hex) {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = ensureBytes('signature', hex);\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length)\n throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length)\n throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig) {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\nexport function _normFnElement(Fn, key) {\n const { BYTES: expected } = Fn;\n let num;\n if (typeof key === 'bigint') {\n num = key;\n }\n else {\n let bytes = ensureBytes('private key', key);\n try {\n num = Fn.fromBytes(bytes);\n }\n catch (error) {\n throw new Error(`invalid private key: expected ui8a of size ${expected}, got ${typeof key}`);\n }\n }\n if (!Fn.isValidNot0(num))\n throw new Error('invalid private key: out of range [1..N-1]');\n return num;\n}\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * @example\n```js\nconst opts = {\n p: BigInt('0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff'),\n n: BigInt('0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551'),\n h: BigInt(1),\n a: BigInt('0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc'),\n b: BigInt('0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b'),\n Gx: BigInt('0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296'),\n Gy: BigInt('0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5'),\n};\nconst p256_Point = weierstrass(opts);\n```\n */\nexport function weierstrassN(params, extraOpts = {}) {\n const validated = _createCurveFields('weierstrass', params, extraOpts);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE;\n const { h: cofactor, n: CURVE_ORDER } = CURVE;\n _validateObject(extraOpts, {}, {\n allowInfinityPoint: 'boolean',\n clearCofactor: 'function',\n isTorsionFree: 'function',\n fromBytes: 'function',\n toBytes: 'function',\n endo: 'object',\n wrapPrivateKey: 'boolean',\n });\n const { endo } = extraOpts;\n if (endo) {\n // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n }\n }\n const lengths = getWLengths(Fp, Fn);\n function assertCompressionIsSupported() {\n if (!Fp.isOdd)\n throw new Error('compression is not supported: Field does not have .isOdd()');\n }\n // Implements IEEE P1363 point encoding\n function pointToBytes(_c, point, isCompressed) {\n const { x, y } = point.toAffine();\n const bx = Fp.toBytes(x);\n abool(isCompressed, 'isCompressed');\n if (isCompressed) {\n assertCompressionIsSupported();\n const hasEvenY = !Fp.isOdd(y);\n return concatBytes(pprefix(hasEvenY), bx);\n }\n else {\n return concatBytes(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n }\n }\n function pointFromBytes(bytes) {\n abytes(bytes, undefined, 'Point');\n const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n const length = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // No actual validation is done here: use .assertValidity()\n if (length === comp && (head === 0x02 || head === 0x03)) {\n const x = Fp.fromBytes(tail);\n if (!Fp.isValid(x))\n throw new Error('bad point: is not on curve, wrong x');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y;\n try {\n y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n }\n catch (sqrtError) {\n const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('bad point: is not on curve, sqrt error' + err);\n }\n assertCompressionIsSupported();\n const isYOdd = Fp.isOdd(y); // (y & _1n) === _1n;\n const isHeadOdd = (head & 1) === 1; // ECDSA-specific\n if (isHeadOdd !== isYOdd)\n y = Fp.neg(y);\n return { x, y };\n }\n else if (length === uncomp && head === 0x04) {\n // TODO: more checks\n const L = Fp.BYTES;\n const x = Fp.fromBytes(tail.subarray(0, L));\n const y = Fp.fromBytes(tail.subarray(L, L * 2));\n if (!isValidXY(x, y))\n throw new Error('bad point: is not on curve');\n return { x, y };\n }\n else {\n throw new Error(`bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`);\n }\n }\n const encodePoint = extraOpts.toBytes || pointToBytes;\n const decodePoint = extraOpts.fromBytes || pointFromBytes;\n function weierstrassEquation(x) {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x³ + a * x + b\n }\n // TODO: move top-level\n /** Checks whether equation holds for given x, y: y² == x³ + ax + b */\n function isValidXY(x, y) {\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n return Fp.eql(left, right);\n }\n // Validate whether the passed curve params are valid.\n // Test 1: equation y² = x³ + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy))\n throw new Error('bad curve params: generator point');\n // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2)))\n throw new Error('bad curve params: a or b');\n /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n function acoord(title, n, banZero = false) {\n if (!Fp.isValid(n) || (banZero && Fp.is0(n)))\n throw new Error(`bad point coordinate ${title}`);\n return n;\n }\n function aprjpoint(other) {\n if (!(other instanceof Point))\n throw new Error('ProjectivePoint expected');\n }\n function splitEndoScalarN(k) {\n if (!endo || !endo.basises)\n throw new Error('no endo');\n return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n }\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p, iz) => {\n const { X, Y, Z } = p;\n // Fast-path for normalized points\n if (Fp.eql(Z, Fp.ONE))\n return { x: X, y: Y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null)\n iz = is0 ? Fp.ONE : Fp.inv(Z);\n const x = Fp.mul(X, iz);\n const y = Fp.mul(Y, iz);\n const zz = Fp.mul(Z, iz);\n if (is0)\n return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE))\n throw new Error('invZ was invalid');\n return { x, y };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y))\n return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n if (!Fp.isValid(x) || !Fp.isValid(y))\n throw new Error('bad point: x or y not field elements');\n if (!isValidXY(x, y))\n throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree())\n throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n function finishEndo(endoBeta, k1p, k2p, k1neg, k2neg) {\n k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n k1p = negateCt(k1neg, k1p);\n k2p = negateCt(k2neg, k2p);\n return k1p.add(k2p);\n }\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) ∋ (x=X/Z, y=Y/Z).\n * Default Point works in 2d / affine coordinates: (x, y).\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point {\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n constructor(X, Y, Z) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y, true);\n this.Z = acoord('z', Z);\n Object.freeze(this);\n }\n static CURVE() {\n return CURVE;\n }\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n static fromAffine(p) {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y))\n throw new Error('invalid affine point');\n if (p instanceof Point)\n throw new Error('projective point not allowed');\n // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n if (Fp.is0(x) && Fp.is0(y))\n return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n static fromBytes(bytes) {\n const P = Point.fromAffine(decodePoint(abytes(bytes, undefined, 'point')));\n P.assertValidity();\n return P;\n }\n static fromHex(hex) {\n return Point.fromBytes(ensureBytes('pointHex', hex));\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n /**\n *\n * @param windowSize\n * @param isLazy true will defer table computation until the first multiplication\n * @returns\n */\n precompute(windowSize = 8, isLazy = true) {\n wnaf.createCache(this, windowSize);\n if (!isLazy)\n this.multiply(_3n); // random number\n return this;\n }\n // TODO: return `this`\n /** A point on curve is valid if it conforms to equation. */\n assertValidity() {\n assertValidMemo(this);\n }\n hasEvenY() {\n const { y } = this.toAffine();\n if (!Fp.isOdd)\n throw new Error(\"Field doesn't support isOdd\");\n return !Fp.isOdd(y);\n }\n /** Compare one point to another. */\n equals(other) {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n negate() {\n return new Point(this.X, Fp.neg(this.Y), this.Z);\n }\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other) {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n subtract(other) {\n return this.add(other.negate());\n }\n is0() {\n return this.equals(Point.ZERO);\n }\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar) {\n const { endo } = extraOpts;\n if (!Fn.isValidNot0(scalar))\n throw new Error('invalid scalar: out of range'); // 0 is invalid\n let point, fake; // Fake point is used to const-time mult\n const mul = (n) => wnaf.cached(this, n, (p) => normalizeZ(Point, p));\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n const { p: k1p, f: k1f } = mul(k1);\n const { p: k2p, f: k2f } = mul(k2);\n fake = k1f.add(k2f);\n point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n }\n else {\n const { p, f } = mul(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return normalizeZ(Point, [point, fake])[0];\n }\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed secret key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc) {\n const { endo } = extraOpts;\n const p = this;\n if (!Fn.isValid(sc))\n throw new Error('invalid scalar: out of range'); // 0 is valid\n if (sc === _0n || p.is0())\n return Point.ZERO;\n if (sc === _1n)\n return p; // fast-path\n if (wnaf.hasCache(this))\n return this.multiply(sc);\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n const { p1, p2 } = mulEndoUnsafe(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n }\n else {\n return wnaf.unsafe(p, sc);\n }\n }\n multiplyAndAddUnsafe(Q, a, b) {\n const sum = this.multiplyUnsafe(a).add(Q.multiplyUnsafe(b));\n return sum.is0() ? undefined : sum;\n }\n /**\n * Converts Projective point to affine (x, y) coordinates.\n * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n */\n toAffine(invertedZ) {\n return toAffineMemo(this, invertedZ);\n }\n /**\n * Checks whether Point is free of torsion elements (is in prime subgroup).\n * Always torsion-free for cofactor=1 curves.\n */\n isTorsionFree() {\n const { isTorsionFree } = extraOpts;\n if (cofactor === _1n)\n return true;\n if (isTorsionFree)\n return isTorsionFree(Point, this);\n return wnaf.unsafe(this, CURVE_ORDER).is0();\n }\n clearCofactor() {\n const { clearCofactor } = extraOpts;\n if (cofactor === _1n)\n return this; // Fast-path\n if (clearCofactor)\n return clearCofactor(Point, this);\n return this.multiplyUnsafe(cofactor);\n }\n isSmallOrder() {\n // can we use this.clearCofactor()?\n return this.multiplyUnsafe(cofactor).is0();\n }\n toBytes(isCompressed = true) {\n abool(isCompressed, 'isCompressed');\n this.assertValidity();\n return encodePoint(Point, this, isCompressed);\n }\n toHex(isCompressed = true) {\n return bytesToHex(this.toBytes(isCompressed));\n }\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n // TODO: remove\n get px() {\n return this.X;\n }\n get py() {\n return this.X;\n }\n get pz() {\n return this.Z;\n }\n toRawBytes(isCompressed = true) {\n return this.toBytes(isCompressed);\n }\n _setWindowSize(windowSize) {\n this.precompute(windowSize);\n }\n static normalizeZ(points) {\n return normalizeZ(Point, points);\n }\n static msm(points, scalars) {\n return pippenger(Point, Fn, points, scalars);\n }\n static fromPrivateKey(privateKey) {\n return Point.BASE.multiply(_normFnElement(Fn, privateKey));\n }\n }\n // base / generator point\n Point.BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n Point.ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n // math field\n Point.Fp = Fp;\n // scalar field\n Point.Fn = Fn;\n const bits = Fn.BITS;\n const wnaf = new wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY) {\n return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio(Fp, Z) {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n)\n l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u, v) => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u, v) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU(Fp, opts) {\n validateField(Fp);\n const { A, B, Z } = opts;\n if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n if (!Fp.isOdd)\n throw new Error('Field does not have .isOdd()');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u) => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd(u) === Fp.isOdd(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\nfunction getWLengths(Fp, Fn) {\n return {\n secretKey: Fn.BYTES,\n publicKey: 1 + Fp.BYTES,\n publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n publicKeyHasPrefix: true,\n signature: 2 * Fn.BYTES,\n };\n}\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nexport function ecdh(Point, ecdhOpts = {}) {\n const { Fn } = Point;\n const randomBytes_ = ecdhOpts.randomBytes || randomBytesWeb;\n const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: getMinHashLength(Fn.ORDER) });\n function isValidSecretKey(secretKey) {\n try {\n return !!_normFnElement(Fn, secretKey);\n }\n catch (error) {\n return false;\n }\n }\n function isValidPublicKey(publicKey, isCompressed) {\n const { publicKey: comp, publicKeyUncompressed } = lengths;\n try {\n const l = publicKey.length;\n if (isCompressed === true && l !== comp)\n return false;\n if (isCompressed === false && l !== publicKeyUncompressed)\n return false;\n return !!Point.fromBytes(publicKey);\n }\n catch (error) {\n return false;\n }\n }\n /**\n * Produces cryptographically secure secret key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n function randomSecretKey(seed = randomBytes_(lengths.seed)) {\n return mapHashToField(abytes(seed, lengths.seed, 'seed'), Fn.ORDER);\n }\n /**\n * Computes public key for a secret key. Checks for validity of the secret key.\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(secretKey, isCompressed = true) {\n return Point.BASE.multiply(_normFnElement(Fn, secretKey)).toBytes(isCompressed);\n }\n function keygen(seed) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n }\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item) {\n if (typeof item === 'bigint')\n return false;\n if (item instanceof Point)\n return true;\n const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n if (Fn.allowedLengths || secretKey === publicKey)\n return undefined;\n const l = ensureBytes('key', item).length;\n return l === publicKey || l === publicKeyUncompressed;\n }\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from secret key A and public key B.\n * Checks: 1) secret key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(secretKeyA, publicKeyB, isCompressed = true) {\n if (isProbPub(secretKeyA) === true)\n throw new Error('first arg must be private key');\n if (isProbPub(publicKeyB) === false)\n throw new Error('second arg must be public key');\n const s = _normFnElement(Fn, secretKeyA);\n const b = Point.fromHex(publicKeyB); // checks for being on-curve\n return b.multiply(s).toBytes(isCompressed);\n }\n const utils = {\n isValidSecretKey,\n isValidPublicKey,\n randomSecretKey,\n // TODO: remove\n isValidPrivateKey: isValidSecretKey,\n randomPrivateKey: randomSecretKey,\n normPrivateKeyToScalar: (key) => _normFnElement(Fn, key),\n precompute(windowSize = 8, point = Point.BASE) {\n return point.precompute(windowSize, false);\n },\n };\n return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n * We need `hash` for 2 features:\n * 1. Message prehash-ing. NOT used if `sign` / `verify` are called with `prehash: false`\n * 2. k generation in `sign`, using HMAC-drbg(hash)\n *\n * ECDSAOpts are only rarely needed.\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nexport function ecdsa(Point, hash, ecdsaOpts = {}) {\n ahash(hash);\n _validateObject(ecdsaOpts, {}, {\n hmac: 'function',\n lowS: 'boolean',\n randomBytes: 'function',\n bits2int: 'function',\n bits2int_modN: 'function',\n });\n const randomBytes = ecdsaOpts.randomBytes || randomBytesWeb;\n const hmac = ecdsaOpts.hmac ||\n ((key, ...msgs) => nobleHmac(hash, key, concatBytes(...msgs)));\n const { Fp, Fn } = Point;\n const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n const defaultSigOpts = {\n prehash: false,\n lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : false,\n format: undefined, //'compact' as ECDSASigFormat,\n extraEntropy: false,\n };\n const defaultSigOpts_format = 'compact';\n function isBiggerThanHalfOrder(number) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n function validateRS(title, num) {\n if (!Fn.isValidNot0(num))\n throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n return num;\n }\n function validateSigLength(bytes, format) {\n validateSigFormat(format);\n const size = lengths.signature;\n const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n return abytes(bytes, sizer, `${format} signature`);\n }\n /**\n * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n */\n class Signature {\n constructor(r, s, recovery) {\n this.r = validateRS('r', r); // r in [1..N-1];\n this.s = validateRS('s', s); // s in [1..N-1];\n if (recovery != null)\n this.recovery = recovery;\n Object.freeze(this);\n }\n static fromBytes(bytes, format = defaultSigOpts_format) {\n validateSigLength(bytes, format);\n let recid;\n if (format === 'der') {\n const { r, s } = DER.toSig(abytes(bytes));\n return new Signature(r, s);\n }\n if (format === 'recovered') {\n recid = bytes[0];\n format = 'compact';\n bytes = bytes.subarray(1);\n }\n const L = Fn.BYTES;\n const r = bytes.subarray(0, L);\n const s = bytes.subarray(L, L * 2);\n return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n }\n static fromHex(hex, format) {\n return this.fromBytes(hexToBytes(hex), format);\n }\n addRecoveryBit(recovery) {\n return new Signature(this.r, this.s, recovery);\n }\n recoverPublicKey(messageHash) {\n const FIELD_ORDER = Fp.ORDER;\n const { r, s, recovery: rec } = this;\n if (rec == null || ![0, 1, 2, 3].includes(rec))\n throw new Error('recovery id invalid');\n // ECDSA recovery is hard for cofactor > 1 curves.\n // In sign, `r = q.x mod n`, and here we recover q.x from r.\n // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n // However, for cofactor>1, r+n may not get q.x:\n // r+n*i would need to be done instead where i is unknown.\n // To easily get i, we either need to:\n // a. increase amount of valid recid values (4, 5...); OR\n // b. prohibit non-prime-order signatures (recid > 1).\n const hasCofactor = CURVE_ORDER * _2n < FIELD_ORDER;\n if (hasCofactor && rec > 1)\n throw new Error('recovery id is ambiguous for h>1 curve');\n const radj = rec === 2 || rec === 3 ? r + CURVE_ORDER : r;\n if (!Fp.isValid(radj))\n throw new Error('recovery id 2 or 3 invalid');\n const x = Fp.toBytes(radj);\n const R = Point.fromBytes(concatBytes(pprefix((rec & 1) === 0), x));\n const ir = Fn.inv(radj); // r^-1\n const h = bits2int_modN(ensureBytes('msgHash', messageHash)); // Truncate hash\n const u1 = Fn.create(-h * ir); // -hr^-1\n const u2 = Fn.create(s * ir); // sr^-1\n // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n if (Q.is0())\n throw new Error('point at infinify');\n Q.assertValidity();\n return Q;\n }\n // Signatures should be low-s, to prevent malleability.\n hasHighS() {\n return isBiggerThanHalfOrder(this.s);\n }\n toBytes(format = defaultSigOpts_format) {\n validateSigFormat(format);\n if (format === 'der')\n return hexToBytes(DER.hexFromSig(this));\n const r = Fn.toBytes(this.r);\n const s = Fn.toBytes(this.s);\n if (format === 'recovered') {\n if (this.recovery == null)\n throw new Error('recovery bit must be present');\n return concatBytes(Uint8Array.of(this.recovery), r, s);\n }\n return concatBytes(r, s);\n }\n toHex(format) {\n return bytesToHex(this.toBytes(format));\n }\n // TODO: remove\n assertValidity() { }\n static fromCompact(hex) {\n return Signature.fromBytes(ensureBytes('sig', hex), 'compact');\n }\n static fromDER(hex) {\n return Signature.fromBytes(ensureBytes('sig', hex), 'der');\n }\n normalizeS() {\n return this.hasHighS() ? new Signature(this.r, Fn.neg(this.s), this.recovery) : this;\n }\n toDERRawBytes() {\n return this.toBytes('der');\n }\n toDERHex() {\n return bytesToHex(this.toBytes('der'));\n }\n toCompactRawBytes() {\n return this.toBytes('compact');\n }\n toCompactHex() {\n return bytesToHex(this.toBytes('compact'));\n }\n }\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int = ecdsaOpts.bits2int ||\n function bits2int_def(bytes) {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192)\n throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN = ecdsaOpts.bits2int_modN ||\n function bits2int_modN_def(bytes) {\n return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // Pads output with zero as per spec\n const ORDER_MASK = bitMask(fnBits);\n /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n function int2octets(num) {\n // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n aInRange('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n return Fn.toBytes(num);\n }\n function validateMsgAndHash(message, prehash) {\n abytes(message, undefined, 'message');\n return prehash ? abytes(hash(message), undefined, 'prehashed message') : message;\n }\n /**\n * Steps A, D of RFC6979 3.2.\n * Creates RFC6979 seed; converts msg/privKey to numbers.\n * Used only in sign, not in verify.\n *\n * Warning: we cannot assume here that message has same amount of bytes as curve order,\n * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n */\n function prepSig(message, privateKey, opts) {\n if (['recovered', 'canonical'].some((k) => k in opts))\n throw new Error('sign() legacy options not supported');\n const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(message);\n const d = _normFnElement(Fn, privateKey); // validate secret key, convert to bigint\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (extraEntropy != null && extraEntropy !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n // gen random bytes OR pass as-is\n const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n seedArgs.push(ensureBytes('extraEntropy', e)); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n // To transform k => Signature:\n // q = k⋅G\n // r = q.x mod n\n // s = k^-1(m + rd) mod n\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n function k2sig(kBytes) {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n // Important: all mod() calls here must be done over N\n const k = bits2int(kBytes); // mod n, not mod p\n if (!Fn.isValidNot0(k))\n return; // Valid scalars (including k) must be in 1..N-1\n const ik = Fn.inv(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = k⋅G\n const r = Fn.create(q.x); // r = q.x mod n\n if (r === _0n)\n return;\n const s = Fn.create(ik * Fn.create(m + r * d)); // Not using blinding here, see comment above\n if (s === _0n)\n return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3, when q.x > n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = Fn.neg(s); // if lowS was passed, ensure s is always\n recovery ^= 1; // // in the bottom half of N\n }\n return new Signature(r, normS, recovery); // use normS, not s\n }\n return { seed, k2sig };\n }\n /**\n * Signs message hash with a secret key.\n *\n * ```\n * sign(m, d) where\n * k = rfc6979_hmac_drbg(m, d)\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr) / k mod n\n * ```\n */\n function sign(message, secretKey, opts = {}) {\n message = ensureBytes('message', message);\n const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n const drbg = createHmacDrbg(hash.outputLen, Fn.BYTES, hmac);\n const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n return sig;\n }\n function tryParsingSig(sg) {\n // Try to deduce format\n let sig = undefined;\n const isHex = typeof sg === 'string' || isBytes(sg);\n const isObj = !isHex &&\n sg !== null &&\n typeof sg === 'object' &&\n typeof sg.r === 'bigint' &&\n typeof sg.s === 'bigint';\n if (!isHex && !isObj)\n throw new Error('invalid signature, expected Uint8Array, hex string or Signature instance');\n if (isObj) {\n sig = new Signature(sg.r, sg.s);\n }\n else if (isHex) {\n try {\n sig = Signature.fromBytes(ensureBytes('sig', sg), 'der');\n }\n catch (derError) {\n if (!(derError instanceof DER.Err))\n throw derError;\n }\n if (!sig) {\n try {\n sig = Signature.fromBytes(ensureBytes('sig', sg), 'compact');\n }\n catch (error) {\n return false;\n }\n }\n }\n if (!sig)\n return false;\n return sig;\n }\n /**\n * Verifies a signature against message and public key.\n * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * u1 = hs^-1 mod n\n * u2 = rs^-1 mod n\n * R = u1⋅G + u2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(signature, message, publicKey, opts = {}) {\n const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n publicKey = ensureBytes('publicKey', publicKey);\n message = validateMsgAndHash(ensureBytes('message', message), prehash);\n if ('strict' in opts)\n throw new Error('options.strict was renamed to lowS');\n const sig = format === undefined\n ? tryParsingSig(signature)\n : Signature.fromBytes(ensureBytes('sig', signature), format);\n if (sig === false)\n return false;\n try {\n const P = Point.fromBytes(publicKey);\n if (lowS && sig.hasHighS())\n return false;\n const { r, s } = sig;\n const h = bits2int_modN(message); // mod n, not mod p\n const is = Fn.inv(s); // s^-1 mod n\n const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1⋅G + u2⋅P\n if (R.is0())\n return false;\n const v = Fn.create(R.x); // v = r.x mod n\n return v === r;\n }\n catch (e) {\n return false;\n }\n }\n function recoverPublicKey(signature, message, opts = {}) {\n const { prehash } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash);\n return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n }\n return Object.freeze({\n keygen,\n getPublicKey,\n getSharedSecret,\n utils,\n lengths,\n Point,\n sign,\n verify,\n recoverPublicKey,\n Signature,\n hash,\n });\n}\n/** @deprecated use `weierstrass` in newer releases */\nexport function weierstrassPoints(c) {\n const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n const Point = weierstrassN(CURVE, curveOpts);\n return _weierstrass_new_output_to_legacy(c, Point);\n}\nfunction _weierstrass_legacy_opts_to_new(c) {\n const CURVE = {\n a: c.a,\n b: c.b,\n p: c.Fp.ORDER,\n n: c.n,\n h: c.h,\n Gx: c.Gx,\n Gy: c.Gy,\n };\n const Fp = c.Fp;\n let allowedLengths = c.allowedPrivateKeyLengths\n ? Array.from(new Set(c.allowedPrivateKeyLengths.map((l) => Math.ceil(l / 2))))\n : undefined;\n const Fn = Field(CURVE.n, {\n BITS: c.nBitLength,\n allowedLengths: allowedLengths,\n modFromBytes: c.wrapPrivateKey,\n });\n const curveOpts = {\n Fp,\n Fn,\n allowInfinityPoint: c.allowInfinityPoint,\n endo: c.endo,\n isTorsionFree: c.isTorsionFree,\n clearCofactor: c.clearCofactor,\n fromBytes: c.fromBytes,\n toBytes: c.toBytes,\n };\n return { CURVE, curveOpts };\n}\nfunction _ecdsa_legacy_opts_to_new(c) {\n const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n const ecdsaOpts = {\n hmac: c.hmac,\n randomBytes: c.randomBytes,\n lowS: c.lowS,\n bits2int: c.bits2int,\n bits2int_modN: c.bits2int_modN,\n };\n return { CURVE, curveOpts, hash: c.hash, ecdsaOpts };\n}\nexport function _legacyHelperEquat(Fp, a, b) {\n /**\n * y² = x³ + ax + b: Short weierstrass curve formula. Takes x, returns y².\n * @returns y²\n */\n function weierstrassEquation(x) {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); // x³ + a * x + b\n }\n return weierstrassEquation;\n}\nfunction _weierstrass_new_output_to_legacy(c, Point) {\n const { Fp, Fn } = Point;\n function isWithinCurveOrder(num) {\n return inRange(num, _1n, Fn.ORDER);\n }\n const weierstrassEquation = _legacyHelperEquat(Fp, c.a, c.b);\n return Object.assign({}, {\n CURVE: c,\n Point: Point,\n ProjectivePoint: Point,\n normPrivateKeyToScalar: (key) => _normFnElement(Fn, key),\n weierstrassEquation,\n isWithinCurveOrder,\n });\n}\nfunction _ecdsa_new_output_to_legacy(c, _ecdsa) {\n const Point = _ecdsa.Point;\n return Object.assign({}, _ecdsa, {\n ProjectivePoint: Point,\n CURVE: Object.assign({}, c, nLength(Point.Fn.ORDER, Point.Fn.BITS)),\n });\n}\n// _ecdsa_legacy\nexport function weierstrass(c) {\n const { CURVE, curveOpts, hash, ecdsaOpts } = _ecdsa_legacy_opts_to_new(c);\n const Point = weierstrassN(CURVE, curveOpts);\n const signs = ecdsa(Point, hash, ecdsaOpts);\n return _ecdsa_new_output_to_legacy(c, signs);\n}\n//# sourceMappingURL=weierstrass.js.map","/**\n * Utilities for short weierstrass curves, combined with noble-hashes.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { weierstrass } from \"./abstract/weierstrass.js\";\n/** connects noble-curves to noble-hashes */\nexport function getHash(hash) {\n return { hash };\n}\n/** @deprecated use new `weierstrass()` and `ecdsa()` methods */\nexport function createCurve(curveDef, defHash) {\n const create = (hash) => weierstrass({ ...curveDef, hash: hash });\n return { ...create(defHash), create };\n}\n//# sourceMappingURL=_shortw_utils.js.map","/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism ψ,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\nimport { createCurve } from \"./_shortw_utils.js\";\nimport { createHasher, isogenyMap, } from \"./abstract/hash-to-curve.js\";\nimport { Field, mapHashToField, mod, pow2 } from \"./abstract/modular.js\";\nimport { _normFnElement, mapToCurveSimpleSWU, } from \"./abstract/weierstrass.js\";\nimport { bytesToNumberBE, concatBytes, ensureBytes, inRange, numberToBytesBE, utf8ToBytes, } from \"./utils.js\";\n// Seems like generator was produced from some seed:\n// `Point.BASE.multiply(Point.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE = {\n p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n h: BigInt(1),\n a: BigInt(0),\n b: BigInt(7),\n Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\nconst secp256k1_ENDO = {\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n basises: [\n [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n ],\n};\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y) {\n const P = secp256k1_CURVE.p;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y))\n throw new Error('Cannot find square root');\n return root;\n}\nconst Fpk1 = Field(secp256k1_CURVE.p, { sqrt: sqrtMod });\n/**\n * secp256k1 curve, ECDSA and ECDH methods.\n *\n * Field: `2n**256n - 2n**32n - 2n**9n - 2n**8n - 2n**7n - 2n**6n - 2n**4n - 1n`\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * const msg = new TextEncoder().encode('hello');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey) === true;\n * ```\n */\nexport const secp256k1 = createCurve({ ...secp256k1_CURVE, Fp: Fpk1, lowS: true, endo: secp256k1_ENDO }, sha256);\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES = {};\nfunction taggedHash(tag, ...messages) {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(utf8ToBytes(tag));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point) => point.toBytes(true).slice(1);\nconst Pointk1 = /* @__PURE__ */ (() => secp256k1.Point)();\nconst hasEven = (y) => y % _2n === _0n;\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv) {\n const { Fn, BASE } = Pointk1;\n const d_ = _normFnElement(Fn, priv);\n const p = BASE.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x) {\n const Fp = Fpk1;\n if (!Fp.isValidNot0(x))\n throw new Error('invalid x: Fail if x ≥ p');\n const xx = Fp.create(x * x);\n const c = Fp.create(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n // Return the unique point P such that x(P) = x and\n // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n if (!hasEven(y))\n y = Fp.neg(y);\n const p = Pointk1.fromAffine({ x, y });\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args) {\n return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey) {\n return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(message, secretKey, auxRand = randomBytes(32)) {\n const { Fn } = Pointk1;\n const m = ensureBytes('message', message);\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n const a = ensureBytes('auxRand', auxRand, 32); // Auxiliary random data a: a 32-byte array\n const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'⋅G\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px))\n throw new Error('sign: Invalid signature produced');\n return sig;\n}\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature, message, publicKey) {\n const { Fn, BASE } = Pointk1;\n const sig = ensureBytes('signature', signature, 64);\n const m = ensureBytes('message', message);\n const pub = ensureBytes('publicKey', publicKey, 32);\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!inRange(r, _1n, secp256k1_CURVE.p))\n return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!inRange(s, _1n, secp256k1_CURVE.n))\n return false;\n // int(challenge(bytes(r)||bytes(P)||m))%n\n const e = challenge(Fn.toBytes(r), pointToBytes(P), m);\n // R = s⋅G - e⋅P, where -eP == (n-e)P\n const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n const { x, y } = R.toAffine();\n // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n if (R.is0() || !hasEven(y) || x !== r)\n return false;\n return true;\n }\n catch (error) {\n return false;\n }\n}\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nexport const schnorr = /* @__PURE__ */ (() => {\n const size = 32;\n const seedLength = 48;\n const randomSecretKey = (seed = randomBytes(seedLength)) => {\n return mapHashToField(seed, secp256k1_CURVE.n);\n };\n // TODO: remove\n secp256k1.utils.randomSecretKey;\n function keygen(seed) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: schnorrGetPublicKey(secretKey) };\n }\n return {\n keygen,\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n Point: Pointk1,\n utils: {\n randomSecretKey: randomSecretKey,\n randomPrivateKey: randomSecretKey,\n taggedHash,\n // TODO: remove\n lift_x,\n pointToBytes,\n numberToBytesBE,\n bytesToNumberBE,\n mod,\n },\n lengths: {\n secretKey: size,\n publicKey: size,\n publicKeyHasPrefix: false,\n signature: size * 2,\n seed: seedLength,\n },\n };\n})();\nconst isoMap = /* @__PURE__ */ (() => isogenyMap(Fpk1, [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n].map((i) => i.map((j) => BigInt(j)))))();\nconst mapSWU = /* @__PURE__ */ (() => mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n}))();\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher = /* @__PURE__ */ (() => createHasher(secp256k1.Point, (scalars) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n}, {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n}))();\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nexport const hashToCurve = /* @__PURE__ */ (() => secp256k1_hasher.hashToCurve)();\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nexport const encodeToCurve = /* @__PURE__ */ (() => secp256k1_hasher.encodeToCurve)();\n//# sourceMappingURL=secp256k1.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","// nip19.ts\nimport { bytesToHex as bytesToHex2, concatBytes, hexToBytes as hexToBytes2 } from \"@noble/hashes/utils\";\nimport { bech32 } from \"@scure/base\";\n\n// utils.ts\nimport { bytesToHex, hexToBytes } from \"@noble/hashes/utils\";\nvar utf8Decoder = new TextDecoder(\"utf-8\");\nvar utf8Encoder = new TextEncoder();\n\n// nip19.ts\nvar NostrTypeGuard = {\n isNProfile: (value) => /^nprofile1[a-z\\d]+$/.test(value || \"\"),\n isNEvent: (value) => /^nevent1[a-z\\d]+$/.test(value || \"\"),\n isNAddr: (value) => /^naddr1[a-z\\d]+$/.test(value || \"\"),\n isNSec: (value) => /^nsec1[a-z\\d]{58}$/.test(value || \"\"),\n isNPub: (value) => /^npub1[a-z\\d]{58}$/.test(value || \"\"),\n isNote: (value) => /^note1[a-z\\d]+$/.test(value || \"\"),\n isNcryptsec: (value) => /^ncryptsec1[a-z\\d]+$/.test(value || \"\")\n};\nvar Bech32MaxSize = 5e3;\nvar BECH32_REGEX = /[\\x21-\\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/;\nfunction integerToUint8Array(number) {\n const uint8Array = new Uint8Array(4);\n uint8Array[0] = number >> 24 & 255;\n uint8Array[1] = number >> 16 & 255;\n uint8Array[2] = number >> 8 & 255;\n uint8Array[3] = number & 255;\n return uint8Array;\n}\nfunction decodeNostrURI(nip19code) {\n try {\n if (nip19code.startsWith(\"nostr:\"))\n nip19code = nip19code.substring(6);\n return decode(nip19code);\n } catch (_err) {\n return { type: \"invalid\", data: null };\n }\n}\nfunction decode(code) {\n let { prefix, words } = bech32.decode(code, Bech32MaxSize);\n let data = new Uint8Array(bech32.fromWords(words));\n switch (prefix) {\n case \"nprofile\": {\n let tlv = parseTLV(data);\n if (!tlv[0]?.[0])\n throw new Error(\"missing TLV 0 for nprofile\");\n if (tlv[0][0].length !== 32)\n throw new Error(\"TLV 0 should be 32 bytes\");\n return {\n type: \"nprofile\",\n data: {\n pubkey: bytesToHex2(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map((d) => utf8Decoder.decode(d)) : []\n }\n };\n }\n case \"nevent\": {\n let tlv = parseTLV(data);\n if (!tlv[0]?.[0])\n throw new Error(\"missing TLV 0 for nevent\");\n if (tlv[0][0].length !== 32)\n throw new Error(\"TLV 0 should be 32 bytes\");\n if (tlv[2] && tlv[2][0].length !== 32)\n throw new Error(\"TLV 2 should be 32 bytes\");\n if (tlv[3] && tlv[3][0].length !== 4)\n throw new Error(\"TLV 3 should be 4 bytes\");\n return {\n type: \"nevent\",\n data: {\n id: bytesToHex2(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map((d) => utf8Decoder.decode(d)) : [],\n author: tlv[2]?.[0] ? bytesToHex2(tlv[2][0]) : void 0,\n kind: tlv[3]?.[0] ? parseInt(bytesToHex2(tlv[3][0]), 16) : void 0\n }\n };\n }\n case \"naddr\": {\n let tlv = parseTLV(data);\n if (!tlv[0]?.[0])\n throw new Error(\"missing TLV 0 for naddr\");\n if (!tlv[2]?.[0])\n throw new Error(\"missing TLV 2 for naddr\");\n if (tlv[2][0].length !== 32)\n throw new Error(\"TLV 2 should be 32 bytes\");\n if (!tlv[3]?.[0])\n throw new Error(\"missing TLV 3 for naddr\");\n if (tlv[3][0].length !== 4)\n throw new Error(\"TLV 3 should be 4 bytes\");\n return {\n type: \"naddr\",\n data: {\n identifier: utf8Decoder.decode(tlv[0][0]),\n pubkey: bytesToHex2(tlv[2][0]),\n kind: parseInt(bytesToHex2(tlv[3][0]), 16),\n relays: tlv[1] ? tlv[1].map((d) => utf8Decoder.decode(d)) : []\n }\n };\n }\n case \"nsec\":\n return { type: prefix, data };\n case \"npub\":\n case \"note\":\n return { type: prefix, data: bytesToHex2(data) };\n default:\n throw new Error(`unknown prefix ${prefix}`);\n }\n}\nfunction parseTLV(data) {\n let result = {};\n let rest = data;\n while (rest.length > 0) {\n let t = rest[0];\n let l = rest[1];\n let v = rest.slice(2, 2 + l);\n rest = rest.slice(2 + l);\n if (v.length < l)\n throw new Error(`not enough data to read on TLV ${t}`);\n result[t] = result[t] || [];\n result[t].push(v);\n }\n return result;\n}\nfunction nsecEncode(key) {\n return encodeBytes(\"nsec\", key);\n}\nfunction npubEncode(hex) {\n return encodeBytes(\"npub\", hexToBytes2(hex));\n}\nfunction noteEncode(hex) {\n return encodeBytes(\"note\", hexToBytes2(hex));\n}\nfunction encodeBech32(prefix, data) {\n let words = bech32.toWords(data);\n return bech32.encode(prefix, words, Bech32MaxSize);\n}\nfunction encodeBytes(prefix, bytes) {\n return encodeBech32(prefix, bytes);\n}\nfunction nprofileEncode(profile) {\n let data = encodeTLV({\n 0: [hexToBytes2(profile.pubkey)],\n 1: (profile.relays || []).map((url) => utf8Encoder.encode(url))\n });\n return encodeBech32(\"nprofile\", data);\n}\nfunction neventEncode(event) {\n let kindArray;\n if (event.kind !== void 0) {\n kindArray = integerToUint8Array(event.kind);\n }\n let data = encodeTLV({\n 0: [hexToBytes2(event.id)],\n 1: (event.relays || []).map((url) => utf8Encoder.encode(url)),\n 2: event.author ? [hexToBytes2(event.author)] : [],\n 3: kindArray ? [new Uint8Array(kindArray)] : []\n });\n return encodeBech32(\"nevent\", data);\n}\nfunction naddrEncode(addr) {\n let kind = new ArrayBuffer(4);\n new DataView(kind).setUint32(0, addr.kind, false);\n let data = encodeTLV({\n 0: [utf8Encoder.encode(addr.identifier)],\n 1: (addr.relays || []).map((url) => utf8Encoder.encode(url)),\n 2: [hexToBytes2(addr.pubkey)],\n 3: [new Uint8Array(kind)]\n });\n return encodeBech32(\"naddr\", data);\n}\nfunction encodeTLV(tlv) {\n let entries = [];\n Object.entries(tlv).reverse().forEach(([t, vs]) => {\n vs.forEach((v) => {\n let entry = new Uint8Array(v.length + 2);\n entry.set([parseInt(t)], 0);\n entry.set([v.length], 1);\n entry.set(v, 2);\n entries.push(entry);\n });\n });\n return concatBytes(...entries);\n}\nexport {\n BECH32_REGEX,\n Bech32MaxSize,\n NostrTypeGuard,\n decode,\n decodeNostrURI,\n encodeBytes,\n naddrEncode,\n neventEncode,\n noteEncode,\n nprofileEncode,\n npubEncode,\n nsecEncode\n};\n","var __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, \"default\"), secondTarget && __copyProps(secondTarget, mod, \"default\"));\n\n// src/types.ts\nvar NdkNutzapStatus = /* @__PURE__ */ ((NdkNutzapStatus2) => {\n NdkNutzapStatus2[\"INITIAL\"] = \"initial\";\n NdkNutzapStatus2[\"PROCESSING\"] = \"processing\";\n NdkNutzapStatus2[\"REDEEMED\"] = \"redeemed\";\n NdkNutzapStatus2[\"SPENT\"] = \"spent\";\n NdkNutzapStatus2[\"MISSING_PRIVKEY\"] = \"missing_privkey\";\n NdkNutzapStatus2[\"TEMPORARY_ERROR\"] = \"temporary_error\";\n NdkNutzapStatus2[\"PERMANENT_ERROR\"] = \"permanent_error\";\n NdkNutzapStatus2[\"INVALID_NUTZAP\"] = \"invalid_nutzap\";\n return NdkNutzapStatus2;\n})(NdkNutzapStatus || {});\n\n// src/events/kinds/index.ts\nvar NDKKind = /* @__PURE__ */ ((NDKKind2) => {\n NDKKind2[NDKKind2[\"Metadata\"] = 0] = \"Metadata\";\n NDKKind2[NDKKind2[\"Text\"] = 1] = \"Text\";\n NDKKind2[NDKKind2[\"RecommendRelay\"] = 2] = \"RecommendRelay\";\n NDKKind2[NDKKind2[\"Contacts\"] = 3] = \"Contacts\";\n NDKKind2[NDKKind2[\"EncryptedDirectMessage\"] = 4] = \"EncryptedDirectMessage\";\n NDKKind2[NDKKind2[\"EventDeletion\"] = 5] = \"EventDeletion\";\n NDKKind2[NDKKind2[\"Repost\"] = 6] = \"Repost\";\n NDKKind2[NDKKind2[\"Reaction\"] = 7] = \"Reaction\";\n NDKKind2[NDKKind2[\"BadgeAward\"] = 8] = \"BadgeAward\";\n NDKKind2[NDKKind2[\"GroupChat\"] = 9] = \"GroupChat\";\n NDKKind2[NDKKind2[\"Thread\"] = 11] = \"Thread\";\n NDKKind2[NDKKind2[\"GroupReply\"] = 12] = \"GroupReply\";\n NDKKind2[NDKKind2[\"GiftWrapSeal\"] = 13] = \"GiftWrapSeal\";\n NDKKind2[NDKKind2[\"PrivateDirectMessage\"] = 14] = \"PrivateDirectMessage\";\n NDKKind2[NDKKind2[\"Image\"] = 20] = \"Image\";\n NDKKind2[NDKKind2[\"Video\"] = 21] = \"Video\";\n NDKKind2[NDKKind2[\"ShortVideo\"] = 22] = \"ShortVideo\";\n NDKKind2[NDKKind2[\"Story\"] = 23] = \"Story\";\n NDKKind2[NDKKind2[\"Vanish\"] = 62] = \"Vanish\";\n NDKKind2[NDKKind2[\"CashuWalletBackup\"] = 375] = \"CashuWalletBackup\";\n NDKKind2[NDKKind2[\"GiftWrap\"] = 1059] = \"GiftWrap\";\n NDKKind2[NDKKind2[\"GenericRepost\"] = 16] = \"GenericRepost\";\n NDKKind2[NDKKind2[\"ChannelCreation\"] = 40] = \"ChannelCreation\";\n NDKKind2[NDKKind2[\"ChannelMetadata\"] = 41] = \"ChannelMetadata\";\n NDKKind2[NDKKind2[\"ChannelMessage\"] = 42] = \"ChannelMessage\";\n NDKKind2[NDKKind2[\"ChannelHideMessage\"] = 43] = \"ChannelHideMessage\";\n NDKKind2[NDKKind2[\"ChannelMuteUser\"] = 44] = \"ChannelMuteUser\";\n NDKKind2[NDKKind2[\"WikiMergeRequest\"] = 818] = \"WikiMergeRequest\";\n NDKKind2[NDKKind2[\"GenericReply\"] = 1111] = \"GenericReply\";\n NDKKind2[NDKKind2[\"Media\"] = 1063] = \"Media\";\n NDKKind2[NDKKind2[\"DraftCheckpoint\"] = 1234] = \"DraftCheckpoint\";\n NDKKind2[NDKKind2[\"Task\"] = 1934] = \"Task\";\n NDKKind2[NDKKind2[\"Report\"] = 1984] = \"Report\";\n NDKKind2[NDKKind2[\"Label\"] = 1985] = \"Label\";\n NDKKind2[NDKKind2[\"DVMReqTextExtraction\"] = 5e3] = \"DVMReqTextExtraction\";\n NDKKind2[NDKKind2[\"DVMReqTextSummarization\"] = 5001] = \"DVMReqTextSummarization\";\n NDKKind2[NDKKind2[\"DVMReqTextTranslation\"] = 5002] = \"DVMReqTextTranslation\";\n NDKKind2[NDKKind2[\"DVMReqTextGeneration\"] = 5050] = \"DVMReqTextGeneration\";\n NDKKind2[NDKKind2[\"DVMReqImageGeneration\"] = 5100] = \"DVMReqImageGeneration\";\n NDKKind2[NDKKind2[\"DVMReqTextToSpeech\"] = 5250] = \"DVMReqTextToSpeech\";\n NDKKind2[NDKKind2[\"DVMReqDiscoveryNostrContent\"] = 5300] = \"DVMReqDiscoveryNostrContent\";\n NDKKind2[NDKKind2[\"DVMReqDiscoveryNostrPeople\"] = 5301] = \"DVMReqDiscoveryNostrPeople\";\n NDKKind2[NDKKind2[\"DVMReqTimestamping\"] = 5900] = \"DVMReqTimestamping\";\n NDKKind2[NDKKind2[\"DVMEventSchedule\"] = 5905] = \"DVMEventSchedule\";\n NDKKind2[NDKKind2[\"DVMJobFeedback\"] = 7e3] = \"DVMJobFeedback\";\n NDKKind2[NDKKind2[\"Subscribe\"] = 7001] = \"Subscribe\";\n NDKKind2[NDKKind2[\"Unsubscribe\"] = 7002] = \"Unsubscribe\";\n NDKKind2[NDKKind2[\"SubscriptionReceipt\"] = 7003] = \"SubscriptionReceipt\";\n NDKKind2[NDKKind2[\"CashuReserve\"] = 7373] = \"CashuReserve\";\n NDKKind2[NDKKind2[\"CashuQuote\"] = 7374] = \"CashuQuote\";\n NDKKind2[NDKKind2[\"CashuToken\"] = 7375] = \"CashuToken\";\n NDKKind2[NDKKind2[\"CashuWalletTx\"] = 7376] = \"CashuWalletTx\";\n NDKKind2[NDKKind2[\"GroupAdminAddUser\"] = 9e3] = \"GroupAdminAddUser\";\n NDKKind2[NDKKind2[\"GroupAdminRemoveUser\"] = 9001] = \"GroupAdminRemoveUser\";\n NDKKind2[NDKKind2[\"GroupAdminEditMetadata\"] = 9002] = \"GroupAdminEditMetadata\";\n NDKKind2[NDKKind2[\"GroupAdminEditStatus\"] = 9006] = \"GroupAdminEditStatus\";\n NDKKind2[NDKKind2[\"GroupAdminCreateGroup\"] = 9007] = \"GroupAdminCreateGroup\";\n NDKKind2[NDKKind2[\"GroupAdminRequestJoin\"] = 9021] = \"GroupAdminRequestJoin\";\n NDKKind2[NDKKind2[\"MuteList\"] = 1e4] = \"MuteList\";\n NDKKind2[NDKKind2[\"PinList\"] = 10001] = \"PinList\";\n NDKKind2[NDKKind2[\"RelayList\"] = 10002] = \"RelayList\";\n NDKKind2[NDKKind2[\"BookmarkList\"] = 10003] = \"BookmarkList\";\n NDKKind2[NDKKind2[\"CommunityList\"] = 10004] = \"CommunityList\";\n NDKKind2[NDKKind2[\"PublicChatList\"] = 10005] = \"PublicChatList\";\n NDKKind2[NDKKind2[\"BlockRelayList\"] = 10006] = \"BlockRelayList\";\n NDKKind2[NDKKind2[\"SearchRelayList\"] = 10007] = \"SearchRelayList\";\n NDKKind2[NDKKind2[\"SimpleGroupList\"] = 10009] = \"SimpleGroupList\";\n NDKKind2[NDKKind2[\"InterestList\"] = 10015] = \"InterestList\";\n NDKKind2[NDKKind2[\"CashuMintList\"] = 10019] = \"CashuMintList\";\n NDKKind2[NDKKind2[\"EmojiList\"] = 10030] = \"EmojiList\";\n NDKKind2[NDKKind2[\"DirectMessageReceiveRelayList\"] = 10050] = \"DirectMessageReceiveRelayList\";\n NDKKind2[NDKKind2[\"BlossomList\"] = 10063] = \"BlossomList\";\n NDKKind2[NDKKind2[\"NostrWaletConnectInfo\"] = 13194] = \"NostrWaletConnectInfo\";\n NDKKind2[NDKKind2[\"TierList\"] = 17e3] = \"TierList\";\n NDKKind2[NDKKind2[\"CashuWallet\"] = 17375] = \"CashuWallet\";\n NDKKind2[NDKKind2[\"FollowSet\"] = 3e4] = \"FollowSet\";\n NDKKind2[NDKKind2[\"CategorizedPeopleList\"] = 3e4 /* FollowSet */] = \"CategorizedPeopleList\";\n NDKKind2[NDKKind2[\"CategorizedBookmarkList\"] = 30001] = \"CategorizedBookmarkList\";\n NDKKind2[NDKKind2[\"RelaySet\"] = 30002] = \"RelaySet\";\n NDKKind2[NDKKind2[\"CategorizedRelayList\"] = 30002 /* RelaySet */] = \"CategorizedRelayList\";\n NDKKind2[NDKKind2[\"BookmarkSet\"] = 30003] = \"BookmarkSet\";\n NDKKind2[NDKKind2[\"CurationSet\"] = 30004] = \"CurationSet\";\n NDKKind2[NDKKind2[\"ArticleCurationSet\"] = 30004] = \"ArticleCurationSet\";\n NDKKind2[NDKKind2[\"VideoCurationSet\"] = 30005] = \"VideoCurationSet\";\n NDKKind2[NDKKind2[\"ImageCurationSet\"] = 30006] = \"ImageCurationSet\";\n NDKKind2[NDKKind2[\"InterestSet\"] = 30015] = \"InterestSet\";\n NDKKind2[NDKKind2[\"InterestsList\"] = 30015 /* InterestSet */] = \"InterestsList\";\n NDKKind2[NDKKind2[\"ProjectTemplate\"] = 30717] = \"ProjectTemplate\";\n NDKKind2[NDKKind2[\"EmojiSet\"] = 30030] = \"EmojiSet\";\n NDKKind2[NDKKind2[\"ModularArticle\"] = 30040] = \"ModularArticle\";\n NDKKind2[NDKKind2[\"ModularArticleItem\"] = 30041] = \"ModularArticleItem\";\n NDKKind2[NDKKind2[\"Wiki\"] = 30818] = \"Wiki\";\n NDKKind2[NDKKind2[\"Draft\"] = 31234] = \"Draft\";\n NDKKind2[NDKKind2[\"Project\"] = 31933] = \"Project\";\n NDKKind2[NDKKind2[\"SubscriptionTier\"] = 37001] = \"SubscriptionTier\";\n NDKKind2[NDKKind2[\"EcashMintRecommendation\"] = 38e3] = \"EcashMintRecommendation\";\n NDKKind2[NDKKind2[\"CashuMintAnnouncement\"] = 38172] = \"CashuMintAnnouncement\";\n NDKKind2[NDKKind2[\"FedimintMintAnnouncement\"] = 38173] = \"FedimintMintAnnouncement\";\n NDKKind2[NDKKind2[\"HighlightSet\"] = 39802] = \"HighlightSet\";\n NDKKind2[NDKKind2[\"CategorizedHighlightList\"] = 39802 /* HighlightSet */] = \"CategorizedHighlightList\";\n NDKKind2[NDKKind2[\"Nutzap\"] = 9321] = \"Nutzap\";\n NDKKind2[NDKKind2[\"ZapRequest\"] = 9734] = \"ZapRequest\";\n NDKKind2[NDKKind2[\"Zap\"] = 9735] = \"Zap\";\n NDKKind2[NDKKind2[\"Highlight\"] = 9802] = \"Highlight\";\n NDKKind2[NDKKind2[\"ClientAuth\"] = 22242] = \"ClientAuth\";\n NDKKind2[NDKKind2[\"NostrWalletConnectReq\"] = 23194] = \"NostrWalletConnectReq\";\n NDKKind2[NDKKind2[\"NostrWalletConnectRes\"] = 23195] = \"NostrWalletConnectRes\";\n NDKKind2[NDKKind2[\"NostrConnect\"] = 24133] = \"NostrConnect\";\n NDKKind2[NDKKind2[\"BlossomUpload\"] = 24242] = \"BlossomUpload\";\n NDKKind2[NDKKind2[\"HttpAuth\"] = 27235] = \"HttpAuth\";\n NDKKind2[NDKKind2[\"ProfileBadge\"] = 30008] = \"ProfileBadge\";\n NDKKind2[NDKKind2[\"BadgeDefinition\"] = 30009] = \"BadgeDefinition\";\n NDKKind2[NDKKind2[\"MarketStall\"] = 30017] = \"MarketStall\";\n NDKKind2[NDKKind2[\"MarketProduct\"] = 30018] = \"MarketProduct\";\n NDKKind2[NDKKind2[\"Article\"] = 30023] = \"Article\";\n NDKKind2[NDKKind2[\"AppSpecificData\"] = 30078] = \"AppSpecificData\";\n NDKKind2[NDKKind2[\"Classified\"] = 30402] = \"Classified\";\n NDKKind2[NDKKind2[\"HorizontalVideo\"] = 34235] = \"HorizontalVideo\";\n NDKKind2[NDKKind2[\"VerticalVideo\"] = 34236] = \"VerticalVideo\";\n NDKKind2[NDKKind2[\"GroupMetadata\"] = 39e3] = \"GroupMetadata\";\n NDKKind2[NDKKind2[\"GroupAdmins\"] = 39001] = \"GroupAdmins\";\n NDKKind2[NDKKind2[\"GroupMembers\"] = 39002] = \"GroupMembers\";\n NDKKind2[NDKKind2[\"FollowPack\"] = 39089] = \"FollowPack\";\n NDKKind2[NDKKind2[\"MediaFollowPack\"] = 39092] = \"MediaFollowPack\";\n NDKKind2[NDKKind2[\"AppRecommendation\"] = 31989] = \"AppRecommendation\";\n NDKKind2[NDKKind2[\"AppHandler\"] = 31990] = \"AppHandler\";\n return NDKKind2;\n})(NDKKind || {});\nvar NDKListKinds = [\n 1e4 /* MuteList */,\n 10001 /* PinList */,\n 10002 /* RelayList */,\n 10003 /* BookmarkList */,\n 10004 /* CommunityList */,\n 10005 /* PublicChatList */,\n 10006 /* BlockRelayList */,\n 10007 /* SearchRelayList */,\n 10015 /* InterestList */,\n 10030 /* EmojiList */,\n 10050 /* DirectMessageReceiveRelayList */,\n 3e4 /* FollowSet */,\n 30003 /* BookmarkSet */,\n 30001 /* CategorizedBookmarkList */,\n // Backwards compatibility\n 30002 /* RelaySet */,\n 30004 /* ArticleCurationSet */,\n 30005 /* VideoCurationSet */,\n 30015 /* InterestSet */,\n 30030 /* EmojiSet */,\n 39802 /* HighlightSet */\n];\n\n// src/events/index.ts\nimport { EventEmitter as EventEmitter2 } from \"tseep\";\n\n// src/relay/sets/calculate.ts\nimport createDebug from \"debug\";\n\n// src/outbox/write.ts\nfunction getRelaysForSync(ndk, author, type = \"write\") {\n if (!ndk.outboxTracker) return void 0;\n const item = ndk.outboxTracker.data.get(author);\n if (!item) return void 0;\n if (type === \"write\") {\n return item.writeRelays;\n }\n return item.readRelays;\n}\nasync function getWriteRelaysFor(ndk, author, type = \"write\") {\n if (!ndk.outboxTracker) return void 0;\n if (!ndk.outboxTracker.data.has(author)) {\n await ndk.outboxTracker.trackUsers([author]);\n }\n return getRelaysForSync(ndk, author, type);\n}\n\n// src/outbox/relay-ranking.ts\nfunction getTopRelaysForAuthors(ndk, authors) {\n const relaysWithCount = /* @__PURE__ */ new Map();\n authors.forEach((author) => {\n const writeRelays = getRelaysForSync(ndk, author);\n if (writeRelays) {\n writeRelays.forEach((relay) => {\n const count = relaysWithCount.get(relay) || 0;\n relaysWithCount.set(relay, count + 1);\n });\n }\n });\n const sortedRelays = Array.from(relaysWithCount.entries()).sort((a, b) => b[1] - a[1]);\n return sortedRelays.map((entry) => entry[0]);\n}\n\n// src/outbox/index.ts\nfunction getAllRelaysForAllPubkeys(ndk, pubkeys, type = \"read\") {\n const pubkeysToRelays = /* @__PURE__ */ new Map();\n const authorsMissingRelays = /* @__PURE__ */ new Set();\n pubkeys.forEach((pubkey) => {\n const relays = getRelaysForSync(ndk, pubkey, type);\n if (relays && relays.size > 0) {\n relays.forEach((relay) => {\n const pubkeysInRelay = pubkeysToRelays.get(relay) || /* @__PURE__ */ new Set();\n pubkeysInRelay.add(pubkey);\n });\n pubkeysToRelays.set(pubkey, relays);\n } else {\n authorsMissingRelays.add(pubkey);\n }\n });\n return { pubkeysToRelays, authorsMissingRelays };\n}\nfunction chooseRelayCombinationForPubkeys(ndk, pubkeys, type, { count, preferredRelays } = {}) {\n count ??= 2;\n preferredRelays ??= /* @__PURE__ */ new Set();\n const pool = ndk.pool;\n const connectedRelays = pool.connectedRelays();\n connectedRelays.forEach((relay) => {\n preferredRelays?.add(relay.url);\n });\n const relayToAuthorsMap = /* @__PURE__ */ new Map();\n const { pubkeysToRelays, authorsMissingRelays } = getAllRelaysForAllPubkeys(ndk, pubkeys, type);\n const sortedRelays = getTopRelaysForAuthors(ndk, pubkeys);\n const addAuthorToRelay = (author, relay) => {\n const authorsInRelay = relayToAuthorsMap.get(relay) || [];\n authorsInRelay.push(author);\n relayToAuthorsMap.set(relay, authorsInRelay);\n };\n for (const [author, authorRelays] of pubkeysToRelays.entries()) {\n let missingRelayCount = count;\n const addedRelaysForAuthor = /* @__PURE__ */ new Set();\n for (const relay of connectedRelays) {\n if (authorRelays.has(relay.url)) {\n addAuthorToRelay(author, relay.url);\n addedRelaysForAuthor.add(relay.url);\n missingRelayCount--;\n }\n }\n for (const authorRelay of authorRelays) {\n if (addedRelaysForAuthor.has(authorRelay)) continue;\n if (relayToAuthorsMap.has(authorRelay)) {\n addAuthorToRelay(author, authorRelay);\n addedRelaysForAuthor.add(authorRelay);\n missingRelayCount--;\n }\n }\n if (missingRelayCount <= 0) continue;\n for (const relay of sortedRelays) {\n if (missingRelayCount <= 0) break;\n if (addedRelaysForAuthor.has(relay)) continue;\n if (authorRelays.has(relay)) {\n addAuthorToRelay(author, relay);\n addedRelaysForAuthor.add(relay);\n missingRelayCount--;\n }\n }\n }\n for (const author of authorsMissingRelays) {\n pool.permanentAndConnectedRelays().forEach((relay) => {\n const authorsInRelay = relayToAuthorsMap.get(relay.url) || [];\n authorsInRelay.push(author);\n relayToAuthorsMap.set(relay.url, authorsInRelay);\n });\n }\n return relayToAuthorsMap;\n}\n\n// src/outbox/read/with-authors.ts\nfunction getRelaysForFilterWithAuthors(ndk, authors, relayGoalPerAuthor = 2) {\n return chooseRelayCombinationForPubkeys(ndk, authors, \"write\", { count: relayGoalPerAuthor });\n}\n\n// src/utils/normalize-url.ts\nfunction tryNormalizeRelayUrl(url) {\n try {\n return normalizeRelayUrl(url);\n } catch {\n return void 0;\n }\n}\nfunction normalizeRelayUrl(url) {\n let r = normalizeUrl(url, {\n stripAuthentication: false,\n stripWWW: false,\n stripHash: true\n });\n if (!r.endsWith(\"/\")) {\n r += \"/\";\n }\n return r;\n}\nfunction normalize(urls) {\n const normalized = /* @__PURE__ */ new Set();\n for (const url of urls) {\n try {\n normalized.add(normalizeRelayUrl(url));\n } catch {\n }\n }\n return Array.from(normalized);\n}\nvar DATA_URL_DEFAULT_MIME_TYPE = \"text/plain\";\nvar DATA_URL_DEFAULT_CHARSET = \"us-ascii\";\nvar testParameter = (name, filters) => filters.some((filter) => filter instanceof RegExp ? filter.test(name) : filter === name);\nvar supportedProtocols = /* @__PURE__ */ new Set([\"https:\", \"http:\", \"file:\"]);\nvar hasCustomProtocol = (urlString) => {\n try {\n const { protocol } = new URL(urlString);\n return protocol.endsWith(\":\") && !protocol.includes(\".\") && !supportedProtocols.has(protocol);\n } catch {\n return false;\n }\n};\nvar normalizeDataURL = (urlString, { stripHash }) => {\n const match = /^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(urlString);\n if (!match) {\n throw new Error(`Invalid URL: ${urlString}`);\n }\n const type = match.groups?.type ?? \"\";\n const data = match.groups?.data ?? \"\";\n let hash = match.groups?.hash ?? \"\";\n const mediaType = type.split(\";\");\n hash = stripHash ? \"\" : hash;\n let isBase64 = false;\n if (mediaType[mediaType.length - 1] === \"base64\") {\n mediaType.pop();\n isBase64 = true;\n }\n const mimeType = mediaType.shift()?.toLowerCase() ?? \"\";\n const attributes = mediaType.map((attribute) => {\n let [key, value = \"\"] = attribute.split(\"=\").map((string) => string.trim());\n if (key === \"charset\") {\n value = value.toLowerCase();\n if (value === DATA_URL_DEFAULT_CHARSET) {\n return \"\";\n }\n }\n return `${key}${value ? `=${value}` : \"\"}`;\n }).filter(Boolean);\n const normalizedMediaType = [...attributes];\n if (isBase64) {\n normalizedMediaType.push(\"base64\");\n }\n if (normalizedMediaType.length > 0 || mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE) {\n normalizedMediaType.unshift(mimeType);\n }\n return `data:${normalizedMediaType.join(\";\")},${isBase64 ? data.trim() : data}${hash ? `#${hash}` : \"\"}`;\n};\nfunction normalizeUrl(urlString, options = {}) {\n options = {\n defaultProtocol: \"http\",\n normalizeProtocol: true,\n forceHttp: false,\n forceHttps: false,\n stripAuthentication: true,\n stripHash: false,\n stripTextFragment: true,\n stripWWW: true,\n removeQueryParameters: [/^utm_\\w+/i],\n removeTrailingSlash: true,\n removeSingleSlash: true,\n removeDirectoryIndex: false,\n removeExplicitPort: false,\n sortQueryParameters: true,\n ...options\n };\n if (typeof options.defaultProtocol === \"string\" && !options.defaultProtocol.endsWith(\":\")) {\n options.defaultProtocol = `${options.defaultProtocol}:`;\n }\n urlString = urlString.trim();\n if (/^data:/i.test(urlString)) {\n return normalizeDataURL(urlString, options);\n }\n if (hasCustomProtocol(urlString)) {\n return urlString;\n }\n const hasRelativeProtocol = urlString.startsWith(\"//\");\n const isRelativeUrl = !hasRelativeProtocol && /^\\.*\\//.test(urlString);\n if (!isRelativeUrl) {\n urlString = urlString.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//, options.defaultProtocol);\n }\n const urlObject = new URL(urlString);\n urlObject.hostname = urlObject.hostname.toLowerCase();\n if (options.forceHttp && options.forceHttps) {\n throw new Error(\"The `forceHttp` and `forceHttps` options cannot be used together\");\n }\n if (options.forceHttp && urlObject.protocol === \"https:\") {\n urlObject.protocol = \"http:\";\n }\n if (options.forceHttps && urlObject.protocol === \"http:\") {\n urlObject.protocol = \"https:\";\n }\n if (options.stripAuthentication) {\n urlObject.username = \"\";\n urlObject.password = \"\";\n }\n if (options.stripHash) {\n urlObject.hash = \"\";\n } else if (options.stripTextFragment) {\n urlObject.hash = urlObject.hash.replace(/#?:~:text.*?$/i, \"\");\n }\n if (urlObject.pathname) {\n const protocolRegex = /\\b[a-z][a-z\\d+\\-.]{1,50}:\\/\\//g;\n let lastIndex = 0;\n let result = \"\";\n for (; ; ) {\n const match = protocolRegex.exec(urlObject.pathname);\n if (!match) {\n break;\n }\n const protocol = match[0];\n const protocolAtIndex = match.index;\n const intermediate = urlObject.pathname.slice(lastIndex, protocolAtIndex);\n result += intermediate.replace(/\\/{2,}/g, \"/\");\n result += protocol;\n lastIndex = protocolAtIndex + protocol.length;\n }\n const remnant = urlObject.pathname.slice(lastIndex, urlObject.pathname.length);\n result += remnant.replace(/\\/{2,}/g, \"/\");\n urlObject.pathname = result;\n }\n if (urlObject.pathname) {\n try {\n urlObject.pathname = decodeURI(urlObject.pathname);\n } catch {\n }\n }\n if (options.removeDirectoryIndex === true) {\n options.removeDirectoryIndex = [/^index\\.[a-z]+$/];\n }\n if (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) {\n let pathComponents = urlObject.pathname.split(\"/\");\n const lastComponent = pathComponents[pathComponents.length - 1];\n if (testParameter(lastComponent, options.removeDirectoryIndex)) {\n pathComponents = pathComponents.slice(0, -1);\n urlObject.pathname = `${pathComponents.slice(1).join(\"/\")}/`;\n }\n }\n if (urlObject.hostname) {\n urlObject.hostname = urlObject.hostname.replace(/\\.$/, \"\");\n if (options.stripWWW && /^www\\.(?!www\\.)[a-z\\-\\d]{1,63}\\.[a-z.\\-\\d]{2,63}$/.test(urlObject.hostname)) {\n urlObject.hostname = urlObject.hostname.replace(/^www\\./, \"\");\n }\n }\n if (Array.isArray(options.removeQueryParameters)) {\n for (const key of [...urlObject.searchParams.keys()]) {\n if (testParameter(key, options.removeQueryParameters)) {\n urlObject.searchParams.delete(key);\n }\n }\n }\n if (!Array.isArray(options.keepQueryParameters) && options.removeQueryParameters === true) {\n urlObject.search = \"\";\n }\n if (Array.isArray(options.keepQueryParameters) && options.keepQueryParameters.length > 0) {\n for (const key of [...urlObject.searchParams.keys()]) {\n if (!testParameter(key, options.keepQueryParameters)) {\n urlObject.searchParams.delete(key);\n }\n }\n }\n if (options.sortQueryParameters) {\n urlObject.searchParams.sort();\n try {\n urlObject.search = decodeURIComponent(urlObject.search);\n } catch {\n }\n }\n if (options.removeTrailingSlash) {\n urlObject.pathname = urlObject.pathname.replace(/\\/$/, \"\");\n }\n if (options.removeExplicitPort && urlObject.port) {\n urlObject.port = \"\";\n }\n const oldUrlString = urlString;\n urlString = urlObject.toString();\n if (!options.removeSingleSlash && urlObject.pathname === \"/\" && !oldUrlString.endsWith(\"/\") && urlObject.hash === \"\") {\n urlString = urlString.replace(/\\/$/, \"\");\n }\n if ((options.removeTrailingSlash || urlObject.pathname === \"/\") && urlObject.hash === \"\" && options.removeSingleSlash) {\n urlString = urlString.replace(/\\/$/, \"\");\n }\n if (hasRelativeProtocol && !options.normalizeProtocol) {\n urlString = urlString.replace(/^http:\\/\\//, \"//\");\n }\n if (options.stripProtocol) {\n urlString = urlString.replace(/^(?:https?:)?\\/\\//, \"\");\n }\n return urlString;\n}\n\n// src/relay/index.ts\nimport debug2 from \"debug\";\nimport { EventEmitter } from \"tseep\";\n\n// src/relay/keepalive.ts\nvar NDKRelayKeepalive = class {\n /**\n * @param timeout - Time in milliseconds to wait before considering connection stale (default 30s)\n * @param onSilenceDetected - Callback when silence is detected\n */\n constructor(timeout = 3e4, onSilenceDetected) {\n this.onSilenceDetected = onSilenceDetected;\n this.timeout = timeout;\n }\n lastActivity = Date.now();\n timer;\n timeout;\n isRunning = false;\n /**\n * Records activity from the relay, resetting the silence timer\n */\n recordActivity() {\n this.lastActivity = Date.now();\n if (this.isRunning) {\n this.resetTimer();\n }\n }\n /**\n * Starts monitoring for relay silence\n */\n start() {\n if (this.isRunning) return;\n this.isRunning = true;\n this.lastActivity = Date.now();\n this.resetTimer();\n }\n /**\n * Stops monitoring for relay silence\n */\n stop() {\n this.isRunning = false;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = void 0;\n }\n }\n resetTimer() {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n const silenceTime = Date.now() - this.lastActivity;\n if (silenceTime >= this.timeout) {\n this.onSilenceDetected();\n } else {\n const remainingTime = this.timeout - silenceTime;\n this.timer = setTimeout(() => {\n this.onSilenceDetected();\n }, remainingTime);\n }\n }, this.timeout);\n }\n};\nasync function probeRelayConnection(relay) {\n const probeId = `probe-${Math.random().toString(36).substring(7)}`;\n return new Promise((resolve) => {\n let responded = false;\n const timeout = setTimeout(() => {\n if (!responded) {\n responded = true;\n relay.send([\"CLOSE\", probeId]);\n resolve(false);\n }\n }, 5e3);\n const handler = () => {\n if (!responded) {\n responded = true;\n clearTimeout(timeout);\n relay.send([\"CLOSE\", probeId]);\n resolve(true);\n }\n };\n relay.once(\"message\", handler);\n relay.send([\n \"REQ\",\n probeId,\n {\n kinds: [99999],\n limit: 0\n }\n ]);\n });\n}\n\n// src/relay/connectivity.ts\nvar MAX_RECONNECT_ATTEMPTS = 5;\nvar FLAPPING_THRESHOLD_MS = 1e3;\nvar NDKRelayConnectivity = class {\n ndkRelay;\n ws;\n _status;\n timeoutMs;\n connectedAt;\n _connectionStats = {\n attempts: 0,\n success: 0,\n durations: []\n };\n debug;\n netDebug;\n connectTimeout;\n reconnectTimeout;\n ndk;\n openSubs = /* @__PURE__ */ new Map();\n openCountRequests = /* @__PURE__ */ new Map();\n openEventPublishes = /* @__PURE__ */ new Map();\n serial = 0;\n baseEoseTimeout = 4400;\n // Keepalive and monitoring\n keepalive;\n wsStateMonitor;\n sleepDetector;\n lastSleepCheck = Date.now();\n lastMessageSent = Date.now();\n wasIdle = false;\n constructor(ndkRelay, ndk) {\n this.ndkRelay = ndkRelay;\n this._status = 1 /* DISCONNECTED */;\n const rand = Math.floor(Math.random() * 1e3);\n this.debug = this.ndkRelay.debug.extend(`connectivity${rand}`);\n this.ndk = ndk;\n this.setupMonitoring();\n }\n /**\n * Sets up keepalive, WebSocket state monitoring, and sleep detection\n */\n setupMonitoring() {\n this.keepalive = new NDKRelayKeepalive(3e4, async () => {\n this.debug(\"Relay silence detected, probing connection\");\n const isAlive = await probeRelayConnection({\n send: (msg) => this.send(JSON.stringify(msg)),\n once: (event, handler) => {\n const messageHandler = (e) => {\n try {\n const data = JSON.parse(e.data);\n if (data[0] === \"EOSE\" || data[0] === \"EVENT\" || data[0] === \"NOTICE\") {\n handler();\n this.ws?.removeEventListener(\"message\", messageHandler);\n }\n } catch {\n }\n };\n this.ws?.addEventListener(\"message\", messageHandler);\n }\n });\n if (!isAlive) {\n this.debug(\"Probe failed, connection is stale\");\n this.handleStaleConnection();\n }\n });\n this.wsStateMonitor = setInterval(() => {\n if (this._status === 5 /* CONNECTED */) {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.debug(\"WebSocket died silently, reconnecting\");\n this.handleStaleConnection();\n }\n }\n }, 5e3);\n this.sleepDetector = setInterval(() => {\n const now = Date.now();\n const elapsed = now - this.lastSleepCheck;\n if (elapsed > 15e3) {\n this.debug(`Detected possible sleep/wake (${elapsed}ms gap)`);\n this.handlePossibleWake();\n }\n this.lastSleepCheck = now;\n }, 1e4);\n }\n /**\n * Handles detection of a stale connection\n */\n handleStaleConnection() {\n this._status = 1 /* DISCONNECTED */;\n this.wasIdle = true;\n this.onDisconnect();\n }\n /**\n * Handles possible system wake event\n */\n handlePossibleWake() {\n this.debug(\"System wake detected, checking all connections\");\n this.wasIdle = true;\n if (this._status >= 5 /* CONNECTED */) {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.handleStaleConnection();\n } else {\n probeRelayConnection({\n send: (msg) => this.send(JSON.stringify(msg)),\n once: (event, handler) => {\n const messageHandler = (e) => {\n try {\n const data = JSON.parse(e.data);\n if (data[0] === \"EOSE\" || data[0] === \"EVENT\" || data[0] === \"NOTICE\") {\n handler();\n this.ws?.removeEventListener(\"message\", messageHandler);\n }\n } catch {\n }\n };\n this.ws?.addEventListener(\"message\", messageHandler);\n }\n }).then((isAlive) => {\n if (!isAlive) {\n this.handleStaleConnection();\n }\n });\n }\n }\n }\n /**\n * Resets the reconnection state for system-wide events\n * Used by NDKPool when detecting system sleep/wake\n */\n resetReconnectionState() {\n this.wasIdle = true;\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = void 0;\n }\n }\n /**\n * Connects to the NDK relay and handles the connection lifecycle.\n *\n * This method attempts to establish a WebSocket connection to the NDK relay specified in the `ndkRelay` object.\n * If the connection is successful, it updates the connection statistics, sets the connection status to `CONNECTED`,\n * and emits `connect` and `ready` events on the `ndkRelay` object.\n *\n * If the connection attempt fails, it handles the error by either initiating a reconnection attempt or emitting a\n * `delayed-connect` event on the `ndkRelay` object, depending on the `reconnect` parameter.\n *\n * @param timeoutMs - The timeout in milliseconds for the connection attempt. If not provided, the default timeout from the `ndkRelay` object is used.\n * @param reconnect - Indicates whether a reconnection should be attempted if the connection fails. Defaults to `true`.\n * @returns A Promise that resolves when the connection is established, or rejects if the connection fails.\n */\n async connect(timeoutMs, reconnect = true) {\n if (this.ws && this.ws.readyState !== WebSocket.OPEN && this.ws.readyState !== WebSocket.CONNECTING) {\n this.debug(\"Cleaning up stale WebSocket connection\");\n try {\n this.ws.close();\n } catch (e) {\n }\n this.ws = void 0;\n this._status = 1 /* DISCONNECTED */;\n }\n if (this._status !== 2 /* RECONNECTING */ && this._status !== 1 /* DISCONNECTED */ || this.reconnectTimeout) {\n this.debug(\n \"Relay requested to be connected but was in state %s or it had a reconnect timeout\",\n this._status\n );\n return;\n }\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = void 0;\n }\n if (this.connectTimeout) {\n clearTimeout(this.connectTimeout);\n this.connectTimeout = void 0;\n }\n timeoutMs ??= this.timeoutMs;\n if (!this.timeoutMs && timeoutMs) this.timeoutMs = timeoutMs;\n if (this.timeoutMs) this.connectTimeout = setTimeout(() => this.onConnectionError(reconnect), this.timeoutMs);\n try {\n this.updateConnectionStats.attempt();\n if (this._status === 1 /* DISCONNECTED */) this._status = 4 /* CONNECTING */;\n else this._status = 2 /* RECONNECTING */;\n this.ws = new WebSocket(this.ndkRelay.url);\n this.ws.onopen = this.onConnect.bind(this);\n this.ws.onclose = this.onDisconnect.bind(this);\n this.ws.onmessage = this.onMessage.bind(this);\n this.ws.onerror = this.onError.bind(this);\n } catch (e) {\n this.debug(`Failed to connect to ${this.ndkRelay.url}`, e);\n this._status = 1 /* DISCONNECTED */;\n if (reconnect) this.handleReconnection();\n else this.ndkRelay.emit(\"delayed-connect\", 2 * 24 * 60 * 60 * 1e3);\n throw e;\n }\n }\n /**\n * Disconnects the WebSocket connection to the NDK relay.\n * This method sets the connection status to `NDKRelayStatus.DISCONNECTING`,\n * attempts to close the WebSocket connection, and sets the status to\n * `NDKRelayStatus.DISCONNECTED` if the disconnect operation fails.\n */\n disconnect() {\n this._status = 0 /* DISCONNECTING */;\n this.keepalive?.stop();\n if (this.wsStateMonitor) {\n clearInterval(this.wsStateMonitor);\n this.wsStateMonitor = void 0;\n }\n if (this.sleepDetector) {\n clearInterval(this.sleepDetector);\n this.sleepDetector = void 0;\n }\n try {\n this.ws?.close();\n } catch (e) {\n this.debug(\"Failed to disconnect\", e);\n this._status = 1 /* DISCONNECTED */;\n }\n }\n /**\n * Handles the error that occurred when attempting to connect to the NDK relay.\n * If `reconnect` is `true`, this method will initiate a reconnection attempt.\n * Otherwise, it will emit a `delayed-connect` event on the `ndkRelay` object,\n * indicating that a reconnection should be attempted after a delay.\n *\n * @param reconnect - Indicates whether a reconnection should be attempted.\n */\n onConnectionError(reconnect) {\n this.debug(`Error connecting to ${this.ndkRelay.url}`, this.timeoutMs);\n if (reconnect && !this.reconnectTimeout) {\n this.handleReconnection();\n }\n }\n /**\n * Handles the connection event when the WebSocket connection is established.\n * This method is called when the WebSocket connection is successfully opened.\n * It clears any existing connection and reconnection timeouts, updates the connection statistics,\n * sets the connection status to `CONNECTED`, and emits `connect` and `ready` events on the `ndkRelay` object.\n */\n onConnect() {\n this.netDebug?.(\"connected\", this.ndkRelay);\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = void 0;\n }\n if (this.connectTimeout) {\n clearTimeout(this.connectTimeout);\n this.connectTimeout = void 0;\n }\n this.updateConnectionStats.connected();\n this._status = 5 /* CONNECTED */;\n this.keepalive?.start();\n this.wasIdle = false;\n this.ndkRelay.emit(\"connect\");\n this.ndkRelay.emit(\"ready\");\n }\n /**\n * Handles the disconnection event when the WebSocket connection is closed.\n * This method is called when the WebSocket connection is successfully closed.\n * It updates the connection statistics, sets the connection status to `DISCONNECTED`,\n * initiates a reconnection attempt if we didn't disconnect ourselves,\n * and emits a `disconnect` event on the `ndkRelay` object.\n */\n onDisconnect() {\n this.netDebug?.(\"disconnected\", this.ndkRelay);\n this.updateConnectionStats.disconnected();\n this.keepalive?.stop();\n if (this._status === 5 /* CONNECTED */) {\n this.handleReconnection();\n }\n this._status = 1 /* DISCONNECTED */;\n this.ndkRelay.emit(\"disconnect\");\n }\n /**\n * Handles incoming messages from the NDK relay WebSocket connection.\n * This method is called whenever a message is received from the relay.\n * It parses the message data and dispatches the appropriate handling logic based on the message type.\n *\n * @param event - The MessageEvent containing the received message data.\n */\n onMessage(event) {\n this.netDebug?.(event.data, this.ndkRelay, \"recv\");\n this.keepalive?.recordActivity();\n try {\n const data = JSON.parse(event.data);\n const [cmd, id, ..._rest] = data;\n switch (cmd) {\n case \"EVENT\": {\n const so = this.openSubs.get(id);\n const event2 = data[2];\n if (!so) {\n this.debug(`Received event for unknown subscription ${id}`);\n return;\n }\n so.onevent(event2);\n return;\n }\n case \"COUNT\": {\n const payload = data[2];\n const cr = this.openCountRequests.get(id);\n if (cr) {\n cr.resolve(payload.count);\n this.openCountRequests.delete(id);\n }\n return;\n }\n case \"EOSE\": {\n const so = this.openSubs.get(id);\n if (!so) return;\n so.oneose(id);\n return;\n }\n case \"OK\": {\n const ok = data[2];\n const reason = data[3];\n const ep = this.openEventPublishes.get(id);\n const firstEp = ep?.pop();\n if (!ep || !firstEp) {\n this.debug(\"Received OK for unknown event publish\", id);\n return;\n }\n if (ok) firstEp.resolve(reason);\n else firstEp.reject(new Error(reason));\n if (ep.length === 0) {\n this.openEventPublishes.delete(id);\n } else {\n this.openEventPublishes.set(id, ep);\n }\n return;\n }\n case \"CLOSED\": {\n const so = this.openSubs.get(id);\n if (!so) return;\n so.onclosed(data[2]);\n return;\n }\n case \"NOTICE\":\n this.onNotice(data[1]);\n return;\n case \"AUTH\": {\n this.onAuthRequested(data[1]);\n return;\n }\n }\n } catch (error) {\n this.debug(`Error parsing message from ${this.ndkRelay.url}: ${error.message}`, error?.stack);\n return;\n }\n }\n /**\n * Handles an authentication request from the NDK relay.\n *\n * If an authentication policy is configured, it will be used to authenticate the connection.\n * Otherwise, the `auth` event will be emitted to allow the application to handle the authentication.\n *\n * @param challenge - The authentication challenge provided by the NDK relay.\n */\n async onAuthRequested(challenge) {\n const authPolicy = this.ndkRelay.authPolicy ?? this.ndk?.relayAuthDefaultPolicy;\n this.debug(\"Relay requested authentication\", {\n havePolicy: !!authPolicy\n });\n if (this._status === 7 /* AUTHENTICATING */) {\n this.debug(\"Already authenticating, ignoring\");\n return;\n }\n this._status = 6 /* AUTH_REQUESTED */;\n if (authPolicy) {\n if (this._status >= 5 /* CONNECTED */) {\n this._status = 7 /* AUTHENTICATING */;\n let res;\n try {\n res = await authPolicy(this.ndkRelay, challenge);\n } catch (e) {\n this.debug(\"Authentication policy threw an error\", e);\n res = false;\n }\n this.debug(\"Authentication policy returned\", !!res);\n if (res instanceof NDKEvent || res === true) {\n if (res instanceof NDKEvent) {\n await this.auth(res);\n }\n const authenticate = async () => {\n if (this._status >= 5 /* CONNECTED */ && this._status < 8 /* AUTHENTICATED */) {\n const event = new NDKEvent(this.ndk);\n event.kind = 22242 /* ClientAuth */;\n event.tags = [\n [\"relay\", this.ndkRelay.url],\n [\"challenge\", challenge]\n ];\n await event.sign();\n this.auth(event).then(() => {\n this._status = 8 /* AUTHENTICATED */;\n this.ndkRelay.emit(\"authed\");\n this.debug(\"Authentication successful\");\n }).catch((e) => {\n this._status = 6 /* AUTH_REQUESTED */;\n this.ndkRelay.emit(\"auth:failed\", e);\n this.debug(\"Authentication failed\", e);\n });\n } else {\n this.debug(\"Authentication failed, it changed status, status is %d\", this._status);\n }\n };\n if (res === true) {\n if (!this.ndk?.signer) {\n this.debug(\"No signer available for authentication localhost\");\n this.ndk?.once(\"signer:ready\", authenticate);\n } else {\n authenticate().catch((e) => {\n console.error(\"Error authenticating\", e);\n });\n }\n }\n this._status = 5 /* CONNECTED */;\n this.ndkRelay.emit(\"authed\");\n }\n }\n } else {\n this.ndkRelay.emit(\"auth\", challenge);\n }\n }\n /**\n * Handles errors that occur on the WebSocket connection to the relay.\n * @param error - The error or event that occurred.\n */\n onError(error) {\n this.debug(`WebSocket error on ${this.ndkRelay.url}:`, error);\n }\n /**\n * Gets the current status of the NDK relay connection.\n * @returns {NDKRelayStatus} The current status of the NDK relay connection.\n */\n get status() {\n return this._status;\n }\n /**\n * Checks if the NDK relay connection is currently available.\n * @returns {boolean} `true` if the relay connection is in the `CONNECTED` status, `false` otherwise.\n */\n isAvailable() {\n return this._status === 5 /* CONNECTED */;\n }\n /**\n * Checks if the NDK relay connection is flapping, which means the connection is rapidly\n * disconnecting and reconnecting. This is determined by analyzing the durations of the\n * last three connection attempts. If the standard deviation of the durations is less\n * than 1000 milliseconds, the connection is considered to be flapping.\n *\n * @returns {boolean} `true` if the connection is flapping, `false` otherwise.\n */\n isFlapping() {\n const durations = this._connectionStats.durations;\n if (durations.length % 3 !== 0) return false;\n const sum = durations.reduce((a, b) => a + b, 0);\n const avg = sum / durations.length;\n const variance = durations.map((x) => (x - avg) ** 2).reduce((a, b) => a + b, 0) / durations.length;\n const stdDev = Math.sqrt(variance);\n const isFlapping = stdDev < FLAPPING_THRESHOLD_MS;\n return isFlapping;\n }\n /**\n * Handles a notice received from the NDK relay.\n * If the notice indicates the relay is complaining (e.g. \"too many\" or \"maximum\"),\n * the method disconnects from the relay and attempts to reconnect after a 2-second delay.\n * A debug message is logged with the relay URL and the notice text.\n * The \"notice\" event is emitted on the ndkRelay instance with the notice text.\n *\n * @param notice - The notice text received from the NDK relay.\n */\n async onNotice(notice) {\n this.ndkRelay.emit(\"notice\", notice);\n }\n /**\n * Attempts to reconnect to the NDK relay after a connection is lost.\n * This function is called recursively to handle multiple reconnection attempts.\n * It checks if the relay is flapping and emits a \"flapping\" event if so.\n * It then calculates a delay before the next reconnection attempt based on the number of previous attempts.\n * The function sets a timeout to execute the next reconnection attempt after the calculated delay.\n * If the maximum number of reconnection attempts is reached, a debug message is logged.\n *\n * @param attempt - The current attempt number (default is 0).\n */\n handleReconnection(attempt = 0) {\n if (this.reconnectTimeout) return;\n if (this.isFlapping()) {\n this.ndkRelay.emit(\"flapping\", this._connectionStats);\n this._status = 3 /* FLAPPING */;\n return;\n }\n let reconnectDelay;\n if (this.wasIdle) {\n const aggressiveDelays = [0, 1e3, 2e3, 5e3, 1e4, 3e4];\n reconnectDelay = aggressiveDelays[Math.min(attempt, aggressiveDelays.length - 1)];\n this.debug(`Using aggressive reconnect after idle, attempt ${attempt}, delay ${reconnectDelay}ms`);\n } else if (this.connectedAt) {\n reconnectDelay = Math.max(0, 6e4 - (Date.now() - this.connectedAt));\n } else {\n reconnectDelay = Math.min(1e3 * Math.pow(2, attempt), 3e4);\n this.debug(`Using standard backoff, attempt ${attempt}, delay ${reconnectDelay}ms`);\n }\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = void 0;\n this._status = 2 /* RECONNECTING */;\n this.connect().catch((_err) => {\n if (attempt < MAX_RECONNECT_ATTEMPTS) {\n this.handleReconnection(attempt + 1);\n } else {\n this.debug(\"Max reconnect attempts reached\");\n this.wasIdle = false;\n }\n });\n }, reconnectDelay);\n this.ndkRelay.emit(\"delayed-connect\", reconnectDelay);\n this.debug(\"Reconnecting in\", reconnectDelay);\n this._connectionStats.nextReconnectAt = Date.now() + reconnectDelay;\n }\n /**\n * Sends a message to the NDK relay if the connection is in the CONNECTED state and the WebSocket is open.\n * If the connection is not in the CONNECTED state or the WebSocket is not open, logs a debug message and throws an error.\n *\n * @param message - The message to send to the NDK relay.\n * @throws {Error} If attempting to send on a closed relay connection.\n */\n async send(message) {\n const idleTime = Date.now() - this.lastMessageSent;\n if (idleTime > 12e4) {\n this.wasIdle = true;\n }\n if (this._status >= 5 /* CONNECTED */ && this.ws?.readyState === WebSocket.OPEN) {\n this.ws?.send(message);\n this.netDebug?.(message, this.ndkRelay, \"send\");\n this.lastMessageSent = Date.now();\n } else {\n this.debug(`Not connected to ${this.ndkRelay.url} (%d), not sending message ${message}`, this._status);\n if (this._status >= 5 /* CONNECTED */ && this.ws?.readyState !== WebSocket.OPEN) {\n this.debug(`Stale connection detected, WebSocket state: ${this.ws?.readyState}`);\n this.handleStaleConnection();\n }\n }\n }\n /**\n * Authenticates the NDK event by sending it to the NDK relay and returning a promise that resolves with the result.\n *\n * @param event - The NDK event to authenticate.\n * @returns A promise that resolves with the authentication result.\n */\n async auth(event) {\n const ret = new Promise((resolve, reject) => {\n const val = this.openEventPublishes.get(event.id) ?? [];\n val.push({ resolve, reject });\n this.openEventPublishes.set(event.id, val);\n });\n this.send(`[\"AUTH\",${JSON.stringify(event.rawEvent())}]`);\n return ret;\n }\n /**\n * Publishes an NDK event to the relay and returns a promise that resolves with the result.\n *\n * @param event - The NDK event to publish.\n * @returns A promise that resolves with the result of the event publication.\n * @throws {Error} If attempting to publish on a closed relay connection.\n */\n async publish(event) {\n const ret = new Promise((resolve, reject) => {\n const val = this.openEventPublishes.get(event.id) ?? [];\n if (val.length > 0) {\n console.warn(`Duplicate event publishing detected, you are publishing event ${event.id} twice`);\n }\n val.push({ resolve, reject });\n this.openEventPublishes.set(event.id, val);\n });\n this.send(`[\"EVENT\",${JSON.stringify(event)}]`);\n return ret;\n }\n /**\n * Counts the number of events that match the provided filters.\n *\n * @param filters - The filters to apply to the count request.\n * @param params - An optional object containing a custom id for the count request.\n * @returns A promise that resolves with the number of matching events.\n * @throws {Error} If attempting to send the count request on a closed relay connection.\n */\n async count(filters, params) {\n this.serial++;\n const id = params?.id || `count:${this.serial}`;\n const ret = new Promise((resolve, reject) => {\n this.openCountRequests.set(id, { resolve, reject });\n });\n this.send(`[\"COUNT\",\"${id}\",${JSON.stringify(filters).substring(1)}`);\n return ret;\n }\n close(subId, reason) {\n this.send(`[\"CLOSE\",\"${subId}\"]`);\n const sub = this.openSubs.get(subId);\n this.openSubs.delete(subId);\n if (sub) sub.onclose(reason);\n }\n /**\n * Subscribes to the NDK relay with the provided filters and parameters.\n *\n * @param filters - The filters to apply to the subscription.\n * @param params - The subscription parameters, including an optional custom id.\n * @returns A new NDKRelaySubscription instance.\n */\n req(relaySub) {\n `${this.send(`[\"REQ\",\"${relaySub.subId}\",${JSON.stringify(relaySub.executeFilters).substring(1)}`)}]`;\n this.openSubs.set(relaySub.subId, relaySub);\n }\n /**\n * Utility functions to update the connection stats.\n */\n updateConnectionStats = {\n connected: () => {\n this._connectionStats.success++;\n this._connectionStats.connectedAt = Date.now();\n },\n disconnected: () => {\n if (this._connectionStats.connectedAt) {\n this._connectionStats.durations.push(Date.now() - this._connectionStats.connectedAt);\n if (this._connectionStats.durations.length > 100) {\n this._connectionStats.durations.shift();\n }\n }\n this._connectionStats.connectedAt = void 0;\n },\n attempt: () => {\n this._connectionStats.attempts++;\n this._connectionStats.connectedAt = Date.now();\n }\n };\n /** Returns the connection stats. */\n get connectionStats() {\n return this._connectionStats;\n }\n /** Returns the relay URL */\n get url() {\n return this.ndkRelay.url;\n }\n get connected() {\n return this._status >= 5 /* CONNECTED */ && this.ws?.readyState === WebSocket.OPEN;\n }\n};\n\n// src/relay/publisher.ts\nvar NDKRelayPublisher = class {\n ndkRelay;\n debug;\n constructor(ndkRelay) {\n this.ndkRelay = ndkRelay;\n this.debug = ndkRelay.debug.extend(\"publisher\");\n }\n /**\n * Published an event to the relay; if the relay is not connected, it will\n * wait for the relay to connect before publishing the event.\n *\n * If the relay does not connect within the timeout, the publish operation\n * will fail.\n * @param event The event to publish\n * @param timeoutMs The timeout for the publish operation in milliseconds\n * @returns A promise that resolves when the event has been published or rejects if the operation times out\n */\n async publish(event, timeoutMs = 2500) {\n let timeout;\n const publishConnected = () => {\n return new Promise((resolve, reject) => {\n try {\n this.publishEvent(event).then((_result) => {\n this.ndkRelay.emit(\"published\", event);\n event.emit(\"relay:published\", this.ndkRelay);\n resolve(true);\n }).catch(reject);\n } catch (err) {\n reject(err);\n }\n });\n };\n const timeoutPromise = new Promise((_, reject) => {\n timeout = setTimeout(() => {\n timeout = void 0;\n reject(new Error(`Timeout: ${timeoutMs}ms`));\n }, timeoutMs);\n });\n const onConnectHandler = () => {\n publishConnected().then((result) => connectResolve(result)).catch((err) => connectReject(err));\n };\n let connectResolve;\n let connectReject;\n const onError = (err) => {\n this.ndkRelay.debug(\"Publish failed\", err, event.id);\n this.ndkRelay.emit(\"publish:failed\", event, err);\n event.emit(\"relay:publish:failed\", this.ndkRelay, err);\n throw err;\n };\n const onFinally = () => {\n if (timeout) clearTimeout(timeout);\n this.ndkRelay.removeListener(\"connect\", onConnectHandler);\n };\n if (this.ndkRelay.status >= 5 /* CONNECTED */) {\n return Promise.race([publishConnected(), timeoutPromise]).catch(onError).finally(onFinally);\n }\n if (this.ndkRelay.status <= 1 /* DISCONNECTED */) {\n console.warn(\"Relay is disconnected, trying to connect to publish an event\", this.ndkRelay.url);\n this.ndkRelay.connect();\n } else {\n console.warn(\"Relay not connected, waiting for connection to publish an event\", this.ndkRelay.url);\n }\n return Promise.race([\n new Promise((resolve, reject) => {\n connectResolve = resolve;\n connectReject = reject;\n this.ndkRelay.on(\"connect\", onConnectHandler);\n }),\n timeoutPromise\n ]).catch(onError).finally(onFinally);\n }\n async publishEvent(event) {\n return this.ndkRelay.connectivity.publish(event.rawEvent());\n }\n};\n\n// src/subscription/grouping.ts\nfunction filterFingerprint(filters, closeOnEose) {\n const elements = [];\n for (const filter of filters) {\n const keys = Object.entries(filter || {}).map(([key, values]) => {\n if ([\"since\", \"until\"].includes(key)) {\n return `${key}:${values}`;\n }\n return key;\n }).sort().join(\"-\");\n elements.push(keys);\n }\n let id = closeOnEose ? \"+\" : \"\";\n id += elements.join(\"|\");\n return id;\n}\nfunction mergeFilters(filters) {\n const result = [];\n const lastResult = {};\n filters.filter((f) => !!f.limit).forEach((filterWithLimit) => result.push(filterWithLimit));\n filters = filters.filter((f) => !f.limit);\n if (filters.length === 0) return result;\n filters.forEach((filter) => {\n Object.entries(filter).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n if (lastResult[key] === void 0) {\n lastResult[key] = [...value];\n } else {\n lastResult[key] = Array.from(/* @__PURE__ */ new Set([...lastResult[key], ...value]));\n }\n } else {\n lastResult[key] = value;\n }\n });\n });\n return [...result, lastResult];\n}\n\n// src/relay/subscription.ts\nvar NDKRelaySubscription = class {\n fingerprint;\n items = /* @__PURE__ */ new Map();\n topSubManager;\n debug;\n /**\n * Tracks the status of this REQ.\n */\n status = 0 /* INITIAL */;\n onClose;\n relay;\n /**\n * Whether this subscription has reached EOSE.\n */\n eosed = false;\n /**\n * Timeout at which this subscription will\n * start executing.\n */\n executionTimer;\n /**\n * Track the time at which this subscription will fire.\n */\n fireTime;\n /**\n * The delay type that the current fireTime was calculated with.\n */\n delayType;\n /**\n * The filters that have been executed.\n */\n executeFilters;\n id = Math.random().toString(36).substring(7);\n /**\n *\n * @param fingerprint The fingerprint of this subscription.\n */\n constructor(relay, fingerprint, topSubManager) {\n this.relay = relay;\n this.topSubManager = topSubManager;\n this.debug = relay.debug.extend(`sub[${this.id}]`);\n this.fingerprint = fingerprint || Math.random().toString(36).substring(7);\n }\n _subId;\n get subId() {\n if (this._subId) return this._subId;\n this._subId = this.fingerprint.slice(0, 15);\n return this._subId;\n }\n subIdParts = /* @__PURE__ */ new Set();\n addSubIdPart(part) {\n this.subIdParts.add(part);\n }\n addItem(subscription, filters) {\n this.debug(\"Adding item\", {\n filters,\n internalId: subscription.internalId,\n status: this.status,\n fingerprint: this.fingerprint,\n id: this.subId,\n items: this.items,\n itemsSize: this.items.size\n });\n if (this.items.has(subscription.internalId)) return;\n subscription.on(\"close\", this.removeItem.bind(this, subscription));\n this.items.set(subscription.internalId, { subscription, filters });\n if (this.status !== 3 /* RUNNING */) {\n if (subscription.subId && (!this._subId || this._subId.length < 48)) {\n if (this.status === 0 /* INITIAL */ || this.status === 1 /* PENDING */) {\n this.addSubIdPart(subscription.subId);\n }\n }\n }\n switch (this.status) {\n case 0 /* INITIAL */:\n this.evaluateExecutionPlan(subscription);\n break;\n case 3 /* RUNNING */:\n break;\n case 1 /* PENDING */:\n this.evaluateExecutionPlan(subscription);\n break;\n case 4 /* CLOSED */:\n this.debug(\"Subscription is closed, cannot add new items %o (%o)\", subscription, filters);\n throw new Error(\"Cannot add new items to a closed subscription\");\n }\n }\n /**\n * A subscription has been closed, remove it from the list of items.\n * @param subscription\n */\n removeItem(subscription) {\n this.items.delete(subscription.internalId);\n if (this.items.size === 0) {\n if (!this.eosed) return;\n this.close();\n this.cleanup();\n }\n }\n close() {\n if (this.status === 4 /* CLOSED */) return;\n const prevStatus = this.status;\n this.status = 4 /* CLOSED */;\n if (prevStatus === 3 /* RUNNING */) {\n try {\n this.relay.close(this.subId);\n } catch (e) {\n this.debug(\"Error closing subscription\", e, this);\n }\n } else {\n this.debug(\"Subscription wanted to close but it wasn't running, this is probably ok\", {\n subId: this.subId,\n prevStatus,\n sub: this\n });\n }\n this.cleanup();\n }\n cleanup() {\n if (this.executionTimer) clearTimeout(this.executionTimer);\n this.relay.off(\"ready\", this.executeOnRelayReady);\n this.relay.off(\"authed\", this.reExecuteAfterAuth);\n if (this.onClose) this.onClose(this);\n }\n evaluateExecutionPlan(subscription) {\n if (!subscription.isGroupable()) {\n this.status = 1 /* PENDING */;\n this.execute();\n return;\n }\n if (subscription.filters.find((filter) => !!filter.limit)) {\n this.executeFilters = this.compileFilters();\n if (this.executeFilters.length >= 10) {\n this.status = 1 /* PENDING */;\n this.execute();\n return;\n }\n }\n const delay = subscription.groupableDelay;\n const delayType = subscription.groupableDelayType;\n if (!delay) throw new Error(\"Cannot group a subscription without a delay\");\n if (this.status === 0 /* INITIAL */) {\n this.schedule(delay, delayType);\n } else {\n const existingDelayType = this.delayType;\n const timeUntilFire = this.fireTime - Date.now();\n if (existingDelayType === \"at-least\" && delayType === \"at-least\") {\n if (timeUntilFire < delay) {\n if (this.executionTimer) clearTimeout(this.executionTimer);\n this.schedule(delay, delayType);\n }\n } else if (existingDelayType === \"at-least\" && delayType === \"at-most\") {\n if (timeUntilFire > delay) {\n if (this.executionTimer) clearTimeout(this.executionTimer);\n this.schedule(delay, delayType);\n }\n } else if (existingDelayType === \"at-most\" && delayType === \"at-most\") {\n if (timeUntilFire > delay) {\n if (this.executionTimer) clearTimeout(this.executionTimer);\n this.schedule(delay, delayType);\n }\n } else if (existingDelayType === \"at-most\" && delayType === \"at-least\") {\n if (timeUntilFire > delay) {\n if (this.executionTimer) clearTimeout(this.executionTimer);\n this.schedule(delay, delayType);\n }\n } else {\n throw new Error(`Unknown delay type combination ${existingDelayType} ${delayType}`);\n }\n }\n }\n schedule(delay, delayType) {\n this.status = 1 /* PENDING */;\n const currentTime = Date.now();\n this.fireTime = currentTime + delay;\n this.delayType = delayType;\n const timer = setTimeout(this.execute.bind(this), delay);\n if (delayType === \"at-least\") {\n this.executionTimer = timer;\n }\n }\n executeOnRelayReady = () => {\n if (this.status !== 2 /* WAITING */) return;\n if (this.items.size === 0) {\n this.debug(\"No items to execute; this relay was probably too slow to respond and the caller gave up\", {\n status: this.status,\n fingerprint: this.fingerprint,\n items: this.items,\n itemsSize: this.items.size,\n id: this.id,\n subId: this.subId\n });\n this.cleanup();\n return;\n }\n this.debug(\"Executing on relay ready\", {\n status: this.status,\n fingerprint: this.fingerprint,\n items: this.items,\n itemsSize: this.items.size\n });\n this.status = 1 /* PENDING */;\n this.execute();\n };\n finalizeSubId() {\n if (this.subIdParts.size > 0) {\n this._subId = Array.from(this.subIdParts).join(\"-\");\n } else {\n this._subId = this.fingerprint.slice(0, 15);\n }\n this._subId += `-${Math.random().toString(36).substring(2, 7)}`;\n }\n // we do it this way so that we can remove the listener\n reExecuteAfterAuth = (() => {\n const oldSubId = this.subId;\n this.debug(\"Re-executing after auth\", this.items.size);\n if (this.eosed) {\n this.relay.close(this.subId);\n } else {\n this.debug(\"We are abandoning an opened subscription, once it EOSE's, the handler will close it\", {\n oldSubId\n });\n }\n this._subId = void 0;\n this.status = 1 /* PENDING */;\n this.execute();\n this.debug(\"Re-executed after auth %s \\u{1F449} %s\", oldSubId, this.subId);\n }).bind(this);\n execute() {\n if (this.status !== 1 /* PENDING */) {\n return;\n }\n if (!this.relay.connected) {\n this.status = 2 /* WAITING */;\n this.debug(\"Waiting for relay to be ready\", {\n status: this.status,\n id: this.subId,\n fingerprint: this.fingerprint,\n items: this.items,\n itemsSize: this.items.size\n });\n this.relay.once(\"ready\", this.executeOnRelayReady);\n return;\n }\n if (this.relay.status < 8 /* AUTHENTICATED */) {\n this.relay.once(\"authed\", this.reExecuteAfterAuth);\n }\n this.status = 3 /* RUNNING */;\n this.finalizeSubId();\n this.executeFilters = this.compileFilters();\n this.relay.req(this);\n }\n onstart() {\n }\n onevent(event) {\n this.topSubManager.dispatchEvent(event, this.relay);\n }\n oneose(subId) {\n this.eosed = true;\n if (subId !== this.subId) {\n this.debug(\"Received EOSE for an abandoned subscription\", subId, this.subId);\n this.relay.close(subId);\n return;\n }\n if (this.items.size === 0) {\n this.close();\n }\n for (const { subscription } of this.items.values()) {\n subscription.eoseReceived(this.relay);\n if (subscription.closeOnEose) {\n this.debug(\"Removing item because of EOSE\", {\n filters: subscription.filters,\n internalId: subscription.internalId,\n status: this.status,\n fingerprint: this.fingerprint,\n items: this.items,\n itemsSize: this.items.size\n });\n this.removeItem(subscription);\n }\n }\n }\n onclose(_reason) {\n this.status = 4 /* CLOSED */;\n }\n onclosed(reason) {\n if (!reason) return;\n for (const { subscription } of this.items.values()) {\n subscription.closedReceived(this.relay, reason);\n }\n }\n /**\n * Grabs the filters from all the subscriptions\n * and merges them into a single filter.\n */\n compileFilters() {\n const mergedFilters = [];\n const filters = Array.from(this.items.values()).map((item) => item.filters);\n if (!filters[0]) {\n this.debug(\"\\u{1F440} No filters to merge\", this.items);\n console.error(\"BUG: No filters to merge!\", this.items);\n return [];\n }\n const filterCount = filters[0].length;\n for (let i = 0; i < filterCount; i++) {\n const allFiltersAtIndex = filters.map((filter) => filter[i]);\n mergedFilters.push(...mergeFilters(allFiltersAtIndex));\n }\n return mergedFilters;\n }\n};\n\n// src/relay/sub-manager.ts\nvar NDKRelaySubscriptionManager = class {\n relay;\n subscriptions;\n generalSubManager;\n /**\n * @param relay - The relay instance.\n * @param generalSubManager - The subscription manager instance.\n */\n constructor(relay, generalSubManager) {\n this.relay = relay;\n this.subscriptions = /* @__PURE__ */ new Map();\n this.generalSubManager = generalSubManager;\n }\n /**\n * Adds a subscription to the manager.\n */\n addSubscription(sub, filters) {\n let relaySub;\n if (!sub.isGroupable()) {\n relaySub = this.createSubscription(sub, filters);\n } else {\n const filterFp = filterFingerprint(filters, sub.closeOnEose);\n if (filterFp) {\n const existingSubs = this.subscriptions.get(filterFp);\n relaySub = (existingSubs || []).find((sub2) => sub2.status < 3 /* RUNNING */);\n }\n relaySub ??= this.createSubscription(sub, filters, filterFp);\n }\n relaySub.addItem(sub, filters);\n }\n createSubscription(_sub, _filters, fingerprint) {\n const relaySub = new NDKRelaySubscription(this.relay, fingerprint || null, this.generalSubManager);\n relaySub.onClose = this.onRelaySubscriptionClose.bind(this);\n const currentVal = this.subscriptions.get(relaySub.fingerprint) ?? [];\n this.subscriptions.set(relaySub.fingerprint, [...currentVal, relaySub]);\n return relaySub;\n }\n onRelaySubscriptionClose(sub) {\n let currentVal = this.subscriptions.get(sub.fingerprint) ?? [];\n if (!currentVal) {\n console.warn(\"Unexpectedly did not find a subscription with fingerprint\", sub.fingerprint);\n } else if (currentVal.length === 1) {\n this.subscriptions.delete(sub.fingerprint);\n } else {\n currentVal = currentVal.filter((s) => s.id !== sub.id);\n this.subscriptions.set(sub.fingerprint, currentVal);\n }\n }\n};\n\n// src/relay/signature-verification-stats.ts\nimport debug from \"debug\";\nvar SignatureVerificationStats = class {\n ndk;\n debug;\n intervalId = null;\n intervalMs;\n /**\n * Creates a new SignatureVerificationStats instance\n *\n * @param ndk - The NDK instance to track stats for\n * @param intervalMs - How often to print stats (in milliseconds)\n */\n constructor(ndk, intervalMs = 1e4) {\n this.ndk = ndk;\n this.debug = debug(\"ndk:signature-verification-stats\");\n this.intervalMs = intervalMs;\n }\n /**\n * Start tracking and reporting signature verification statistics\n */\n start() {\n if (this.intervalId) {\n this.debug(\"Stats tracking already started\");\n return;\n }\n this.debug(`Starting signature verification stats reporting every ${this.intervalMs}ms`);\n this.intervalId = setInterval(() => {\n this.reportStats();\n }, this.intervalMs);\n }\n /**\n * Stop tracking and reporting signature verification statistics\n */\n stop() {\n if (!this.intervalId) {\n this.debug(\"Stats tracking not started\");\n return;\n }\n clearInterval(this.intervalId);\n this.intervalId = null;\n this.debug(\"Stopped signature verification stats reporting\");\n }\n /**\n * Report current signature verification statistics for all relays\n */\n reportStats() {\n const stats = this.collectStats();\n console.log(\"\\n=== Signature Verification Sampling Stats ===\");\n console.log(`Timestamp: ${(/* @__PURE__ */ new Date()).toISOString()}`);\n console.log(`Total Relays: ${stats.totalRelays}`);\n console.log(`Connected Relays: ${stats.connectedRelays}`);\n if (stats.relayStats.length === 0) {\n console.log(\"No relay statistics available\");\n } else {\n console.log(\"\\nRelay Statistics:\");\n stats.relayStats.sort((a, b) => a.url.localeCompare(b.url));\n stats.relayStats.forEach((relayStat) => {\n console.log(`\n ${relayStat.url} ${relayStat.connected ? \"(connected)\" : \"(disconnected)\"}`);\n console.log(` Validated Events: ${relayStat.validatedCount}`);\n console.log(` Non-validated Events: ${relayStat.nonValidatedCount}`);\n console.log(` Total Events: ${relayStat.totalEvents}`);\n console.log(\n ` Current Validation Ratio: ${relayStat.validationRatio.toFixed(4)} (${(relayStat.validationRatio * 100).toFixed(2)}%)`\n );\n console.log(\n ` Target Validation Ratio: ${relayStat.targetValidationRatio?.toFixed(4) || \"N/A\"} (${relayStat.targetValidationRatio ? (relayStat.targetValidationRatio * 100).toFixed(2) + \"%\" : \"N/A\"})`\n );\n console.log(` Trusted: ${relayStat.trusted ? \"Yes\" : \"No\"}`);\n });\n }\n console.log(\"\\nGlobal Settings:\");\n console.log(\n ` Initial Validation Ratio: ${stats.initialValidationRatio.toFixed(4)} (${(stats.initialValidationRatio * 100).toFixed(2)}%)`\n );\n console.log(\n ` Lowest Validation Ratio: ${stats.lowestValidationRatio.toFixed(4)} (${(stats.lowestValidationRatio * 100).toFixed(2)}%)`\n );\n console.log(` Auto-blacklist Invalid Relays: ${stats.autoBlacklistInvalidRelays ? \"Yes\" : \"No\"}`);\n console.log(` Blacklisted Relays: ${stats.blacklistedRelayCount}`);\n console.log(\"===========================================\\n\");\n }\n /**\n * Collect statistics from all relays\n */\n collectStats() {\n const relayStats = [];\n for (const relay of this.ndk.pool.relays.values()) {\n relayStats.push({\n url: relay.url,\n connected: relay.connected,\n validatedCount: relay.validatedEventCount,\n nonValidatedCount: relay.nonValidatedEventCount,\n totalEvents: relay.validatedEventCount + relay.nonValidatedEventCount,\n validationRatio: relay.validationRatio,\n targetValidationRatio: relay.targetValidationRatio,\n trusted: relay.trusted\n });\n }\n return {\n totalRelays: this.ndk.pool.relays.size,\n connectedRelays: this.ndk.pool.connectedRelays().length,\n relayStats,\n initialValidationRatio: this.ndk.initialValidationRatio,\n lowestValidationRatio: this.ndk.lowestValidationRatio,\n autoBlacklistInvalidRelays: this.ndk.autoBlacklistInvalidRelays,\n blacklistedRelayCount: this.ndk.blacklistRelayUrls?.length || 0\n };\n }\n};\nfunction startSignatureVerificationStats(ndk, intervalMs = 1e4) {\n const stats = new SignatureVerificationStats(ndk, intervalMs);\n stats.start();\n return stats;\n}\n\n// src/relay/index.ts\nvar NDKRelayStatus = /* @__PURE__ */ ((NDKRelayStatus2) => {\n NDKRelayStatus2[NDKRelayStatus2[\"DISCONNECTING\"] = 0] = \"DISCONNECTING\";\n NDKRelayStatus2[NDKRelayStatus2[\"DISCONNECTED\"] = 1] = \"DISCONNECTED\";\n NDKRelayStatus2[NDKRelayStatus2[\"RECONNECTING\"] = 2] = \"RECONNECTING\";\n NDKRelayStatus2[NDKRelayStatus2[\"FLAPPING\"] = 3] = \"FLAPPING\";\n NDKRelayStatus2[NDKRelayStatus2[\"CONNECTING\"] = 4] = \"CONNECTING\";\n NDKRelayStatus2[NDKRelayStatus2[\"CONNECTED\"] = 5] = \"CONNECTED\";\n NDKRelayStatus2[NDKRelayStatus2[\"AUTH_REQUESTED\"] = 6] = \"AUTH_REQUESTED\";\n NDKRelayStatus2[NDKRelayStatus2[\"AUTHENTICATING\"] = 7] = \"AUTHENTICATING\";\n NDKRelayStatus2[NDKRelayStatus2[\"AUTHENTICATED\"] = 8] = \"AUTHENTICATED\";\n return NDKRelayStatus2;\n})(NDKRelayStatus || {});\nvar NDKRelay = class _NDKRelay extends EventEmitter {\n url;\n scores;\n connectivity;\n subs;\n publisher;\n authPolicy;\n /**\n * The lowest validation ratio this relay can reach.\n */\n lowestValidationRatio;\n /**\n * Current validation ratio this relay is targeting.\n */\n targetValidationRatio;\n validationRatioFn;\n /**\n * This tracks events that have been seen by this relay\n * with a valid signature.\n */\n validatedEventCount = 0;\n /**\n * This tracks events that have been seen by this relay\n * but have not been validated.\n */\n nonValidatedEventCount = 0;\n /**\n * Whether this relay is trusted.\n *\n * Trusted relay's events do not get their signature verified.\n */\n trusted = false;\n complaining = false;\n debug;\n static defaultValidationRatioUpdateFn = (relay, validatedCount, _nonValidatedCount) => {\n if (relay.lowestValidationRatio === void 0 || relay.targetValidationRatio === void 0) return 1;\n let newRatio = relay.validationRatio;\n if (relay.validationRatio > relay.targetValidationRatio) {\n const factor = validatedCount / 100;\n newRatio = Math.max(relay.lowestValidationRatio, relay.validationRatio - factor);\n }\n if (newRatio < relay.validationRatio) {\n return newRatio;\n }\n return relay.validationRatio;\n };\n constructor(url, authPolicy, ndk) {\n super();\n this.url = normalizeRelayUrl(url);\n this.scores = /* @__PURE__ */ new Map();\n this.debug = debug2(`ndk:relay:${url}`);\n this.connectivity = new NDKRelayConnectivity(this, ndk);\n this.connectivity.netDebug = ndk?.netDebug;\n this.req = this.connectivity.req.bind(this.connectivity);\n this.close = this.connectivity.close.bind(this.connectivity);\n this.subs = new NDKRelaySubscriptionManager(this, ndk.subManager);\n this.publisher = new NDKRelayPublisher(this);\n this.authPolicy = authPolicy;\n this.targetValidationRatio = ndk?.initialValidationRatio;\n this.lowestValidationRatio = ndk?.lowestValidationRatio;\n this.validationRatioFn = (ndk?.validationRatioFn ?? _NDKRelay.defaultValidationRatioUpdateFn).bind(this);\n this.updateValidationRatio();\n if (!ndk) {\n console.trace(\"relay created without ndk\");\n }\n }\n updateValidationRatio() {\n if (this.validationRatioFn && this.validatedEventCount > 0) {\n const newRatio = this.validationRatioFn(this, this.validatedEventCount, this.nonValidatedEventCount);\n this.targetValidationRatio = newRatio;\n }\n setTimeout(() => {\n this.updateValidationRatio();\n }, 3e4);\n }\n get status() {\n return this.connectivity.status;\n }\n get connectionStats() {\n return this.connectivity.connectionStats;\n }\n /**\n * Connects to the relay.\n */\n async connect(timeoutMs, reconnect = true) {\n return this.connectivity.connect(timeoutMs, reconnect);\n }\n /**\n * Disconnects from the relay.\n */\n disconnect() {\n if (this.status === 1 /* DISCONNECTED */) {\n return;\n }\n this.connectivity.disconnect();\n }\n /**\n * Queues or executes the subscription of a specific set of filters\n * within this relay.\n *\n * @param subscription NDKSubscription this filters belong to.\n * @param filters Filters to execute\n */\n subscribe(subscription, filters) {\n this.subs.addSubscription(subscription, filters);\n }\n /**\n * Publishes an event to the relay with an optional timeout.\n *\n * If the relay is not connected, the event will be published when the relay connects,\n * unless the timeout is reached before the relay connects.\n *\n * @param event The event to publish\n * @param timeoutMs The timeout for the publish operation in milliseconds\n * @returns A promise that resolves when the event has been published or rejects if the operation times out\n */\n async publish(event, timeoutMs = 2500) {\n return this.publisher.publish(event, timeoutMs);\n }\n referenceTags() {\n return [[\"r\", this.url]];\n }\n addValidatedEvent() {\n this.validatedEventCount++;\n }\n addNonValidatedEvent() {\n this.nonValidatedEventCount++;\n }\n /**\n * The current validation ratio this relay has achieved.\n */\n get validationRatio() {\n if (this.nonValidatedEventCount === 0) {\n return 1;\n }\n return this.validatedEventCount / (this.validatedEventCount + this.nonValidatedEventCount);\n }\n shouldValidateEvent() {\n if (this.trusted) {\n return false;\n }\n if (this.targetValidationRatio === void 0) {\n return true;\n }\n if (this.targetValidationRatio >= 1) return true;\n return Math.random() < this.targetValidationRatio;\n }\n get connected() {\n return this.connectivity.connected;\n }\n req;\n close;\n};\n\n// src/relay/sets/index.ts\nvar NDKPublishError = class extends Error {\n errors;\n publishedToRelays;\n /**\n * Intended relay set where the publishing was intended to happen.\n */\n intendedRelaySet;\n constructor(message, errors, publishedToRelays, intendedRelaySet) {\n super(message);\n this.errors = errors;\n this.publishedToRelays = publishedToRelays;\n this.intendedRelaySet = intendedRelaySet;\n }\n get relayErrors() {\n const errors = [];\n for (const [relay, err] of this.errors) {\n errors.push(`${relay.url}: ${err}`);\n }\n return errors.join(\"\\n\");\n }\n};\nvar NDKRelaySet = class _NDKRelaySet {\n relays;\n debug;\n ndk;\n pool;\n constructor(relays, ndk, pool) {\n this.relays = relays;\n this.ndk = ndk;\n this.pool = pool ?? ndk.pool;\n this.debug = ndk.debug.extend(\"relayset\");\n }\n /**\n * Adds a relay to this set.\n */\n addRelay(relay) {\n this.relays.add(relay);\n }\n get relayUrls() {\n return Array.from(this.relays).map((r) => r.url);\n }\n /**\n * Creates a relay set from a list of relay URLs.\n *\n * If no connection to the relay is found in the pool it will temporarily\n * connect to it.\n *\n * @param relayUrls - list of relay URLs to include in this set\n * @param ndk\n * @param connect - whether to connect to the relay immediately if it was already in the pool but not connected\n * @returns NDKRelaySet\n */\n static fromRelayUrls(relayUrls, ndk, connect = true, pool) {\n pool = pool ?? ndk.pool;\n if (!pool) throw new Error(\"No pool provided\");\n const relays = /* @__PURE__ */ new Set();\n for (const url of relayUrls) {\n const relay = pool.relays.get(normalizeRelayUrl(url));\n if (relay) {\n if (relay.status < 5 /* CONNECTED */ && connect) {\n relay.connect();\n }\n relays.add(relay);\n } else {\n const temporaryRelay = new NDKRelay(normalizeRelayUrl(url), ndk?.relayAuthDefaultPolicy, ndk);\n pool.useTemporaryRelay(temporaryRelay, void 0, `requested from fromRelayUrls ${relayUrls}`);\n relays.add(temporaryRelay);\n }\n }\n return new _NDKRelaySet(new Set(relays), ndk, pool);\n }\n /**\n * Publish an event to all relays in this relay set.\n *\n * This method implements a robust mechanism for publishing events to multiple relays with\n * built-in handling for race conditions, timeouts, and partial failures. The implementation\n * uses a dual-tracking mechanism to ensure accurate reporting of which relays successfully\n * received an event.\n *\n * Key aspects of this implementation:\n *\n * 1. DUAL-TRACKING MECHANISM:\n * - Promise-based tracking: Records successes/failures from the promises returned by relay.publish()\n * - Event-based tracking: Listens for 'relay:published' events that indicate successful publishing\n * This approach ensures we don't miss successful publishes even if there are subsequent errors in\n * the promise chain.\n *\n * 2. RACE CONDITION HANDLING:\n * - If a relay emits a success event but later fails in the promise chain, we still count it as a success\n * - If a relay times out after successfully publishing, we still count it as a success\n * - All relay operations happen in parallel, with proper tracking regardless of completion order\n *\n * 3. TIMEOUT MANAGEMENT:\n * - Individual timeouts for each relay operation\n * - Proper cleanup of timeouts to prevent memory leaks\n * - Clear timeout error reporting\n *\n * 4. ERROR HANDLING:\n * - Detailed tracking of specific errors for each failed relay\n * - Special handling for ephemeral events (which don't expect acknowledgement)\n * - RequiredRelayCount parameter to control the minimum success threshold\n *\n * @param event Event to publish\n * @param timeoutMs Timeout in milliseconds for each relay publish operation\n * @param requiredRelayCount The minimum number of relays we expect the event to be published to\n * @returns A set of relays the event was published to\n * @throws {NDKPublishError} If the event could not be published to at least `requiredRelayCount` relays\n * @example\n * ```typescript\n * const relaySet = new NDKRelaySet(new Set([relay1, relay2]), ndk);\n * const publishedToRelays = await relaySet.publish(event);\n * // publishedToRelays can contain relay1, relay2, both, or none\n * // depending on which relays the event was successfully published to\n * if (publishedToRelays.size > 0) {\n * console.log(\"Event published to at least one relay\");\n * }\n * ```\n */\n async publish(event, timeoutMs, requiredRelayCount = 1) {\n const publishedToRelays = /* @__PURE__ */ new Set();\n const errors = /* @__PURE__ */ new Map();\n const isEphemeral2 = event.isEphemeral();\n event.publishStatus = \"pending\";\n const relayPublishedHandler = (relay) => {\n publishedToRelays.add(relay);\n };\n event.on(\"relay:published\", relayPublishedHandler);\n try {\n const promises = Array.from(this.relays).map((relay) => {\n return new Promise((resolve) => {\n const timeoutId = timeoutMs ? setTimeout(() => {\n if (!publishedToRelays.has(relay)) {\n errors.set(relay, new Error(`Publish timeout after ${timeoutMs}ms`));\n resolve(false);\n }\n }, timeoutMs) : null;\n relay.publish(event, timeoutMs).then((success) => {\n if (timeoutId) clearTimeout(timeoutId);\n if (success) {\n publishedToRelays.add(relay);\n resolve(true);\n } else {\n resolve(false);\n }\n }).catch((err) => {\n if (timeoutId) clearTimeout(timeoutId);\n if (!isEphemeral2) {\n errors.set(relay, err);\n }\n resolve(false);\n });\n });\n });\n await Promise.all(promises);\n if (publishedToRelays.size < requiredRelayCount) {\n if (!isEphemeral2) {\n const error = new NDKPublishError(\n \"Not enough relays received the event (\" + publishedToRelays.size + \" published, \" + requiredRelayCount + \" required)\",\n errors,\n publishedToRelays,\n this\n );\n event.publishStatus = \"error\";\n event.publishError = error;\n this.ndk?.emit(\"event:publish-failed\", event, error, this.relayUrls);\n throw error;\n }\n } else {\n event.publishStatus = \"success\";\n event.emit(\"published\", { relaySet: this, publishedToRelays });\n }\n return publishedToRelays;\n } finally {\n event.off(\"relay:published\", relayPublishedHandler);\n }\n }\n get size() {\n return this.relays.size;\n }\n};\n\n// src/relay/sets/calculate.ts\nvar d = createDebug(\"ndk:outbox:calculate\");\nasync function calculateRelaySetFromEvent(ndk, event, requiredRelayCount) {\n const relays = /* @__PURE__ */ new Set();\n const authorWriteRelays = await getWriteRelaysFor(ndk, event.pubkey);\n if (authorWriteRelays) {\n authorWriteRelays.forEach((relayUrl) => {\n const relay = ndk.pool?.getRelay(relayUrl);\n if (relay) relays.add(relay);\n });\n }\n let relayHints = event.tags.filter((tag) => [\"a\", \"e\"].includes(tag[0])).map((tag) => tag[2]).filter((url) => url?.startsWith(\"wss://\")).filter((url) => {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n }).map((url) => normalizeRelayUrl(url));\n relayHints = Array.from(new Set(relayHints)).slice(0, 5);\n relayHints.forEach((relayUrl) => {\n const relay = ndk.pool?.getRelay(relayUrl, true, true);\n if (relay) {\n d(\"Adding relay hint %s\", relayUrl);\n relays.add(relay);\n }\n });\n const pTags = event.getMatchingTags(\"p\").map((tag) => tag[1]);\n if (pTags.length < 5) {\n const pTaggedRelays = Array.from(\n chooseRelayCombinationForPubkeys(ndk, pTags, \"read\", {\n preferredRelays: new Set(authorWriteRelays)\n }).keys()\n );\n pTaggedRelays.forEach((relayUrl) => {\n const relay = ndk.pool?.getRelay(relayUrl, false, true);\n if (relay) {\n d(\"Adding p-tagged relay %s\", relayUrl);\n relays.add(relay);\n }\n });\n } else {\n d(\"Too many p-tags to consider %d\", pTags.length);\n }\n ndk.pool?.permanentAndConnectedRelays().forEach((relay) => relays.add(relay));\n if (requiredRelayCount && relays.size < requiredRelayCount) {\n const explicitRelays = ndk.explicitRelayUrls?.filter((url) => !Array.from(relays).some((r) => r.url === url)).slice(0, requiredRelayCount - relays.size);\n explicitRelays?.forEach((url) => {\n const relay = ndk.pool?.getRelay(url, false, true);\n if (relay) {\n d(\"Adding explicit relay %s\", url);\n relays.add(relay);\n }\n });\n }\n return new NDKRelaySet(relays, ndk);\n}\nfunction calculateRelaySetsFromFilter(ndk, filters, pool) {\n const result = /* @__PURE__ */ new Map();\n const authors = /* @__PURE__ */ new Set();\n filters.forEach((filter) => {\n if (filter.authors) {\n filter.authors.forEach((author) => authors.add(author));\n }\n });\n if (authors.size > 0) {\n const authorToRelaysMap = getRelaysForFilterWithAuthors(ndk, Array.from(authors));\n for (const relayUrl of authorToRelaysMap.keys()) {\n result.set(relayUrl, []);\n }\n for (const filter of filters) {\n if (filter.authors) {\n for (const [relayUrl, authors2] of authorToRelaysMap.entries()) {\n const authorFilterAndRelayPubkeyIntersection = filter.authors.filter(\n (author) => authors2.includes(author)\n );\n result.set(relayUrl, [\n ...result.get(relayUrl),\n {\n ...filter,\n // Overwrite authors sent to this relay with the authors that were\n // present in the filter and are also present in the relay\n authors: authorFilterAndRelayPubkeyIntersection\n }\n ]);\n }\n } else {\n for (const relayUrl of authorToRelaysMap.keys()) {\n result.set(relayUrl, [...result.get(relayUrl), filter]);\n }\n }\n }\n } else {\n if (ndk.explicitRelayUrls) {\n ndk.explicitRelayUrls.forEach((relayUrl) => {\n result.set(relayUrl, filters);\n });\n }\n }\n if (result.size === 0) {\n pool.permanentAndConnectedRelays().slice(0, 5).forEach((relay) => {\n result.set(relay.url, filters);\n });\n }\n return result;\n}\nfunction calculateRelaySetsFromFilters(ndk, filters, pool) {\n const a = calculateRelaySetsFromFilter(ndk, filters, pool);\n return a;\n}\n\n// src/events/content-tagger.ts\nimport { nip19 } from \"nostr-tools\";\nfunction mergeTags(tags1, tags2) {\n const tagMap = /* @__PURE__ */ new Map();\n const generateKey = (tag) => tag.join(\",\");\n const isContained = (smaller, larger) => {\n return smaller.every((value, index) => value === larger[index]);\n };\n const processTag = (tag) => {\n for (const [key, existingTag] of tagMap) {\n if (isContained(existingTag, tag) || isContained(tag, existingTag)) {\n if (tag.length >= existingTag.length) {\n tagMap.set(key, tag);\n }\n return;\n }\n }\n tagMap.set(generateKey(tag), tag);\n };\n tags1.concat(tags2).forEach(processTag);\n return Array.from(tagMap.values());\n}\nfunction uniqueTag(a, b) {\n const aLength = a.length;\n const bLength = b.length;\n const sameLength = aLength === bLength;\n if (sameLength) {\n if (a.every((v, i) => v === b[i])) {\n return [a];\n }\n return [a, b];\n }\n if (aLength > bLength && a.every((v, i) => v === b[i])) {\n return [a];\n }\n if (bLength > aLength && b.every((v, i) => v === a[i])) {\n return [b];\n }\n return [a, b];\n}\nvar hashtagRegex = /(?<=\\s|^)(#[^\\s!@#$%^&*()=+./,[{\\]};:'\"?><]+)/g;\nfunction generateHashtags(content) {\n const hashtags = content.match(hashtagRegex);\n const tagIds = /* @__PURE__ */ new Set();\n const tag = /* @__PURE__ */ new Set();\n if (hashtags) {\n for (const hashtag of hashtags) {\n if (tagIds.has(hashtag.slice(1))) continue;\n tag.add(hashtag.slice(1));\n tagIds.add(hashtag.slice(1));\n }\n }\n return Array.from(tag);\n}\nasync function generateContentTags(content, tags = [], opts, ctx) {\n if (opts?.skipContentTagging) {\n return { content, tags };\n }\n const tagRegex = /(@|nostr:)(npub|nprofile|note|nevent|naddr)[a-zA-Z0-9]+/g;\n const promises = [];\n const addTagIfNew = (t) => {\n if (!tags.find((t2) => [\"q\", t[0]].includes(t2[0]) && t2[1] === t[1])) {\n tags.push(t);\n }\n };\n content = content.replace(tagRegex, (tag) => {\n try {\n const entity = tag.split(/(@|nostr:)/)[2];\n const { type, data } = nip19.decode(entity);\n let t;\n if (opts?.filters) {\n const shouldInclude = !opts.filters.includeTypes || opts.filters.includeTypes.includes(type);\n const shouldExclude = opts.filters.excludeTypes?.includes(type);\n if (!shouldInclude || shouldExclude) {\n return tag;\n }\n }\n switch (type) {\n case \"npub\":\n if (opts?.pTags !== false) {\n t = [\"p\", data];\n }\n break;\n case \"nprofile\":\n if (opts?.pTags !== false) {\n t = [\"p\", data.pubkey];\n }\n break;\n case \"note\":\n promises.push(\n new Promise(async (resolve) => {\n const relay = await maybeGetEventRelayUrl(entity);\n addTagIfNew([\"q\", data, relay]);\n resolve();\n })\n );\n break;\n case \"nevent\":\n promises.push(\n new Promise(async (resolve) => {\n const { id, author } = data;\n let { relays } = data;\n if (!relays || relays.length === 0) {\n relays = [await maybeGetEventRelayUrl(entity)];\n }\n addTagIfNew([\"q\", id, relays[0]]);\n if (author && opts?.pTags !== false && opts?.pTagOnQTags !== false)\n addTagIfNew([\"p\", author]);\n resolve();\n })\n );\n break;\n case \"naddr\":\n promises.push(\n new Promise(async (resolve) => {\n const id = [data.kind, data.pubkey, data.identifier].join(\":\");\n let relays = data.relays ?? [];\n if (relays.length === 0) {\n relays = [await maybeGetEventRelayUrl(entity)];\n }\n addTagIfNew([\"q\", id, relays[0]]);\n if (opts?.pTags !== false && opts?.pTagOnQTags !== false && opts?.pTagOnATags !== false)\n addTagIfNew([\"p\", data.pubkey]);\n resolve();\n })\n );\n break;\n default:\n return tag;\n }\n if (t) addTagIfNew(t);\n return `nostr:${entity}`;\n } catch (_error) {\n return tag;\n }\n });\n await Promise.all(promises);\n if (!opts?.filters?.excludeTypes?.includes(\"hashtag\")) {\n const newTags = generateHashtags(content).map((hashtag) => [\"t\", hashtag]);\n tags = mergeTags(tags, newTags);\n }\n if (opts?.pTags !== false && opts?.copyPTagsFromTarget && ctx) {\n const pTags = ctx.getMatchingTags(\"p\");\n for (const pTag of pTags) {\n if (!tags.find((t) => t[0] === \"p\" && t[1] === pTag[1])) {\n tags.push(pTag);\n }\n }\n }\n return { content, tags };\n}\nasync function maybeGetEventRelayUrl(_nip19Id) {\n return \"\";\n}\n\n// src/events/encryption.ts\nasync function encrypt(recipient, signer, scheme = \"nip44\") {\n let encrypted;\n if (!this.ndk) throw new Error(\"No NDK instance found!\");\n let currentSigner = signer;\n if (!currentSigner) {\n this.ndk.assertSigner();\n currentSigner = this.ndk.signer;\n }\n if (!currentSigner) throw new Error(\"no NDK signer\");\n const currentRecipient = recipient || (() => {\n const pTags = this.getMatchingTags(\"p\");\n if (pTags.length !== 1) {\n throw new Error(\"No recipient could be determined and no explicit recipient was provided\");\n }\n return this.ndk.getUser({ pubkey: pTags[0][1] });\n })();\n if (scheme === \"nip44\" && await isEncryptionEnabled(currentSigner, \"nip44\")) {\n encrypted = await currentSigner.encrypt(currentRecipient, this.content, \"nip44\");\n }\n if ((!encrypted || scheme === \"nip04\") && await isEncryptionEnabled(currentSigner, \"nip04\")) {\n encrypted = await currentSigner.encrypt(currentRecipient, this.content, \"nip04\");\n }\n if (!encrypted) throw new Error(\"Failed to encrypt event.\");\n this.content = encrypted;\n}\nasync function decrypt(sender, signer, scheme) {\n if (this.ndk?.cacheAdapter?.getDecryptedEvent) {\n let cachedEvent = null;\n if (typeof this.ndk.cacheAdapter.getDecryptedEvent === \"function\") {\n cachedEvent = this.ndk.cacheAdapter.getDecryptedEvent(this.id);\n }\n if (cachedEvent) {\n this.content = cachedEvent.content;\n return;\n }\n }\n let decrypted;\n if (!this.ndk) throw new Error(\"No NDK instance found!\");\n let currentSigner = signer;\n if (!currentSigner) {\n this.ndk.assertSigner();\n currentSigner = this.ndk.signer;\n }\n if (!currentSigner) throw new Error(\"no NDK signer\");\n const currentSender = sender || this.author;\n if (!currentSender) throw new Error(\"No sender provided and no author available\");\n const currentScheme = scheme || (this.content.match(/\\\\?iv=/) ? \"nip04\" : \"nip44\");\n if ((currentScheme === \"nip04\" || this.kind === 4) && await isEncryptionEnabled(currentSigner, \"nip04\") && this.content.search(\"\\\\?iv=\")) {\n decrypted = await currentSigner.decrypt(currentSender, this.content, \"nip04\");\n }\n if (!decrypted && currentScheme === \"nip44\" && await isEncryptionEnabled(currentSigner, \"nip44\")) {\n decrypted = await currentSigner.decrypt(currentSender, this.content, \"nip44\");\n }\n if (!decrypted) throw new Error(\"Failed to decrypt event.\");\n this.content = decrypted;\n if (this.ndk?.cacheAdapter?.addDecryptedEvent) {\n this.ndk.cacheAdapter.addDecryptedEvent(this);\n }\n}\nasync function isEncryptionEnabled(signer, scheme) {\n if (!signer.encryptionEnabled) return false;\n if (!scheme) return true;\n return Boolean(await signer.encryptionEnabled(scheme));\n}\n\n// src/thread/index.ts\nfunction eventsBySameAuthor(op, events) {\n const eventsByAuthor = /* @__PURE__ */ new Map();\n eventsByAuthor.set(op.id, op);\n events.forEach((event) => {\n if (event.pubkey === op.pubkey) {\n eventsByAuthor.set(event.id, event);\n }\n });\n return eventsByAuthor;\n}\nvar hasMarkers = (event, tagType) => {\n return event.getMatchingTags(tagType).some((tag) => tag[3] && tag[3] !== \"\");\n};\nfunction eventIsReply(op, event, threadIds = /* @__PURE__ */ new Set(), tagType) {\n tagType ??= op.tagType();\n const tags = event.getMatchingTags(tagType);\n threadIds.add(op.tagId());\n if (threadIds.has(event.tagId())) return false;\n const heedExplicitReplyMarker = () => {\n let eventIsTagged = false;\n for (const tag of tags) {\n if (tag[3] === \"reply\") return threadIds.has(tag[1]);\n const markerIsEmpty = tag[3] === \"\" || tag[3] === void 0;\n const markerIsRoot = tag[3] === \"root\";\n if (tag[1] === op.tagId() && (markerIsEmpty || markerIsRoot)) {\n eventIsTagged = markerIsRoot ? \"root\" : true;\n }\n }\n if (!eventIsTagged) return false;\n if (eventIsTagged === \"root\") return true;\n };\n const explicitReplyMarker = heedExplicitReplyMarker();\n if (explicitReplyMarker !== void 0) return explicitReplyMarker;\n if (hasMarkers(event, tagType)) return false;\n const expectedTags = op.getMatchingTags(\"e\").map((tag) => tag[1]);\n expectedTags.push(op.id);\n return event.getMatchingTags(\"e\").every((tag) => expectedTags.includes(tag[1]));\n}\nfunction eventThreads(op, events) {\n const eventsByAuthor = eventsBySameAuthor(op, events);\n const threadEvents = events.filter((event) => eventIsPartOfThread(op, event, eventsByAuthor));\n return threadEvents.sort((a, b) => a.created_at - b.created_at);\n}\nfunction getEventReplyId(event) {\n const replyTag = getReplyTag(event);\n if (replyTag) return replyTag[1];\n const rootTag = getRootTag(event);\n if (rootTag) return rootTag[1];\n}\nfunction isEventOriginalPost(event) {\n return getEventReplyId(event) === void 0;\n}\nfunction eventThreadIds(op, events) {\n const threadIds = /* @__PURE__ */ new Map();\n const threadEvents = eventThreads(op, events);\n threadEvents.forEach((event) => threadIds.set(event.id, event));\n return threadIds;\n}\nfunction eventReplies(op, events, threadEventIds) {\n threadEventIds ??= new Set(eventThreadIds(op, events).keys());\n return events.filter((event) => eventIsReply(op, event, threadEventIds));\n}\nfunction eventIsPartOfThread(op, event, eventsByAuthor) {\n if (op.pubkey !== event.pubkey) return false;\n const taggedEventIds = event.getMatchingTags(\"e\").map((tag) => tag[1]);\n const allTaggedEventsAreByOriginalAuthor = taggedEventIds.every((id) => eventsByAuthor.has(id));\n return allTaggedEventsAreByOriginalAuthor;\n}\nfunction eventHasETagMarkers(event) {\n for (const tag of event.tags) {\n if (tag[0] === \"e\" && (tag[3] ?? \"\").length > 0) return true;\n }\n return false;\n}\nfunction getRootEventId(event, searchTag) {\n searchTag ??= event.tagType();\n const rootEventTag = getRootTag(event, searchTag);\n if (rootEventTag) return rootEventTag[1];\n const replyTag = getReplyTag(event, searchTag);\n return replyTag?.[1];\n}\nfunction getRootTag(event, searchTag) {\n searchTag ??= event.tagType();\n const rootEventTag = event.tags.find(isTagRootTag);\n if (!rootEventTag) {\n if (eventHasETagMarkers(event)) return;\n const matchingTags = event.getMatchingTags(searchTag);\n if (matchingTags.length < 3) return matchingTags[0];\n }\n return rootEventTag;\n}\nvar nip22RootTags = /* @__PURE__ */ new Set([\"A\", \"E\", \"I\"]);\nvar nip22ReplyTags = /* @__PURE__ */ new Set([\"a\", \"e\", \"i\"]);\nfunction getReplyTag(event, searchTag) {\n if (event.kind === 1111 /* GenericReply */) {\n let replyTag2;\n for (const tag of event.tags) {\n if (nip22RootTags.has(tag[0])) replyTag2 = tag;\n else if (nip22ReplyTags.has(tag[0])) {\n replyTag2 = tag;\n break;\n }\n }\n return replyTag2;\n }\n searchTag ??= event.tagType();\n let hasMarkers2 = false;\n let replyTag;\n for (const tag of event.tags) {\n if (tag[0] !== searchTag) continue;\n if ((tag[3] ?? \"\").length > 0) hasMarkers2 = true;\n if (hasMarkers2 && tag[3] === \"reply\") return tag;\n if (hasMarkers2 && tag[3] === \"root\") replyTag = tag;\n if (!hasMarkers2) replyTag = tag;\n }\n return replyTag;\n}\nfunction isTagRootTag(tag) {\n return tag[0] === \"E\" || tag[3] === \"root\";\n}\n\n// src/events/fetch-tagged-event.ts\nasync function fetchTaggedEvent(tag, marker) {\n if (!this.ndk) throw new Error(\"NDK instance not found\");\n const t = this.getMatchingTags(tag, marker);\n if (t.length === 0) return void 0;\n const [_, id, hint] = t[0];\n let relay = hint !== \"\" ? this.ndk.pool.getRelay(hint) : void 0;\n const event = await this.ndk.fetchEvent(id, {}, relay);\n return event;\n}\nasync function fetchRootEvent(subOpts) {\n if (!this.ndk) throw new Error(\"NDK instance not found\");\n const rootTag = getRootTag(this);\n if (!rootTag) return void 0;\n return this.ndk.fetchEventFromTag(rootTag, this, subOpts);\n}\nasync function fetchReplyEvent(subOpts) {\n if (!this.ndk) throw new Error(\"NDK instance not found\");\n const replyTag = getReplyTag(this);\n if (!replyTag) return void 0;\n return this.ndk.fetchEventFromTag(replyTag, this, subOpts);\n}\n\n// src/events/kind.ts\nfunction isReplaceable() {\n if (this.kind === void 0) throw new Error(\"Kind not set\");\n return [0, 3].includes(this.kind) || this.kind >= 1e4 && this.kind < 2e4 || this.kind >= 3e4 && this.kind < 4e4;\n}\nfunction isEphemeral() {\n if (this.kind === void 0) throw new Error(\"Kind not set\");\n return this.kind >= 2e4 && this.kind < 3e4;\n}\nfunction isParamReplaceable() {\n if (this.kind === void 0) throw new Error(\"Kind not set\");\n return this.kind >= 3e4 && this.kind < 4e4;\n}\n\n// src/events/nip19.ts\nimport { nip19 as nip192 } from \"nostr-tools\";\nvar DEFAULT_RELAY_COUNT = 2;\nfunction encode(maxRelayCount = DEFAULT_RELAY_COUNT) {\n let relays = [];\n if (this.onRelays.length > 0) {\n relays = this.onRelays.map((relay) => relay.url);\n } else if (this.relay) {\n relays = [this.relay.url];\n }\n if (relays.length > maxRelayCount) {\n relays = relays.slice(0, maxRelayCount);\n }\n if (this.isParamReplaceable()) {\n return nip192.naddrEncode({\n kind: this.kind,\n pubkey: this.pubkey,\n identifier: this.replaceableDTag(),\n relays\n });\n }\n if (relays.length > 0) {\n return nip192.neventEncode({\n id: this.tagId(),\n relays,\n author: this.pubkey\n });\n }\n return nip192.noteEncode(this.tagId());\n}\n\n// src/events/repost.ts\nasync function repost(publish = true, signer) {\n if (!signer && publish) {\n if (!this.ndk) throw new Error(\"No NDK instance found\");\n this.ndk.assertSigner();\n signer = this.ndk.signer;\n }\n const e = new NDKEvent(this.ndk, {\n kind: getKind(this)\n });\n if (!this.isProtected) e.content = JSON.stringify(this.rawEvent());\n e.tag(this);\n if (this.kind !== 1 /* Text */) {\n e.tags.push([\"k\", `${this.kind}`]);\n }\n if (signer) await e.sign(signer);\n if (publish) await e.publish();\n return e;\n}\nfunction getKind(event) {\n if (event.kind === 1) {\n return 6 /* Repost */;\n }\n return 16 /* GenericRepost */;\n}\n\n// src/events/serializer.ts\nfunction serialize(includeSig = false, includeId = false) {\n const payload = [0, this.pubkey, this.created_at, this.kind, this.tags, this.content];\n if (includeSig) payload.push(this.sig);\n if (includeId) payload.push(this.id);\n return JSON.stringify(payload);\n}\nfunction deserialize(serializedEvent) {\n const eventArray = JSON.parse(serializedEvent);\n const ret = {\n pubkey: eventArray[1],\n created_at: eventArray[2],\n kind: eventArray[3],\n tags: eventArray[4],\n content: eventArray[5]\n };\n if (eventArray.length >= 7) {\n const first = eventArray[6];\n const second = eventArray[7];\n if (first && first.length === 128) {\n ret.sig = first;\n if (second && second.length === 64) {\n ret.id = second;\n }\n } else if (first && first.length === 64) {\n ret.id = first;\n if (second && second.length === 128) {\n ret.sig = second;\n }\n }\n }\n return ret;\n}\n\n// src/events/validation.ts\nimport { schnorr } from \"@noble/curves/secp256k1\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { bytesToHex } from \"@noble/hashes/utils\";\nimport { LRUCache } from \"typescript-lru-cache\";\n\n// src/events/signature.ts\nvar worker;\nvar processingQueue = {};\nfunction signatureVerificationInit(w) {\n worker = w;\n worker.onmessage = (msg) => {\n const [eventId, result] = msg.data;\n const record = processingQueue[eventId];\n if (!record) {\n console.error(\"No record found for event\", eventId);\n return;\n }\n delete processingQueue[eventId];\n for (const resolve of record.resolves) {\n resolve(result);\n }\n };\n}\nasync function verifySignatureAsync(event, _persist, relay) {\n const ndkInstance = event.ndk;\n const start = Date.now();\n let result;\n if (ndkInstance.signatureVerificationFunction) {\n console.log(\"[NDK-CORE] Using custom signature verification function async\");\n result = await ndkInstance.signatureVerificationFunction(event);\n console.log(\"Custom signature verification result\", event.id, { result });\n } else {\n console.log(\"Using worker-based signature verification async\");\n result = await new Promise((resolve) => {\n const serialized = event.serialize();\n let enqueue = false;\n if (!processingQueue[event.id]) {\n processingQueue[event.id] = { event, resolves: [], relay };\n enqueue = true;\n }\n processingQueue[event.id].resolves.push(resolve);\n if (!enqueue) return;\n worker?.postMessage({\n serialized,\n id: event.id,\n sig: event.sig,\n pubkey: event.pubkey\n });\n });\n }\n ndkInstance.signatureVerificationTimeMs += Date.now() - start;\n return result;\n}\n\n// src/events/validation.ts\nvar PUBKEY_REGEX = /^[a-f0-9]{64}$/;\nfunction validate() {\n if (typeof this.kind !== \"number\") return false;\n if (typeof this.content !== \"string\") return false;\n if (typeof this.created_at !== \"number\") return false;\n if (typeof this.pubkey !== \"string\") return false;\n if (!this.pubkey.match(PUBKEY_REGEX)) return false;\n if (!Array.isArray(this.tags)) return false;\n for (let i = 0; i < this.tags.length; i++) {\n const tag = this.tags[i];\n if (!Array.isArray(tag)) return false;\n for (let j = 0; j < tag.length; j++) {\n if (typeof tag[j] === \"object\") return false;\n }\n }\n return true;\n}\nvar verifiedSignatures = new LRUCache({\n maxSize: 1e3,\n entryExpirationTimeInMS: 6e4\n});\nfunction verifySignature(persist) {\n if (typeof this.signatureVerified === \"boolean\") return this.signatureVerified;\n const prevVerification = verifiedSignatures.get(this.id);\n if (prevVerification !== null) {\n this.signatureVerified = !!prevVerification;\n return this.signatureVerified;\n }\n try {\n if (this.ndk?.asyncSigVerification) {\n verifySignatureAsync(this, persist, this.relay).then((result) => {\n if (persist) {\n this.signatureVerified = result;\n if (result) verifiedSignatures.set(this.id, this.sig);\n }\n if (!result) {\n if (this.relay) {\n this.ndk?.reportInvalidSignature(this, this.relay);\n } else {\n this.ndk?.reportInvalidSignature(this);\n }\n verifiedSignatures.set(this.id, false);\n }\n }).catch((err) => {\n console.error(\"signature verification error\", this.id, err);\n });\n } else {\n const hash = sha256(new TextEncoder().encode(this.serialize()));\n const res = schnorr.verify(this.sig, hash, this.pubkey);\n if (res) verifiedSignatures.set(this.id, this.sig);\n else verifiedSignatures.set(this.id, false);\n this.signatureVerified = res;\n return res;\n }\n } catch (_err) {\n this.signatureVerified = false;\n return false;\n }\n}\nfunction getEventHash() {\n return getEventHashFromSerializedEvent(this.serialize());\n}\nfunction getEventHashFromSerializedEvent(serializedEvent) {\n const eventHash = sha256(new TextEncoder().encode(serializedEvent));\n return bytesToHex(eventHash);\n}\n\n// src/events/index.ts\nvar skipClientTagOnKinds = /* @__PURE__ */ new Set([\n 0 /* Metadata */,\n 4 /* EncryptedDirectMessage */,\n 1059 /* GiftWrap */,\n 13 /* GiftWrapSeal */,\n 3 /* Contacts */,\n 9734 /* ZapRequest */,\n 5 /* EventDeletion */\n]);\nvar NDKEvent = class _NDKEvent extends EventEmitter2 {\n ndk;\n created_at;\n content = \"\";\n tags = [];\n kind;\n id = \"\";\n sig;\n pubkey = \"\";\n signatureVerified;\n _author = void 0;\n /**\n * The relay that this event was first received from.\n */\n relay;\n /**\n * The relays that this event was received from and/or successfully published to.\n */\n get onRelays() {\n let res = [];\n if (!this.ndk) {\n if (this.relay) res.push(this.relay);\n } else {\n res = this.ndk.subManager.seenEvents.get(this.id) || [];\n }\n return res;\n }\n /**\n * The status of the publish operation.\n */\n publishStatus = \"success\";\n publishError;\n constructor(ndk, event) {\n super();\n this.ndk = ndk;\n this.created_at = event?.created_at;\n this.content = event?.content || \"\";\n this.tags = event?.tags || [];\n this.id = event?.id || \"\";\n this.sig = event?.sig;\n this.pubkey = event?.pubkey || \"\";\n this.kind = event?.kind;\n if (event instanceof _NDKEvent) {\n if (this.relay) {\n this.relay = event.relay;\n this.ndk?.subManager.seenEvent(event.id, this.relay);\n }\n this.publishStatus = event.publishStatus;\n this.publishError = event.publishError;\n }\n }\n /**\n * Deserialize an NDKEvent from a serialized payload.\n * @param ndk\n * @param event\n * @returns\n */\n static deserialize(ndk, event) {\n return new _NDKEvent(ndk, deserialize(event));\n }\n /**\n * Returns the event as is.\n */\n rawEvent() {\n return {\n created_at: this.created_at,\n content: this.content,\n tags: this.tags,\n kind: this.kind,\n pubkey: this.pubkey,\n id: this.id,\n sig: this.sig\n };\n }\n set author(user) {\n this.pubkey = user.pubkey;\n this._author = user;\n this._author.ndk ??= this.ndk;\n }\n /**\n * Returns an NDKUser for the author of the event.\n */\n get author() {\n if (this._author) return this._author;\n if (!this.ndk) throw new Error(\"No NDK instance found\");\n const user = this.ndk.getUser({ pubkey: this.pubkey });\n this._author = user;\n return user;\n }\n /**\n * NIP-73 tagging of external entities\n * @param entity to be tagged\n * @param type of the entity\n * @param markerUrl to be used as the marker URL\n *\n * @example\n * ```typescript\n * event.tagExternal(\"https://example.com/article/123#nostr\", \"url\");\n * event.tags => [[\"i\", \"https://example.com/123\"], [\"k\", \"https://example.com\"]]\n * ```\n *\n * @example tag a podcast:item:guid\n * ```typescript\n * event.tagExternal(\"e32b4890-b9ea-4aef-a0bf-54b787833dc5\", \"podcast:item:guid\");\n * event.tags => [[\"i\", \"podcast:item:guid:e32b4890-b9ea-4aef-a0bf-54b787833dc5\"], [\"k\", \"podcast:item:guid\"]]\n * ```\n *\n * @see https://github.com/nostr-protocol/nips/blob/master/73.md\n */\n tagExternal(entity, type, markerUrl) {\n const iTag = [\"i\"];\n const kTag = [\"k\"];\n switch (type) {\n case \"url\": {\n const url = new URL(entity);\n url.hash = \"\";\n iTag.push(url.toString());\n kTag.push(`${url.protocol}//${url.host}`);\n break;\n }\n case \"hashtag\":\n iTag.push(`#${entity.toLowerCase()}`);\n kTag.push(\"#\");\n break;\n case \"geohash\":\n iTag.push(`geo:${entity.toLowerCase()}`);\n kTag.push(\"geo\");\n break;\n case \"isbn\":\n iTag.push(`isbn:${entity.replace(/-/g, \"\")}`);\n kTag.push(\"isbn\");\n break;\n case \"podcast:guid\":\n iTag.push(`podcast:guid:${entity}`);\n kTag.push(\"podcast:guid\");\n break;\n case \"podcast:item:guid\":\n iTag.push(`podcast:item:guid:${entity}`);\n kTag.push(\"podcast:item:guid\");\n break;\n case \"podcast:publisher:guid\":\n iTag.push(`podcast:publisher:guid:${entity}`);\n kTag.push(\"podcast:publisher:guid\");\n break;\n case \"isan\":\n iTag.push(`isan:${entity.split(\"-\").slice(0, 4).join(\"-\")}`);\n kTag.push(\"isan\");\n break;\n case \"doi\":\n iTag.push(`doi:${entity.toLowerCase()}`);\n kTag.push(\"doi\");\n break;\n default:\n throw new Error(`Unsupported NIP-73 entity type: ${type}`);\n }\n if (markerUrl) {\n iTag.push(markerUrl);\n }\n this.tags.push(iTag);\n this.tags.push(kTag);\n }\n /**\n * Tag a user with an optional marker.\n * @param target What is to be tagged. Can be an NDKUser, NDKEvent, or an NDKTag.\n * @param marker The marker to use in the tag.\n * @param skipAuthorTag Whether to explicitly skip adding the author tag of the event.\n * @param forceTag Force a specific tag to be used instead of the default \"e\" or \"a\" tag.\n * @param opts Optional content tagging options to control p tag behavior.\n * @example\n * ```typescript\n * reply.tag(opEvent, \"reply\");\n * // reply.tags => [[\"e\", <id>, <relay>, \"reply\"]]\n * ```\n */\n tag(target, marker, skipAuthorTag, forceTag, opts) {\n let tags = [];\n const isNDKUser = target.fetchProfile !== void 0;\n if (isNDKUser) {\n forceTag ??= \"p\";\n if (forceTag === \"p\" && opts?.pTags === false) {\n return;\n }\n const tag = [forceTag, target.pubkey];\n if (marker) tag.push(...[\"\", marker]);\n tags.push(tag);\n } else if (target instanceof _NDKEvent) {\n const event = target;\n skipAuthorTag ??= event?.pubkey === this.pubkey;\n tags = event.referenceTags(marker, skipAuthorTag, forceTag, opts);\n if (opts?.pTags !== false) {\n for (const pTag of event.getMatchingTags(\"p\")) {\n if (pTag[1] === this.pubkey) continue;\n if (this.tags.find((t) => t[0] === \"p\" && t[1] === pTag[1])) continue;\n this.tags.push([\"p\", pTag[1]]);\n }\n }\n } else if (Array.isArray(target)) {\n tags = [target];\n } else {\n throw new Error(\"Invalid argument\", target);\n }\n this.tags = mergeTags(this.tags, tags);\n }\n /**\n * Return a NostrEvent object, trying to fill in missing fields\n * when possible, adding tags when necessary.\n * @param pubkey {string} The pubkey of the user who the event belongs to.\n * @param opts {ContentTaggingOptions} Options for content tagging.\n * @returns {Promise<NostrEvent>} A promise that resolves to a NostrEvent.\n */\n async toNostrEvent(pubkey, opts) {\n if (!pubkey && this.pubkey === \"\") {\n const user = await this.ndk?.signer?.user();\n this.pubkey = user?.pubkey || \"\";\n }\n if (!this.created_at) {\n this.created_at = Math.floor(Date.now() / 1e3);\n }\n const { content, tags } = await this.generateTags(opts);\n this.content = content || \"\";\n this.tags = tags;\n try {\n this.id = this.getEventHash();\n } catch (_e) {\n }\n return this.rawEvent();\n }\n serialize = serialize.bind(this);\n getEventHash = getEventHash.bind(this);\n validate = validate.bind(this);\n verifySignature = verifySignature.bind(this);\n /**\n * Is this event replaceable (whether parameterized or not)?\n *\n * This will return true for kind 0, 3, 10k-20k and 30k-40k\n */\n isReplaceable = isReplaceable.bind(this);\n isEphemeral = isEphemeral.bind(this);\n isDvm = () => this.kind && this.kind >= 5e3 && this.kind <= 7e3;\n /**\n * Is this event parameterized replaceable?\n *\n * This will return true for kind 30k-40k\n */\n isParamReplaceable = isParamReplaceable.bind(this);\n /**\n * Encodes a bech32 id.\n *\n * @param relays {string[]} The relays to encode in the id\n * @returns {string} - Encoded naddr, note or nevent.\n */\n encode = encode.bind(this);\n encrypt = encrypt.bind(this);\n decrypt = decrypt.bind(this);\n /**\n * Get all tags with the given name\n * @param tagName {string} The name of the tag to search for\n * @returns {NDKTag[]} An array of the matching tags\n */\n getMatchingTags(tagName, marker) {\n const t = this.tags.filter((tag) => tag[0] === tagName);\n if (marker === void 0) return t;\n return t.filter((tag) => tag[3] === marker);\n }\n /**\n * Check if the event has a tag with the given name\n * @param tagName\n * @param marker\n * @returns\n */\n hasTag(tagName, marker) {\n return this.tags.some((tag) => tag[0] === tagName && (!marker || tag[3] === marker));\n }\n /**\n * Get the first tag with the given name\n * @param tagName Tag name to search for\n * @returns The value of the first tag with the given name, or undefined if no such tag exists\n */\n tagValue(tagName, marker) {\n const tags = this.getMatchingTags(tagName, marker);\n if (tags.length === 0) return void 0;\n return tags[0][1];\n }\n /**\n * Gets the NIP-31 \"alt\" tag of the event.\n */\n get alt() {\n return this.tagValue(\"alt\");\n }\n /**\n * Sets the NIP-31 \"alt\" tag of the event. Use this to set an alt tag so\n * clients that don't handle a particular event kind can display something\n * useful for users.\n */\n set alt(alt) {\n this.removeTag(\"alt\");\n if (alt) this.tags.push([\"alt\", alt]);\n }\n /**\n * Gets the NIP-33 \"d\" tag of the event.\n */\n get dTag() {\n return this.tagValue(\"d\");\n }\n /**\n * Sets the NIP-33 \"d\" tag of the event.\n */\n set dTag(value) {\n this.removeTag(\"d\");\n if (value) this.tags.push([\"d\", value]);\n }\n /**\n * Remove all tags with the given name (e.g. \"d\", \"a\", \"p\")\n * @param tagName Tag name(s) to search for and remove\n * @param marker Optional marker to check for too\n *\n * @example\n * Remove a tags with a \"defer\" marker\n * ```typescript\n * event.tags = [\n * [\"a\", \"....\", \"defer\"],\n * [\"a\", \"....\", \"no-defer\"],\n * ]\n *\n * event.removeTag(\"a\", \"defer\");\n *\n * // event.tags => [[\"a\", \"....\", \"no-defer\"]]\n *\n * @returns {void}\n */\n removeTag(tagName, marker) {\n const tagNames = Array.isArray(tagName) ? tagName : [tagName];\n this.tags = this.tags.filter((tag) => {\n const include = tagNames.includes(tag[0]);\n const hasMarker = marker ? tag[3] === marker : true;\n return !(include && hasMarker);\n });\n }\n /**\n * Replace a tag with a new value. If not found, it will be added.\n * @param tag The tag to replace.\n * @param value The new value for the tag.\n */\n replaceTag(tag) {\n this.removeTag(tag[0]);\n this.tags.push(tag);\n }\n /**\n * Sign the event if a signer is present.\n *\n * It will generate tags.\n * Repleacable events will have their created_at field set to the current time.\n * @param signer {NDKSigner} The NDKSigner to use to sign the event\n * @param opts {ContentTaggingOptions} Options for content tagging.\n * @returns {Promise<string>} A Promise that resolves to the signature of the signed event.\n */\n async sign(signer, opts) {\n if (!signer) {\n this.ndk?.assertSigner();\n signer = this.ndk?.signer;\n } else {\n this.author = await signer.user();\n }\n const nostrEvent = await this.toNostrEvent(void 0, opts);\n this.sig = await signer.sign(nostrEvent);\n return this.sig;\n }\n /**\n *\n * @param relaySet\n * @param timeoutMs\n * @param requiredRelayCount\n * @returns\n */\n async publishReplaceable(relaySet, timeoutMs, requiredRelayCount) {\n this.id = \"\";\n this.created_at = Math.floor(Date.now() / 1e3);\n this.sig = \"\";\n return this.publish(relaySet, timeoutMs, requiredRelayCount);\n }\n /**\n * Attempt to sign and then publish an NDKEvent to a given relaySet.\n * If no relaySet is provided, the relaySet will be calculated by NDK.\n * @param relaySet {NDKRelaySet} The relaySet to publish the even to.\n * @param timeoutM {number} The timeout for the publish operation in milliseconds.\n * @param requiredRelayCount The number of relays that must receive the event for the publish to be considered successful.\n * @param opts {ContentTaggingOptions} Options for content tagging.\n * @returns A promise that resolves to the relays the event was published to.\n */\n async publish(relaySet, timeoutMs, requiredRelayCount, opts) {\n if (!requiredRelayCount) requiredRelayCount = 1;\n if (!this.sig) await this.sign(void 0, opts);\n if (!this.ndk) throw new Error(\"NDKEvent must be associated with an NDK instance to publish\");\n if (!relaySet || relaySet.size === 0) {\n relaySet = this.ndk.devWriteRelaySet || await calculateRelaySetFromEvent(this.ndk, this, requiredRelayCount);\n }\n if (this.kind === 5 /* EventDeletion */ && this.ndk.cacheAdapter?.deleteEventIds) {\n const eTags = this.getMatchingTags(\"e\").map((tag) => tag[1]);\n this.ndk.cacheAdapter.deleteEventIds(eTags);\n }\n const rawEvent = this.rawEvent();\n if (this.ndk.cacheAdapter?.addUnpublishedEvent && shouldTrackUnpublishedEvent(this)) {\n try {\n this.ndk.cacheAdapter.addUnpublishedEvent(this, relaySet.relayUrls);\n } catch (e) {\n console.error(\"Error adding unpublished event to cache\", e);\n }\n }\n if (this.kind === 5 /* EventDeletion */ && this.ndk.cacheAdapter?.deleteEventIds) {\n this.ndk.cacheAdapter.deleteEventIds(this.getMatchingTags(\"e\").map((tag) => tag[1]));\n }\n this.ndk.subManager.dispatchEvent(rawEvent, void 0, true);\n const relays = await relaySet.publish(this, timeoutMs, requiredRelayCount);\n relays.forEach((relay) => this.ndk?.subManager.seenEvent(this.id, relay));\n return relays;\n }\n /**\n * Generates tags for users, notes, and other events tagged in content.\n * Will also generate random \"d\" tag for parameterized replaceable events where needed.\n * @param opts {ContentTaggingOptions} Options for content tagging.\n * @returns {ContentTag} The tags and content of the event.\n */\n async generateTags(opts) {\n let tags = [];\n const g = await generateContentTags(this.content, this.tags, opts, this);\n const content = g.content;\n tags = g.tags;\n if (this.kind && this.isParamReplaceable()) {\n const dTag = this.getMatchingTags(\"d\")[0];\n if (!dTag) {\n const title = this.tagValue(\"title\");\n const randLength = title ? 6 : 16;\n let str = [...Array(randLength)].map(() => Math.random().toString(36)[2]).join(\"\");\n if (title && title.length > 0) {\n str = `${title.replace(/[^a-z0-9]+/gi, \"-\").replace(/^-|-$/g, \"\")}-${str}`;\n }\n tags.push([\"d\", str]);\n }\n }\n if (this.shouldAddClientTag) {\n const clientTag = [\"client\", this.ndk?.clientName ?? \"\"];\n if (this.ndk?.clientNip89) clientTag.push(this.ndk?.clientNip89);\n tags.push(clientTag);\n } else if (this.shouldStripClientTag) {\n tags = tags.filter((tag) => tag[0] !== \"client\");\n }\n return { content: content || \"\", tags };\n }\n get shouldAddClientTag() {\n if (!this.ndk?.clientName && !this.ndk?.clientNip89) return false;\n if (skipClientTagOnKinds.has(this.kind)) return false;\n if (this.isEphemeral()) return false;\n if (this.isReplaceable() && !this.isParamReplaceable()) return false;\n if (this.isDvm()) return false;\n if (this.hasTag(\"client\")) return false;\n return true;\n }\n get shouldStripClientTag() {\n return skipClientTagOnKinds.has(this.kind);\n }\n muted() {\n const authorMutedEntry = this.ndk?.mutedIds.get(this.pubkey);\n if (authorMutedEntry && authorMutedEntry === \"p\") return \"author\";\n const eventTagReference = this.tagReference();\n const eventMutedEntry = this.ndk?.mutedIds.get(eventTagReference[1]);\n if (eventMutedEntry && eventMutedEntry === eventTagReference[0]) return \"event\";\n return null;\n }\n /**\n * Returns the \"d\" tag of a parameterized replaceable event or throws an error if the event isn't\n * a parameterized replaceable event.\n * @returns {string} the \"d\" tag of the event.\n *\n * @deprecated Use `dTag` instead.\n */\n replaceableDTag() {\n if (this.kind && this.kind >= 3e4 && this.kind <= 4e4) {\n const dTag = this.getMatchingTags(\"d\")[0];\n const dTagId = dTag ? dTag[1] : \"\";\n return dTagId;\n }\n throw new Error(\"Event is not a parameterized replaceable event\");\n }\n /**\n * Provides a deduplication key for the event.\n *\n * For kinds 0, 3, 10k-20k this will be the event <kind>:<pubkey>\n * For kinds 30k-40k this will be the event <kind>:<pubkey>:<d-tag>\n * For all other kinds this will be the event id\n */\n deduplicationKey() {\n if (this.kind === 0 || this.kind === 3 || this.kind && this.kind >= 1e4 && this.kind < 2e4) {\n return `${this.kind}:${this.pubkey}`;\n }\n return this.tagId();\n }\n /**\n * Returns the id of the event or, if it's a parameterized event, the generated id of the event using \"d\" tag, pubkey, and kind.\n * @returns {string} The id\n */\n tagId() {\n if (this.isParamReplaceable()) {\n return this.tagAddress();\n }\n return this.id;\n }\n /**\n * Returns a stable reference value for a replaceable event.\n *\n * Param replaceable events are returned in the expected format of `<kind>:<pubkey>:<d-tag>`.\n * Kind-replaceable events are returned in the format of `<kind>:<pubkey>:`.\n *\n * @returns {string} A stable reference value for replaceable events\n */\n tagAddress() {\n if (this.isParamReplaceable()) {\n const dTagId = this.dTag ?? \"\";\n return `${this.kind}:${this.pubkey}:${dTagId}`;\n }\n if (this.isReplaceable()) {\n return `${this.kind}:${this.pubkey}:`;\n }\n throw new Error(\"Event is not a replaceable event\");\n }\n /**\n * Determines the type of tag that can be used to reference this event from another event.\n * @returns {string} The tag type\n * @example\n * event = new NDKEvent(ndk, { kind: 30000, pubkey: 'pubkey', tags: [ [\"d\", \"d-code\"] ] });\n * event.tagType(); // \"a\"\n */\n tagType() {\n return this.isParamReplaceable() ? \"a\" : \"e\";\n }\n /**\n * Get the tag that can be used to reference this event from another event.\n *\n * Consider using referenceTags() instead (unless you have a good reason to use this)\n *\n * @example\n * event = new NDKEvent(ndk, { kind: 30000, pubkey: 'pubkey', tags: [ [\"d\", \"d-code\"] ] });\n * event.tagReference(); // [\"a\", \"30000:pubkey:d-code\"]\n *\n * event = new NDKEvent(ndk, { kind: 1, pubkey: 'pubkey', id: \"eventid\" });\n * event.tagReference(); // [\"e\", \"eventid\"]\n * @returns {NDKTag} The NDKTag object referencing this event\n */\n tagReference(marker) {\n let tag;\n if (this.isParamReplaceable()) {\n tag = [\"a\", this.tagAddress()];\n } else {\n tag = [\"e\", this.tagId()];\n }\n if (this.relay) {\n tag.push(this.relay.url);\n } else {\n tag.push(\"\");\n }\n tag.push(marker ?? \"\");\n if (!this.isParamReplaceable()) {\n tag.push(this.pubkey);\n }\n return tag;\n }\n /**\n * Get the tags that can be used to reference this event from another event\n * @param marker The marker to use in the tag\n * @param skipAuthorTag Whether to explicitly skip adding the author tag of the event\n * @param forceTag Force a specific tag to be used instead of the default \"e\" or \"a\" tag\n * @example\n * event = new NDKEvent(ndk, { kind: 30000, pubkey: 'pubkey', tags: [ [\"d\", \"d-code\"] ] });\n * event.referenceTags(); // [[\"a\", \"30000:pubkey:d-code\"], [\"e\", \"parent-id\"]]\n *\n * event = new NDKEvent(ndk, { kind: 1, pubkey: 'pubkey', id: \"eventid\" });\n * event.referenceTags(); // [[\"e\", \"parent-id\"]]\n * @returns {NDKTag} The NDKTag object referencing this event\n */\n referenceTags(marker, skipAuthorTag, forceTag, opts) {\n let tags = [];\n if (this.isParamReplaceable()) {\n tags = [\n [forceTag ?? \"a\", this.tagAddress()],\n [forceTag ?? \"e\", this.id]\n ];\n } else {\n tags = [[forceTag ?? \"e\", this.id]];\n }\n tags = tags.map((tag) => {\n if (tag[0] === \"e\" || marker) {\n tag.push(this.relay?.url ?? \"\");\n } else if (this.relay?.url) {\n tag.push(this.relay?.url);\n }\n return tag;\n });\n tags.forEach((tag) => {\n if (tag[0] === \"e\") {\n tag.push(marker ?? \"\");\n tag.push(this.pubkey);\n } else if (marker) {\n tag.push(marker);\n }\n });\n tags = [...tags, ...this.getMatchingTags(\"h\")];\n if (!skipAuthorTag && opts?.pTags !== false) tags.push(...this.author.referenceTags());\n return tags;\n }\n /**\n * Provides the filter that will return matching events for this event.\n *\n * @example\n * event = new NDKEvent(ndk, { kind: 30000, pubkey: 'pubkey', tags: [ [\"d\", \"d-code\"] ] });\n * event.filter(); // { \"#a\": [\"30000:pubkey:d-code\"] }\n * @example\n * event = new NDKEvent(ndk, { kind: 1, pubkey: 'pubkey', id: \"eventid\" });\n * event.filter(); // { \"#e\": [\"eventid\"] }\n *\n * @returns The filter that will return matching events for this event\n */\n filter() {\n if (this.isParamReplaceable()) {\n return { \"#a\": [this.tagId()] };\n }\n return { \"#e\": [this.tagId()] };\n }\n nip22Filter() {\n if (this.isParamReplaceable()) {\n return { \"#A\": [this.tagId()] };\n }\n return { \"#E\": [this.tagId()] };\n }\n /**\n * Generates a deletion event of the current event\n *\n * @param reason The reason for the deletion\n * @param publish Whether to publish the deletion event automatically\n * @returns The deletion event\n */\n async delete(reason, publish = true) {\n if (!this.ndk) throw new Error(\"No NDK instance found\");\n this.ndk.assertSigner();\n const e = new _NDKEvent(this.ndk, {\n kind: 5 /* EventDeletion */,\n content: reason || \"\"\n });\n e.tag(this, void 0, true);\n e.tags.push([\"k\", this.kind?.toString()]);\n if (publish) {\n this.emit(\"deleted\");\n await e.publish();\n }\n return e;\n }\n /**\n * Establishes whether this is a NIP-70-protectede event.\n * @@satisfies NIP-70\n */\n set isProtected(val) {\n this.removeTag(\"-\");\n if (val) this.tags.push([\"-\"]);\n }\n /**\n * Whether this is a NIP-70-protected event.\n * @@satisfies NIP-70\n */\n get isProtected() {\n return this.hasTag(\"-\");\n }\n /**\n * Fetch an event tagged with the given tag following relay hints if provided.\n * @param tag The tag to search for\n * @param marker The marker to use in the tag (e.g. \"root\")\n * @returns The fetched event or null if no event was found, undefined if no matching tag was found in the event\n * * @example\n * const replyEvent = await ndk.fetchEvent(\"nevent1qqs8x8vnycyha73grv380gmvlury4wtmx0nr9a5ds2dngqwgu87wn6gpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgq3ql2vyh47mk2p0qlsku7hg0vn29faehy9hy34ygaclpn66ukqp3afqz4cwjd\")\n * const originalEvent = await replyEvent.fetchTaggedEvent(\"e\", \"reply\");\n * console.log(replyEvent.encode() + \" is a reply to event \" + originalEvent?.encode());\n */\n fetchTaggedEvent = fetchTaggedEvent.bind(this);\n /**\n * Fetch the root event of the current event.\n * @returns The fetched root event or null if no event was found\n * @example\n * const replyEvent = await ndk.fetchEvent(\"nevent1qqs8x8vnycyha73grv380gmvlury4wtmx0nr9a5ds2dngqwgu87wn6gpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgq3ql2vyh47mk2p0qlsku7hg0vn29faehy9hy34ygaclpn66ukqp3afqz4cwjd\")\n * const rootEvent = await replyEvent.fetchRootEvent();\n * console.log(replyEvent.encode() + \" is a reply in the thread \" + rootEvent?.encode());\n */\n fetchRootEvent = fetchRootEvent.bind(this);\n /**\n * Fetch the event the current event is replying to.\n * @returns The fetched reply event or null if no event was found\n */\n fetchReplyEvent = fetchReplyEvent.bind(this);\n /**\n * NIP-18 reposting event.\n *\n * @param publish Whether to publish the reposted event automatically @default true\n * @param signer The signer to use for signing the reposted event\n * @returns The reposted event\n *\n * @function\n */\n repost = repost.bind(this);\n /**\n * React to an existing event\n *\n * @param content The content of the reaction\n */\n async react(content, publish = true) {\n if (!this.ndk) throw new Error(\"No NDK instance found\");\n this.ndk.assertSigner();\n const e = new _NDKEvent(this.ndk, {\n kind: 7 /* Reaction */,\n content\n });\n e.tag(this);\n if (this.kind !== 1 /* Text */) {\n e.tags.push([\"k\", `${this.kind}`]);\n }\n if (publish) await e.publish();\n return e;\n }\n /**\n * Checks whether the event is valid per underlying NIPs.\n *\n * This method is meant to be overridden by subclasses that implement specific NIPs\n * to allow the enforcement of NIP-specific validation rules.\n *\n * Otherwise, it will only check for basic event properties.\n *\n */\n get isValid() {\n return this.validate();\n }\n get inspect() {\n return JSON.stringify(this.rawEvent(), null, 4);\n }\n /**\n * Dump the event to console for debugging purposes.\n * Prints a JSON stringified version of rawEvent() with indentation\n * and also lists all relay URLs for onRelays.\n */\n dump() {\n console.debug(JSON.stringify(this.rawEvent(), null, 4));\n console.debug(\"Event on relays:\", this.onRelays.map((relay) => relay.url).join(\", \"));\n }\n /**\n * Creates a reply event for the current event.\n *\n * This function will use NIP-22 when appropriate (i.e. replies to non-kind:1 events).\n * This function does not have side-effects; it will just return an event with the appropriate tags\n * to generate the reply event; the caller is responsible for publishing the event.\n *\n * @param forceNip22 - Optional flag to force NIP-22 style replies (kind 1111) regardless of the original event's kind\n * @param opts - Optional content tagging options\n */\n reply(forceNip22, opts) {\n const reply = new _NDKEvent(this.ndk);\n if (this.kind === 1 && !forceNip22) {\n reply.kind = 1;\n const opHasETag = this.hasTag(\"e\");\n if (opHasETag) {\n reply.tags = [\n ...reply.tags,\n ...this.getMatchingTags(\"e\"),\n ...this.getMatchingTags(\"p\"),\n ...this.getMatchingTags(\"a\"),\n ...this.referenceTags(\"reply\", false, void 0, opts)\n ];\n } else {\n reply.tag(this, \"root\", false, void 0, opts);\n }\n } else {\n reply.kind = 1111 /* GenericReply */;\n const carryOverTags = [\"A\", \"E\", \"I\", \"P\"];\n const rootTags = this.tags.filter((tag) => carryOverTags.includes(tag[0]));\n if (rootTags.length > 0) {\n const rootKind = this.tagValue(\"K\");\n reply.tags.push(...rootTags);\n if (rootKind) reply.tags.push([\"K\", rootKind]);\n let tag;\n if (this.isParamReplaceable()) {\n tag = [\"a\", this.tagAddress()];\n const relayHint = this.relay?.url ?? \"\";\n if (relayHint) tag.push(relayHint);\n } else {\n tag = [\"e\", this.tagId()];\n const relayHint = this.relay?.url ?? \"\";\n tag.push(relayHint);\n tag.push(this.pubkey);\n }\n reply.tags.push(tag);\n } else {\n let lowerTag;\n let upperTag;\n const relayHint = this.relay?.url ?? \"\";\n if (this.isParamReplaceable()) {\n lowerTag = [\"a\", this.tagAddress(), relayHint];\n upperTag = [\"A\", this.tagAddress(), relayHint];\n } else {\n lowerTag = [\"e\", this.tagId(), relayHint, this.pubkey];\n upperTag = [\"E\", this.tagId(), relayHint, this.pubkey];\n }\n reply.tags.push(lowerTag);\n reply.tags.push(upperTag);\n reply.tags.push([\"K\", this.kind?.toString()]);\n if (opts?.pTags !== false && opts?.pTagOnATags !== false) {\n reply.tags.push([\"P\", this.pubkey]);\n }\n }\n reply.tags.push([\"k\", this.kind?.toString()]);\n if (opts?.pTags !== false) {\n reply.tags.push(...this.getMatchingTags(\"p\"));\n reply.tags.push([\"p\", this.pubkey]);\n }\n }\n return reply;\n }\n};\nvar untrackedUnpublishedEvents = /* @__PURE__ */ new Set([\n 24133 /* NostrConnect */,\n 13194 /* NostrWaletConnectInfo */,\n 23194 /* NostrWalletConnectReq */,\n 23195 /* NostrWalletConnectRes */\n]);\nfunction shouldTrackUnpublishedEvent(event) {\n return !untrackedUnpublishedEvents.has(event.kind);\n}\nfunction isSignedEvent(event) {\n return !!(event.sig && event.id && event.created_at && event.created_at > 0);\n}\nfunction isUnsignedEvent(event) {\n return !isSignedEvent(event);\n}\nfunction assertSignedEvent(event) {\n if (!isSignedEvent(event)) {\n throw new Error(\"Expected signed event but event is not signed\");\n }\n}\nfunction createSignedEvent(event) {\n if (!isSignedEvent(event)) {\n throw new Error(\"Cannot create signed event from unsigned event\");\n }\n Object.defineProperty(event, \"signed\", { value: true, writable: false, enumerable: false });\n return event;\n}\n\n// src/relay/pool/index.ts\nimport { EventEmitter as EventEmitter3 } from \"tseep\";\nvar NDKPool = class extends EventEmitter3 {\n // TODO: This should probably be an LRU cache\n _relays = /* @__PURE__ */ new Map();\n status = \"idle\";\n autoConnectRelays = /* @__PURE__ */ new Set();\n poolBlacklistRelayUrls = /* @__PURE__ */ new Set();\n debug;\n temporaryRelayTimers = /* @__PURE__ */ new Map();\n flappingRelays = /* @__PURE__ */ new Set();\n // A map to store timeouts for each flapping relay.\n backoffTimes = /* @__PURE__ */ new Map();\n ndk;\n // System-wide disconnection detection\n disconnectionTimes = /* @__PURE__ */ new Map();\n systemEventDetector;\n get blacklistRelayUrls() {\n const val = new Set(this.ndk.blacklistRelayUrls);\n this.poolBlacklistRelayUrls.forEach((url) => val.add(url));\n return val;\n }\n /**\n * @param relayUrls - The URLs of the relays to connect to.\n * @param blacklistedRelayUrls - URLs to blacklist for this pool IN ADDITION to those blacklisted at the ndk-level\n * @param ndk - The NDK instance.\n * @param opts - Options for the pool.\n */\n constructor(relayUrls, blacklistedRelayUrls, ndk, {\n debug: debug9,\n name\n } = {}) {\n super();\n this.debug = debug9 ?? ndk.debug.extend(\"pool\");\n if (name) this._name = name;\n this.ndk = ndk;\n this.relayUrls = relayUrls;\n this.poolBlacklistRelayUrls = new Set(blacklistedRelayUrls);\n this.ndk.pools.push(this);\n }\n get relays() {\n return this._relays;\n }\n set relayUrls(urls) {\n this._relays.clear();\n for (const relayUrl of urls) {\n const relay = new NDKRelay(relayUrl, void 0, this.ndk);\n relay.connectivity.netDebug = this.ndk.netDebug;\n this.addRelay(relay);\n }\n }\n _name = \"unnamed\";\n get name() {\n return this._name;\n }\n set name(name) {\n this._name = name;\n this.debug = this.debug.extend(name);\n }\n /**\n * Adds a relay to the pool, and sets a timer to remove it if it is not used within the specified time.\n * @param relay - The relay to add to the pool.\n * @param removeIfUnusedAfter - The time in milliseconds to wait before removing the relay from the pool after it is no longer used.\n */\n useTemporaryRelay(relay, removeIfUnusedAfter = 3e4, filters) {\n const relayAlreadyInPool = this.relays.has(relay.url);\n if (!relayAlreadyInPool) {\n this.addRelay(relay);\n this.debug(\"Adding temporary relay %s for filters %o\", relay.url, filters);\n }\n const existingTimer = this.temporaryRelayTimers.get(relay.url);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n if (!relayAlreadyInPool || existingTimer) {\n const timer = setTimeout(() => {\n if (this.ndk.explicitRelayUrls?.includes(relay.url)) return;\n this.removeRelay(relay.url);\n }, removeIfUnusedAfter);\n this.temporaryRelayTimers.set(relay.url, timer);\n }\n }\n /**\n * Adds a relay to the pool.\n *\n * @param relay - The relay to add to the pool.\n * @param connect - Whether or not to connect to the relay.\n */\n addRelay(relay, connect = true) {\n const isAlreadyInPool = this.relays.has(relay.url);\n const isBlacklisted = this.blacklistRelayUrls?.has(relay.url);\n const isCustomRelayUrl = relay.url.includes(\"/npub1\");\n let reconnect = true;\n const relayUrl = relay.url;\n if (isAlreadyInPool) return;\n if (isBlacklisted) {\n this.debug(`Refusing to add relay ${relayUrl}: blacklisted`);\n return;\n }\n if (isCustomRelayUrl) {\n this.debug(`Refusing to add relay ${relayUrl}: is a filter relay`);\n return;\n }\n if (this.ndk.cacheAdapter?.getRelayStatus) {\n const info = this.ndk.cacheAdapter.getRelayStatus(relayUrl);\n if (info?.dontConnectBefore) {\n if (info.dontConnectBefore > Date.now()) {\n const delay = info.dontConnectBefore - Date.now();\n this.debug(`Refusing to add relay ${relayUrl}: delayed connect for ${delay}ms`);\n setTimeout(() => {\n this.addRelay(relay, connect);\n }, delay);\n return;\n }\n reconnect = false;\n }\n }\n const noticeHandler = (notice) => this.emit(\"notice\", relay, notice);\n const connectHandler = () => this.handleRelayConnect(relayUrl);\n const readyHandler = () => this.handleRelayReady(relay);\n const disconnectHandler = () => {\n this.recordDisconnection(relay);\n this.emit(\"relay:disconnect\", relay);\n };\n const flappingHandler = () => this.handleFlapping(relay);\n const authHandler = (challenge) => this.emit(\"relay:auth\", relay, challenge);\n const authedHandler = () => this.emit(\"relay:authed\", relay);\n relay.off(\"notice\", noticeHandler);\n relay.off(\"connect\", connectHandler);\n relay.off(\"ready\", readyHandler);\n relay.off(\"disconnect\", disconnectHandler);\n relay.off(\"flapping\", flappingHandler);\n relay.off(\"auth\", authHandler);\n relay.off(\"authed\", authedHandler);\n relay.on(\"notice\", noticeHandler);\n relay.on(\"connect\", connectHandler);\n relay.on(\"ready\", readyHandler);\n relay.on(\"disconnect\", disconnectHandler);\n relay.on(\"flapping\", flappingHandler);\n relay.on(\"auth\", authHandler);\n relay.on(\"authed\", authedHandler);\n relay.on(\"delayed-connect\", (delay) => {\n if (this.ndk.cacheAdapter?.updateRelayStatus) {\n this.ndk.cacheAdapter.updateRelayStatus(relay.url, {\n dontConnectBefore: Date.now() + delay\n });\n }\n });\n this._relays.set(relayUrl, relay);\n if (connect) this.autoConnectRelays.add(relayUrl);\n if (connect && this.status === \"active\") {\n this.emit(\"relay:connecting\", relay);\n relay.connect(void 0, reconnect).catch((e) => {\n this.debug(`Failed to connect to relay ${relayUrl}`, e);\n });\n }\n }\n /**\n * Removes a relay from the pool.\n * @param relayUrl - The URL of the relay to remove.\n * @returns {boolean} True if the relay was removed, false if it was not found.\n */\n removeRelay(relayUrl) {\n const relay = this.relays.get(relayUrl);\n if (relay) {\n relay.disconnect();\n this.relays.delete(relayUrl);\n this.autoConnectRelays.delete(relayUrl);\n this.emit(\"relay:disconnect\", relay);\n return true;\n }\n const existingTimer = this.temporaryRelayTimers.get(relayUrl);\n if (existingTimer) {\n clearTimeout(existingTimer);\n this.temporaryRelayTimers.delete(relayUrl);\n }\n return false;\n }\n /**\n * Checks whether a relay is already connected in the pool.\n */\n isRelayConnected(url) {\n const normalizedUrl = normalizeRelayUrl(url);\n const relay = this.relays.get(normalizedUrl);\n if (!relay) return false;\n return relay.status === 5 /* CONNECTED */;\n }\n /**\n * Fetches a relay from the pool, or creates a new one if it does not exist.\n *\n * New relays will be attempted to be connected.\n */\n getRelay(url, connect = true, temporary = false, filters) {\n let relay = this.relays.get(normalizeRelayUrl(url));\n if (!relay) {\n relay = new NDKRelay(url, void 0, this.ndk);\n relay.connectivity.netDebug = this.ndk.netDebug;\n if (temporary) {\n this.useTemporaryRelay(relay, 3e4, filters);\n } else {\n this.addRelay(relay, connect);\n }\n }\n return relay;\n }\n handleRelayConnect(relayUrl) {\n const relay = this.relays.get(relayUrl);\n if (!relay) {\n console.error(\"NDK BUG: relay not found in pool\", { relayUrl });\n return;\n }\n this.emit(\"relay:connect\", relay);\n if (this.stats().connected === this.relays.size) {\n this.emit(\"connect\");\n }\n }\n handleRelayReady(relay) {\n this.emit(\"relay:ready\", relay);\n }\n /**\n * Attempts to establish a connection to each relay in the pool.\n *\n * @async\n * @param {number} [timeoutMs] - Optional timeout in milliseconds for each connection attempt.\n * @returns {Promise<void>} A promise that resolves when all connection attempts have completed.\n * @throws {Error} If any of the connection attempts result in an error or timeout.\n */\n async connect(timeoutMs) {\n this.status = \"active\";\n this.debug(`Connecting to ${this.relays.size} relays${timeoutMs ? `, timeout ${timeoutMs}ms` : \"\"}...`);\n const relaysToConnect = Array.from(this.autoConnectRelays.keys()).map((url) => this.relays.get(url)).filter((relay) => !!relay);\n for (const relay of relaysToConnect) {\n if (relay.status !== 5 /* CONNECTED */ && relay.status !== 4 /* CONNECTING */) {\n this.emit(\"relay:connecting\", relay);\n relay.connect().catch((e) => {\n this.debug(`Failed to connect to relay ${relay.url}: ${e ?? \"No reason specified\"}`);\n });\n }\n }\n const allConnected = () => relaysToConnect.every((r) => r.status === 5 /* CONNECTED */);\n const allConnectedPromise = new Promise((resolve) => {\n if (allConnected()) {\n resolve();\n return;\n }\n const listeners = [];\n for (const relay of relaysToConnect) {\n const handler = () => {\n if (allConnected()) {\n for (let i = 0; i < relaysToConnect.length; i++) {\n relaysToConnect[i].off(\"connect\", listeners[i]);\n }\n resolve();\n }\n };\n listeners.push(handler);\n relay.on(\"connect\", handler);\n }\n });\n const timeoutPromise = typeof timeoutMs === \"number\" ? new Promise((resolve) => setTimeout(resolve, timeoutMs)) : new Promise(() => {\n });\n await Promise.race([allConnectedPromise, timeoutPromise]);\n }\n checkOnFlappingRelays() {\n const flappingRelaysCount = this.flappingRelays.size;\n const totalRelays = this.relays.size;\n if (flappingRelaysCount / totalRelays >= 0.8) {\n for (const relayUrl of this.flappingRelays) {\n this.backoffTimes.set(relayUrl, 0);\n }\n }\n }\n /**\n * Records when a relay disconnects to detect system-wide events\n */\n recordDisconnection(relay) {\n const now = Date.now();\n this.disconnectionTimes.set(relay.url, now);\n for (const [url, time] of this.disconnectionTimes.entries()) {\n if (now - time > 1e4) {\n this.disconnectionTimes.delete(url);\n }\n }\n this.checkForSystemWideDisconnection();\n }\n /**\n * Checks if multiple relays disconnected simultaneously, indicating a system event\n */\n checkForSystemWideDisconnection() {\n const now = Date.now();\n const recentDisconnections = [];\n for (const time of this.disconnectionTimes.values()) {\n if (now - time < 5e3) {\n recentDisconnections.push(time);\n }\n }\n if (recentDisconnections.length > this.relays.size / 2 && this.relays.size > 1) {\n this.debug(\n `System-wide disconnection detected: ${recentDisconnections.length}/${this.relays.size} relays disconnected`\n );\n this.handleSystemWideReconnection();\n }\n }\n /**\n * Handles system-wide reconnection (e.g., after sleep/wake or network change)\n */\n handleSystemWideReconnection() {\n this.debug(\"Initiating system-wide reconnection with reset backoff\");\n if (this.systemEventDetector) {\n clearTimeout(this.systemEventDetector);\n }\n this.systemEventDetector = setTimeout(() => {\n this.systemEventDetector = void 0;\n }, 1e4);\n for (const relay of this.relays.values()) {\n if (relay.connectivity) {\n relay.connectivity.resetReconnectionState();\n if (relay.status !== 5 /* CONNECTED */ && relay.status !== 4 /* CONNECTING */) {\n relay.connect().catch((e) => {\n this.debug(`Failed to reconnect relay ${relay.url} after system event: ${e}`);\n });\n }\n }\n }\n this.disconnectionTimes.clear();\n }\n handleFlapping(relay) {\n this.debug(`Relay ${relay.url} is flapping`);\n let currentBackoff = this.backoffTimes.get(relay.url) || 5e3;\n currentBackoff = currentBackoff * 2;\n this.backoffTimes.set(relay.url, currentBackoff);\n this.debug(`Backoff time for ${relay.url} is ${currentBackoff}ms`);\n setTimeout(() => {\n this.debug(`Attempting to reconnect to ${relay.url}`);\n this.emit(\"relay:connecting\", relay);\n relay.connect();\n this.checkOnFlappingRelays();\n }, currentBackoff);\n relay.disconnect();\n this.emit(\"flapping\", relay);\n }\n size() {\n return this.relays.size;\n }\n /**\n * Returns the status of each relay in the pool.\n * @returns {NDKPoolStats} An object containing the number of relays in each status.\n */\n stats() {\n const stats = {\n total: 0,\n connected: 0,\n disconnected: 0,\n connecting: 0\n };\n for (const relay of this.relays.values()) {\n stats.total++;\n if (relay.status === 5 /* CONNECTED */) {\n stats.connected++;\n } else if (relay.status === 1 /* DISCONNECTED */) {\n stats.disconnected++;\n } else if (relay.status === 4 /* CONNECTING */) {\n stats.connecting++;\n }\n }\n return stats;\n }\n connectedRelays() {\n return Array.from(this.relays.values()).filter((relay) => relay.status >= 5 /* CONNECTED */);\n }\n permanentAndConnectedRelays() {\n return Array.from(this.relays.values()).filter(\n (relay) => relay.status >= 5 /* CONNECTED */ && !this.temporaryRelayTimers.has(relay.url)\n );\n }\n /**\n * Get a list of all relay urls in the pool.\n */\n urls() {\n return Array.from(this.relays.keys());\n }\n};\n\n// src/user/index.ts\nimport { nip19 as nip196 } from \"nostr-tools\";\n\n// src/events/kinds/nutzap/mint-list.ts\nvar NDKCashuMintList = class _NDKCashuMintList extends NDKEvent {\n static kind = 10019 /* CashuMintList */;\n static kinds = [10019 /* CashuMintList */];\n _p2pk;\n constructor(ndk, event) {\n super(ndk, event);\n this.kind ??= 10019 /* CashuMintList */;\n }\n static from(event) {\n return new _NDKCashuMintList(event.ndk, event);\n }\n set relays(urls) {\n this.tags = this.tags.filter((t) => t[0] !== \"relay\");\n for (const url of urls) {\n this.tags.push([\"relay\", url]);\n }\n }\n get relays() {\n const r = [];\n for (const tag of this.tags) {\n if (tag[0] === \"relay\") {\n r.push(tag[1]);\n }\n }\n return r;\n }\n set mints(urls) {\n this.tags = this.tags.filter((t) => t[0] !== \"mint\");\n for (const url of urls) {\n this.tags.push([\"mint\", url]);\n }\n }\n get mints() {\n const r = [];\n for (const tag of this.tags) {\n if (tag[0] === \"mint\") {\n r.push(tag[1]);\n }\n }\n return Array.from(new Set(r));\n }\n get p2pk() {\n if (this._p2pk) {\n return this._p2pk;\n }\n this._p2pk = this.tagValue(\"pubkey\") ?? this.pubkey;\n return this._p2pk;\n }\n set p2pk(pubkey) {\n this._p2pk = pubkey;\n this.removeTag(\"pubkey\");\n if (pubkey) {\n this.tags.push([\"pubkey\", pubkey]);\n }\n }\n get relaySet() {\n return NDKRelaySet.fromRelayUrls(this.relays, this.ndk);\n }\n};\n\n// src/subscription/index.ts\nimport { EventEmitter as EventEmitter4 } from \"tseep\";\n\n// src/events/kinds/article.ts\nvar NDKArticle = class _NDKArticle extends NDKEvent {\n static kind = 30023 /* Article */;\n static kinds = [30023 /* Article */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 30023 /* Article */;\n }\n /**\n * Creates a NDKArticle from an existing NDKEvent.\n *\n * @param event NDKEvent to create the NDKArticle from.\n * @returns NDKArticle\n */\n static from(event) {\n return new _NDKArticle(event.ndk, event);\n }\n /**\n * Getter for the article title.\n *\n * @returns {string | undefined} - The article title if available, otherwise undefined.\n */\n get title() {\n return this.tagValue(\"title\");\n }\n /**\n * Setter for the article title.\n *\n * @param {string | undefined} title - The title to set for the article.\n */\n set title(title) {\n this.removeTag(\"title\");\n if (title) this.tags.push([\"title\", title]);\n }\n /**\n * Getter for the article image.\n *\n * @returns {string | undefined} - The article image if available, otherwise undefined.\n */\n get image() {\n return this.tagValue(\"image\");\n }\n /**\n * Setter for the article image.\n *\n * @param {string | undefined} image - The image to set for the article.\n */\n set image(image) {\n this.removeTag(\"image\");\n if (image) this.tags.push([\"image\", image]);\n }\n get summary() {\n return this.tagValue(\"summary\");\n }\n set summary(summary) {\n this.removeTag(\"summary\");\n if (summary) this.tags.push([\"summary\", summary]);\n }\n /**\n * Getter for the article's publication timestamp.\n *\n * @returns {number | undefined} - The Unix timestamp of when the article was published or undefined.\n */\n get published_at() {\n const tag = this.tagValue(\"published_at\");\n if (tag) {\n let val = Number.parseInt(tag);\n if (val > 1e12) {\n val = Math.floor(val / 1e3);\n }\n return val;\n }\n return void 0;\n }\n /**\n * Setter for the article's publication timestamp.\n *\n * @param {number | undefined} timestamp - The Unix timestamp to set for the article's publication date.\n */\n set published_at(timestamp) {\n this.removeTag(\"published_at\");\n if (timestamp !== void 0) {\n this.tags.push([\"published_at\", timestamp.toString()]);\n }\n }\n /**\n * Generates content tags for the article.\n *\n * This method first checks and sets the publication date if not available,\n * and then generates content tags based on the base NDKEvent class.\n *\n * @returns {ContentTag} - The generated content tags.\n */\n async generateTags() {\n super.generateTags();\n if (!this.published_at) {\n this.published_at = this.created_at;\n }\n return super.generateTags();\n }\n /**\n * Getter for the article's URL.\n *\n * @returns {string | undefined} - The article's URL if available, otherwise undefined.\n */\n get url() {\n return this.tagValue(\"url\");\n }\n /**\n * Setter for the article's URL.\n *\n * @param {string | undefined} url - The URL to set for the article.\n */\n set url(url) {\n if (url) {\n this.tags.push([\"url\", url]);\n } else {\n this.removeTag(\"url\");\n }\n }\n};\n\n// src/events/kinds/highlight.ts\nimport { nip19 as nip193 } from \"nostr-tools\";\nvar NDKHighlight = class _NDKHighlight extends NDKEvent {\n _article;\n static kind = 9802 /* Highlight */;\n static kinds = [9802 /* Highlight */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 9802 /* Highlight */;\n }\n static from(event) {\n return new _NDKHighlight(event.ndk, event);\n }\n get url() {\n return this.tagValue(\"r\");\n }\n /**\n * Context tag.\n */\n set context(context) {\n if (context === void 0) {\n this.tags = this.tags.filter(([tag, _value]) => tag !== \"context\");\n } else {\n this.tags = this.tags.filter(([tag, _value]) => tag !== \"context\");\n this.tags.push([\"context\", context]);\n }\n }\n get context() {\n return this.tags.find(([tag, _value]) => tag === \"context\")?.[1] ?? void 0;\n }\n /**\n * Will return the article URL or NDKEvent if they have already been\n * set (it won't attempt to load remote events)\n */\n get article() {\n return this._article;\n }\n /**\n * Article the highlight is coming from.\n *\n * @param article Article URL or NDKEvent.\n */\n set article(article) {\n this._article = article;\n if (typeof article === \"string\") {\n this.tags.push([\"r\", article]);\n } else {\n this.tag(article);\n }\n }\n getArticleTag() {\n return this.getMatchingTags(\"a\")[0] || this.getMatchingTags(\"e\")[0] || this.getMatchingTags(\"r\")[0];\n }\n async getArticle() {\n if (this._article !== void 0) return this._article;\n let taggedBech32;\n const articleTag = this.getArticleTag();\n if (!articleTag) return void 0;\n switch (articleTag[0]) {\n case \"a\": {\n const [kind, pubkey, identifier] = articleTag[1].split(\":\");\n taggedBech32 = nip193.naddrEncode({\n kind: Number.parseInt(kind),\n pubkey,\n identifier\n });\n break;\n }\n case \"e\":\n taggedBech32 = nip193.noteEncode(articleTag[1]);\n break;\n case \"r\":\n this._article = articleTag[1];\n break;\n }\n if (taggedBech32) {\n let a = await this.ndk?.fetchEvent(taggedBech32);\n if (a) {\n if (a.kind === 30023 /* Article */) {\n a = NDKArticle.from(a);\n }\n this._article = a;\n }\n }\n return this._article;\n }\n};\n\n// src/utils/imeta.ts\nfunction mapImetaTag(tag) {\n const data = {};\n if (tag.length === 2) {\n const parts = tag[1].split(\" \");\n for (let i = 0; i < parts.length; i += 2) {\n const key = parts[i];\n const value = parts[i + 1];\n if (key === \"fallback\") {\n if (!data.fallback) data.fallback = [];\n data.fallback.push(value);\n } else {\n data[key] = value;\n }\n }\n return data;\n }\n const tags = tag.slice(1);\n for (const val of tags) {\n const parts = val.split(\" \");\n const key = parts[0];\n const value = parts.slice(1).join(\" \");\n if (key === \"fallback\") {\n if (!data.fallback) data.fallback = [];\n data.fallback.push(value);\n } else {\n data[key] = value;\n }\n }\n return data;\n}\nfunction imetaTagToTag(imeta) {\n const tag = [\"imeta\"];\n for (const [key, value] of Object.entries(imeta)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n tag.push(`${key} ${v}`);\n }\n } else if (value) {\n tag.push(`${key} ${value}`);\n }\n }\n return tag;\n}\n\n// src/events/kinds/image.ts\nvar NDKImage = class _NDKImage extends NDKEvent {\n static kind = 20 /* Image */;\n static kinds = [20 /* Image */];\n _imetas;\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 20 /* Image */;\n }\n /**\n * Creates a NDKImage from an existing NDKEvent.\n *\n * @param event NDKEvent to create the NDKImage from.\n * @returns NDKImage\n */\n static from(event) {\n return new _NDKImage(event.ndk, event.rawEvent());\n }\n get isValid() {\n return this.imetas.length > 0;\n }\n get imetas() {\n if (this._imetas) return this._imetas;\n this._imetas = this.tags.filter((tag) => tag[0] === \"imeta\").map(mapImetaTag).filter((imeta) => !!imeta.url);\n return this._imetas;\n }\n set imetas(tags) {\n this._imetas = tags;\n this.tags = this.tags.filter((tag) => tag[0] !== \"imeta\");\n this.tags.push(...tags.map(imetaTagToTag));\n }\n};\n\n// src/events/kinds/lists/index.ts\nvar NDKList = class _NDKList extends NDKEvent {\n _encryptedTags;\n static kinds = [\n 30001 /* CategorizedBookmarkList */,\n 10004 /* CommunityList */,\n 10050 /* DirectMessageReceiveRelayList */,\n 10030 /* EmojiList */,\n 10015 /* InterestList */,\n 10001 /* PinList */,\n 10002 /* RelayList */,\n 10007 /* SearchRelayList */,\n 10006 /* BlockRelayList */,\n 10003 /* BookmarkList */\n ];\n /**\n * Stores the number of bytes the content was before decryption\n * to expire the cache when the content changes.\n */\n encryptedTagsLength;\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 30001 /* CategorizedBookmarkList */;\n }\n /**\n * Wrap a NDKEvent into a NDKList\n */\n static from(ndkEvent) {\n return new _NDKList(ndkEvent.ndk, ndkEvent);\n }\n /**\n * Returns the title of the list. Falls back on fetching the name tag value.\n */\n get title() {\n const titleTag = this.tagValue(\"title\") || this.tagValue(\"name\");\n if (titleTag) return titleTag;\n if (this.kind === 3 /* Contacts */) {\n return \"Contacts\";\n }\n if (this.kind === 1e4 /* MuteList */) {\n return \"Mute\";\n }\n if (this.kind === 10001 /* PinList */) {\n return \"Pinned Notes\";\n }\n if (this.kind === 10002 /* RelayList */) {\n return \"Relay Metadata\";\n }\n if (this.kind === 10003 /* BookmarkList */) {\n return \"Bookmarks\";\n }\n if (this.kind === 10004 /* CommunityList */) {\n return \"Communities\";\n }\n if (this.kind === 10005 /* PublicChatList */) {\n return \"Public Chats\";\n }\n if (this.kind === 10006 /* BlockRelayList */) {\n return \"Blocked Relays\";\n }\n if (this.kind === 10007 /* SearchRelayList */) {\n return \"Search Relays\";\n }\n if (this.kind === 10050 /* DirectMessageReceiveRelayList */) {\n return \"Direct Message Receive Relays\";\n }\n if (this.kind === 10015 /* InterestList */) {\n return \"Interests\";\n }\n if (this.kind === 10030 /* EmojiList */) {\n return \"Emojis\";\n }\n return this.tagValue(\"d\");\n }\n /**\n * Sets the title of the list.\n */\n set title(title) {\n this.removeTag([\"title\", \"name\"]);\n if (title) this.tags.push([\"title\", title]);\n }\n /**\n * Returns the name of the list.\n * @deprecated Please use \"title\" instead.\n */\n get name() {\n return this.title;\n }\n /**\n * Sets the name of the list.\n * @deprecated Please use \"title\" instead. This method will use the `title` tag instead.\n */\n set name(name) {\n this.title = name;\n }\n /**\n * Returns the description of the list.\n */\n get description() {\n return this.tagValue(\"description\");\n }\n /**\n * Sets the description of the list.\n */\n set description(name) {\n this.removeTag(\"description\");\n if (name) this.tags.push([\"description\", name]);\n }\n /**\n * Returns the image of the list.\n */\n get image() {\n return this.tagValue(\"image\");\n }\n /**\n * Sets the image of the list.\n */\n set image(name) {\n this.removeTag(\"image\");\n if (name) this.tags.push([\"image\", name]);\n }\n isEncryptedTagsCacheValid() {\n return !!(this._encryptedTags && this.encryptedTagsLength === this.content.length);\n }\n /**\n * Returns the decrypted content of the list.\n */\n async encryptedTags(useCache = true) {\n if (useCache && this.isEncryptedTagsCacheValid()) return this._encryptedTags;\n if (!this.ndk) throw new Error(\"NDK instance not set\");\n if (!this.ndk.signer) throw new Error(\"NDK signer not set\");\n const user = await this.ndk.signer.user();\n try {\n if (this.content.length > 0) {\n try {\n const decryptedContent = await this.ndk.signer.decrypt(user, this.content);\n const a = JSON.parse(decryptedContent);\n if (a?.[0]) {\n this.encryptedTagsLength = this.content.length;\n return this._encryptedTags = a;\n }\n this.encryptedTagsLength = this.content.length;\n return this._encryptedTags = [];\n } catch (_e) {\n }\n }\n } catch (_e) {\n }\n return [];\n }\n /**\n * This method can be overriden to validate that a tag is valid for this list.\n *\n * (i.e. the NDKPersonList can validate that items are NDKUser instances)\n */\n validateTag(_tagValue) {\n return true;\n }\n getItems(type) {\n return this.tags.filter((tag) => tag[0] === type);\n }\n /**\n * Returns the unecrypted items in this list.\n */\n get items() {\n return this.tags.filter((t) => {\n return ![\n \"d\",\n \"L\",\n \"l\",\n \"title\",\n \"name\",\n \"description\",\n \"published_at\",\n \"summary\",\n \"image\",\n \"thumb\",\n \"alt\",\n \"expiration\",\n \"subject\",\n \"client\"\n ].includes(t[0]);\n });\n }\n /**\n * Adds a new item to the list.\n * @param relay Relay to add\n * @param mark Optional mark to add to the item\n * @param encrypted Whether to encrypt the item\n * @param position Where to add the item in the list (top or bottom)\n */\n async addItem(item, mark = void 0, encrypted = false, position = \"bottom\") {\n if (!this.ndk) throw new Error(\"NDK instance not set\");\n if (!this.ndk.signer) throw new Error(\"NDK signer not set\");\n let tags;\n if (item instanceof NDKEvent) {\n tags = [item.tagReference(mark)];\n } else if (item instanceof NDKUser) {\n tags = item.referenceTags();\n } else if (item instanceof NDKRelay) {\n tags = item.referenceTags();\n } else if (Array.isArray(item)) {\n tags = [item];\n } else {\n throw new Error(\"Invalid object type\");\n }\n if (mark) tags[0].push(mark);\n if (encrypted) {\n const user = await this.ndk.signer.user();\n const currentList = await this.encryptedTags();\n if (position === \"top\") currentList.unshift(...tags);\n else currentList.push(...tags);\n this._encryptedTags = currentList;\n this.encryptedTagsLength = this.content.length;\n this.content = JSON.stringify(currentList);\n await this.encrypt(user);\n } else {\n if (position === \"top\") this.tags.unshift(...tags);\n else this.tags.push(...tags);\n }\n this.created_at = Math.floor(Date.now() / 1e3);\n this.emit(\"change\");\n }\n /**\n * Removes an item from the list from both the encrypted and unencrypted lists.\n * @param value value of item to remove from the list\n * @param publish whether to publish the change\n * @returns\n */\n async removeItemByValue(value, publish = true) {\n if (!this.ndk) throw new Error(\"NDK instance not set\");\n if (!this.ndk.signer) throw new Error(\"NDK signer not set\");\n const index = this.tags.findIndex((tag) => tag[1] === value);\n if (index >= 0) {\n this.tags.splice(index, 1);\n }\n const user = await this.ndk.signer.user();\n const encryptedTags = await this.encryptedTags();\n const encryptedIndex = encryptedTags.findIndex((tag) => tag[1] === value);\n if (encryptedIndex >= 0) {\n encryptedTags.splice(encryptedIndex, 1);\n this._encryptedTags = encryptedTags;\n this.encryptedTagsLength = this.content.length;\n this.content = JSON.stringify(encryptedTags);\n await this.encrypt(user);\n }\n if (publish) {\n return this.publishReplaceable();\n }\n this.created_at = Math.floor(Date.now() / 1e3);\n this.emit(\"change\");\n }\n /**\n * Removes an item from the list.\n *\n * @param index The index of the item to remove.\n * @param encrypted Whether to remove from the encrypted list or not.\n */\n async removeItem(index, encrypted) {\n if (!this.ndk) throw new Error(\"NDK instance not set\");\n if (!this.ndk.signer) throw new Error(\"NDK signer not set\");\n if (encrypted) {\n const user = await this.ndk.signer.user();\n const currentList = await this.encryptedTags();\n currentList.splice(index, 1);\n this._encryptedTags = currentList;\n this.encryptedTagsLength = this.content.length;\n this.content = JSON.stringify(currentList);\n await this.encrypt(user);\n } else {\n this.tags.splice(index, 1);\n }\n this.created_at = Math.floor(Date.now() / 1e3);\n this.emit(\"change\");\n return this;\n }\n has(item) {\n return this.items.some((tag) => tag[1] === item);\n }\n /**\n * Creates a filter that will result in fetching\n * the items of this list\n * @example\n * const list = new NDKList(...);\n * const filters = list.filterForItems();\n * const events = await ndk.fetchEvents(filters);\n */\n filterForItems() {\n const ids = /* @__PURE__ */ new Set();\n const nip33Queries = /* @__PURE__ */ new Map();\n const filters = [];\n for (const tag of this.items) {\n if (tag[0] === \"e\" && tag[1]) {\n ids.add(tag[1]);\n } else if (tag[0] === \"a\" && tag[1]) {\n const [kind, pubkey, dTag] = tag[1].split(\":\");\n if (!kind || !pubkey) continue;\n const key = `${kind}:${pubkey}`;\n const item = nip33Queries.get(key) || [];\n item.push(dTag || \"\");\n nip33Queries.set(key, item);\n }\n }\n if (ids.size > 0) {\n filters.push({ ids: Array.from(ids) });\n }\n if (nip33Queries.size > 0) {\n for (const [key, values] of nip33Queries.entries()) {\n const [kind, pubkey] = key.split(\":\");\n filters.push({\n kinds: [Number.parseInt(kind)],\n authors: [pubkey],\n \"#d\": values\n });\n }\n }\n return filters;\n }\n};\nvar lists_default = NDKList;\n\n// src/events/kinds/nutzap/index.ts\nimport debug3 from \"debug\";\nvar NDKNutzap = class _NDKNutzap extends NDKEvent {\n debug;\n _proofs = [];\n static kind = 9321 /* Nutzap */;\n static kinds = [_NDKNutzap.kind];\n constructor(ndk, event) {\n super(ndk, event);\n this.kind ??= 9321 /* Nutzap */;\n this.debug = ndk?.debug.extend(\"nutzap\") ?? debug3(\"ndk:nutzap\");\n if (!this.alt) this.alt = \"This is a nutzap\";\n try {\n const proofTags = this.getMatchingTags(\"proof\");\n if (proofTags.length) {\n this._proofs = proofTags.map((tag) => JSON.parse(tag[1]));\n } else {\n this._proofs = JSON.parse(this.content);\n }\n } catch {\n return;\n }\n }\n static from(event) {\n const e = new _NDKNutzap(event.ndk, event);\n if (!e._proofs || !e._proofs.length) return;\n return e;\n }\n set comment(comment) {\n this.content = comment ?? \"\";\n }\n get comment() {\n const c = this.tagValue(\"comment\");\n if (c) return c;\n return this.content;\n }\n set proofs(proofs) {\n this._proofs = proofs;\n this.tags = this.tags.filter((tag) => tag[0] !== \"proof\");\n for (const proof of proofs) {\n this.tags.push([\"proof\", JSON.stringify(proof)]);\n }\n }\n get proofs() {\n return this._proofs;\n }\n get rawP2pk() {\n const firstProof = this.proofs[0];\n try {\n const secret = JSON.parse(firstProof.secret);\n let payload;\n if (typeof secret === \"string\") {\n payload = JSON.parse(secret);\n this.debug(\"stringified payload\", firstProof.secret);\n } else if (typeof secret === \"object\") {\n payload = secret;\n }\n if (Array.isArray(payload) && payload[0] === \"P2PK\" && payload.length > 1 && typeof payload[1] === \"object\" && payload[1] !== null) {\n return payload[1].data;\n }\n if (typeof payload === \"object\" && payload !== null && typeof payload[1]?.data === \"string\") {\n return payload[1].data;\n }\n } catch (e) {\n this.debug(\"error parsing p2pk pubkey\", e, this.proofs[0]);\n }\n return void 0;\n }\n /**\n * Gets the p2pk pubkey that is embedded in the first proof.\n *\n * Note that this returns a nostr pubkey, not a cashu pubkey (no \"02\" prefix)\n */\n get p2pk() {\n const rawP2pk = this.rawP2pk;\n if (!rawP2pk) return;\n return rawP2pk.startsWith(\"02\") ? rawP2pk.slice(2) : rawP2pk;\n }\n /**\n * Get the mint where this nutzap proofs exist\n */\n get mint() {\n return this.tagValue(\"u\");\n }\n set mint(value) {\n this.replaceTag([\"u\", value]);\n }\n get unit() {\n let _unit = this.tagValue(\"unit\") ?? \"sat\";\n if (_unit?.startsWith(\"msat\")) _unit = \"sat\";\n return _unit;\n }\n set unit(value) {\n this.removeTag(\"unit\");\n if (value?.startsWith(\"msat\")) throw new Error(\"msat is not allowed, use sat denomination instead\");\n if (value) this.tag([\"unit\", value]);\n }\n get amount() {\n const amount = this.proofs.reduce((total, proof) => total + proof.amount, 0);\n return amount;\n }\n sender = this.author;\n /**\n * Set the target of the nutzap\n * @param target The target of the nutzap (a user or an event)\n */\n set target(target) {\n this.tags = this.tags.filter((t) => t[0] !== \"p\");\n if (target instanceof NDKEvent) {\n this.tags.push(target.tagReference());\n }\n }\n set recipientPubkey(pubkey) {\n this.removeTag(\"p\");\n this.tag([\"p\", pubkey]);\n }\n get recipientPubkey() {\n return this.tagValue(\"p\");\n }\n get recipient() {\n const pubkey = this.recipientPubkey;\n if (this.ndk) return this.ndk.getUser({ pubkey });\n return new NDKUser({ pubkey });\n }\n async toNostrEvent() {\n if (this.unit === \"msat\") {\n this.unit = \"sat\";\n }\n this.removeTag(\"amount\");\n this.tags.push([\"amount\", this.amount.toString()]);\n const event = await super.toNostrEvent();\n event.content = this.comment;\n return event;\n }\n /**\n * Validates that the nutzap conforms to NIP-61\n */\n get isValid() {\n let eTagCount = 0;\n let pTagCount = 0;\n let mintTagCount = 0;\n for (const tag of this.tags) {\n if (tag[0] === \"e\") eTagCount++;\n if (tag[0] === \"p\") pTagCount++;\n if (tag[0] === \"u\") mintTagCount++;\n }\n return (\n // exactly one recipient and mint\n pTagCount === 1 && mintTagCount === 1 && // must have at most one e tag\n eTagCount <= 1 && // must have at least one proof\n this.proofs.length > 0\n );\n }\n};\nfunction proofP2pk(proof) {\n try {\n const secret = JSON.parse(proof.secret);\n let payload = {};\n if (typeof secret === \"string\") {\n payload = JSON.parse(secret);\n } else if (typeof secret === \"object\") {\n payload = secret;\n }\n const isP2PKLocked = payload[0] === \"P2PK\" && payload[1]?.data;\n if (isP2PKLocked) {\n return payload[1].data;\n }\n } catch (e) {\n console.error(\"error parsing p2pk pubkey\", e, proof);\n }\n}\nfunction proofP2pkNostr(proof) {\n const p2pk = proofP2pk(proof);\n if (!p2pk) return;\n if (p2pk.startsWith(\"02\") && p2pk.length === 66) return p2pk.slice(2);\n return p2pk;\n}\nfunction cashuPubkeyToNostrPubkey(cashuPubkey) {\n if (cashuPubkey.startsWith(\"02\") && cashuPubkey.length === 66) return cashuPubkey.slice(2);\n return void 0;\n}\n\n// src/events/kinds/simple-group/member-list.ts\nvar NDKSimpleGroupMemberList = class _NDKSimpleGroupMemberList extends NDKEvent {\n relaySet;\n memberSet = /* @__PURE__ */ new Set();\n static kind = 39002 /* GroupMembers */;\n static kinds = [39002 /* GroupMembers */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 39002 /* GroupMembers */;\n this.memberSet = new Set(this.members);\n }\n static from(event) {\n return new _NDKSimpleGroupMemberList(event.ndk, event);\n }\n get members() {\n return this.getMatchingTags(\"p\").map((tag) => tag[1]);\n }\n hasMember(member) {\n return this.memberSet.has(member);\n }\n async publish(relaySet, timeoutMs, requiredRelayCount) {\n relaySet ??= this.relaySet;\n return super.publishReplaceable(relaySet, timeoutMs, requiredRelayCount);\n }\n};\n\n// src/events/kinds/simple-group/metadata.ts\nvar NDKSimpleGroupMetadata = class _NDKSimpleGroupMetadata extends NDKEvent {\n static kind = 39e3 /* GroupMetadata */;\n static kinds = [39e3 /* GroupMetadata */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 39e3 /* GroupMetadata */;\n }\n static from(event) {\n return new _NDKSimpleGroupMetadata(event.ndk, event);\n }\n get name() {\n return this.tagValue(\"name\");\n }\n get picture() {\n return this.tagValue(\"picture\");\n }\n get about() {\n return this.tagValue(\"about\");\n }\n get scope() {\n if (this.getMatchingTags(\"public\").length > 0) return \"public\";\n if (this.getMatchingTags(\"public\").length > 0) return \"private\";\n return void 0;\n }\n set scope(scope) {\n this.removeTag(\"public\");\n this.removeTag(\"private\");\n if (scope === \"public\") {\n this.tags.push([\"public\", \"\"]);\n } else if (scope === \"private\") {\n this.tags.push([\"private\", \"\"]);\n }\n }\n get access() {\n if (this.getMatchingTags(\"open\").length > 0) return \"open\";\n if (this.getMatchingTags(\"closed\").length > 0) return \"closed\";\n return void 0;\n }\n set access(access) {\n this.removeTag(\"open\");\n this.removeTag(\"closed\");\n if (access === \"open\") {\n this.tags.push([\"open\", \"\"]);\n } else if (access === \"closed\") {\n this.tags.push([\"closed\", \"\"]);\n }\n }\n};\n\n// src/events/kinds/story.ts\nvar NDKStoryStickerType = /* @__PURE__ */ ((NDKStoryStickerType2) => {\n NDKStoryStickerType2[\"Pubkey\"] = \"pubkey\";\n NDKStoryStickerType2[\"Event\"] = \"event\";\n NDKStoryStickerType2[\"Prompt\"] = \"prompt\";\n NDKStoryStickerType2[\"Text\"] = \"text\";\n NDKStoryStickerType2[\"Countdown\"] = \"countdown\";\n return NDKStoryStickerType2;\n})(NDKStoryStickerType || {});\nfunction strToPosition(positionStr) {\n const [x, y] = positionStr.split(\",\").map(Number);\n return { x, y };\n}\nfunction strToDimension(dimensionStr) {\n const [width, height] = dimensionStr.split(\"x\").map(Number);\n return { width, height };\n}\nvar NDKStorySticker = class _NDKStorySticker {\n static Text = \"text\" /* Text */;\n static Pubkey = \"pubkey\" /* Pubkey */;\n static Event = \"event\" /* Event */;\n static Prompt = \"prompt\" /* Prompt */;\n static Countdown = \"countdown\" /* Countdown */;\n type;\n value;\n position;\n dimension;\n properties;\n constructor(arg) {\n if (Array.isArray(arg)) {\n const tag = arg;\n if (tag[0] !== \"sticker\" || tag.length < 5) {\n throw new Error(\"Invalid sticker tag\");\n }\n this.type = tag[1];\n this.value = tag[2];\n this.position = strToPosition(tag[3]);\n this.dimension = strToDimension(tag[4]);\n const props = {};\n for (let i = 5; i < tag.length; i++) {\n const [key, ...rest] = tag[i].split(\" \");\n props[key] = rest.join(\" \");\n }\n if (Object.keys(props).length > 0) {\n this.properties = props;\n }\n } else {\n this.type = arg;\n this.value = void 0;\n this.position = { x: 0, y: 0 };\n this.dimension = { width: 0, height: 0 };\n }\n }\n static fromTag(tag) {\n try {\n return new _NDKStorySticker(tag);\n } catch {\n return null;\n }\n }\n get style() {\n return this.properties?.style;\n }\n set style(style) {\n if (style) this.properties = { ...this.properties, style };\n else delete this.properties?.style;\n }\n get rotation() {\n return this.properties?.rot ? Number.parseFloat(this.properties.rot) : void 0;\n }\n set rotation(rotation) {\n if (rotation !== void 0) {\n this.properties = { ...this.properties, rot: rotation.toString() };\n } else {\n delete this.properties?.rot;\n }\n }\n /**\n * Checks if the sticker is valid.\n *\n * @returns {boolean} - True if the sticker is valid, false otherwise.\n */\n get isValid() {\n return this.hasValidDimensions() && this.hasValidPosition();\n }\n hasValidDimensions = () => {\n return typeof this.dimension.width === \"number\" && typeof this.dimension.height === \"number\" && !Number.isNaN(this.dimension.width) && !Number.isNaN(this.dimension.height);\n };\n hasValidPosition = () => {\n return typeof this.position.x === \"number\" && typeof this.position.y === \"number\" && !Number.isNaN(this.position.x) && !Number.isNaN(this.position.y);\n };\n toTag() {\n if (!this.isValid) {\n const errors = [\n !this.hasValidDimensions() ? \"dimensions is invalid\" : void 0,\n !this.hasValidPosition() ? \"position is invalid\" : void 0\n ].filter(Boolean);\n throw new Error(`Invalid sticker: ${errors.join(\", \")}`);\n }\n let value;\n switch (this.type) {\n case \"event\" /* Event */:\n value = this.value.tagId();\n break;\n case \"pubkey\" /* Pubkey */:\n value = this.value.pubkey;\n break;\n default:\n value = this.value;\n }\n const tag = [\"sticker\", this.type, value, coordinates(this.position), dimension(this.dimension)];\n if (this.properties) {\n for (const [key, propValue] of Object.entries(this.properties)) {\n tag.push(`${key} ${propValue}`);\n }\n }\n return tag;\n }\n};\nvar NDKStory = class _NDKStory extends NDKEvent {\n static kind = 23 /* Story */;\n static kinds = [23 /* Story */];\n _imeta;\n _dimensions;\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 23 /* Story */;\n if (rawEvent) {\n for (const tag of rawEvent.tags) {\n switch (tag[0]) {\n case \"imeta\":\n this._imeta = mapImetaTag(tag);\n break;\n case \"dim\":\n this.dimensions = strToDimension(tag[1]);\n break;\n }\n }\n }\n }\n /**\n * Creates a NDKStory from an existing NDKEvent.\n *\n * @param event NDKEvent to create the NDKStory from.\n * @returns NDKStory\n */\n static from(event) {\n return new _NDKStory(event.ndk, event);\n }\n /**\n * Checks if the story is valid (has exactly one imeta tag).\n */\n get isValid() {\n return !!this.imeta;\n }\n /**\n * Gets the first imeta tag (there should only be one).\n */\n get imeta() {\n return this._imeta;\n }\n /**\n * Sets a single imeta tag, replacing any existing ones.\n */\n set imeta(tag) {\n this._imeta = tag;\n this.tags = this.tags.filter((t) => t[0] !== \"imeta\");\n if (tag) {\n this.tags.push(imetaTagToTag(tag));\n }\n }\n /**\n * Getter for the story dimensions.\n *\n * @returns {NDKStoryDimension | undefined} - The story dimensions if available, otherwise undefined.\n */\n get dimensions() {\n const dimTag = this.tagValue(\"dim\");\n if (!dimTag) return void 0;\n return strToDimension(dimTag);\n }\n /**\n * Setter for the story dimensions.\n *\n * @param {NDKStoryDimension | undefined} dimensions - The dimensions to set for the story.\n */\n set dimensions(dimensions) {\n this.removeTag(\"dim\");\n if (dimensions) {\n this.tags.push([\"dim\", `${dimensions.width}x${dimensions.height}`]);\n }\n }\n /**\n * Getter for the story duration.\n *\n * @returns {number | undefined} - The story duration in seconds if available, otherwise undefined.\n */\n get duration() {\n const durTag = this.tagValue(\"dur\");\n if (!durTag) return void 0;\n return Number.parseInt(durTag);\n }\n /**\n * Setter for the story duration.\n *\n * @param {number | undefined} duration - The duration in seconds to set for the story.\n */\n set duration(duration) {\n this.removeTag(\"dur\");\n if (duration !== void 0) {\n this.tags.push([\"dur\", duration.toString()]);\n }\n }\n /**\n * Gets all stickers from the story.\n *\n * @returns {NDKStorySticker[]} - Array of stickers in the story.\n */\n get stickers() {\n const stickers = [];\n for (const tag of this.tags) {\n if (tag[0] !== \"sticker\" || tag.length < 5) continue;\n const sticker = NDKStorySticker.fromTag(tag);\n if (sticker) stickers.push(sticker);\n }\n return stickers;\n }\n /**\n * Adds a sticker to the story.\n *\n * @param {NDKStorySticker|StorySticker} sticker - The sticker to add.\n */\n addSticker(sticker) {\n let stickerToAdd;\n if (sticker instanceof NDKStorySticker) {\n stickerToAdd = sticker;\n } else {\n const tag = [\n \"sticker\",\n sticker.type,\n typeof sticker.value === \"string\" ? sticker.value : \"\",\n coordinates(sticker.position),\n dimension(sticker.dimension)\n ];\n if (sticker.properties) {\n for (const [key, value] of Object.entries(sticker.properties)) {\n tag.push(`${key} ${value}`);\n }\n }\n stickerToAdd = new NDKStorySticker(tag);\n stickerToAdd.value = sticker.value;\n }\n if (stickerToAdd.type === \"pubkey\" /* Pubkey */) {\n this.tag(stickerToAdd.value);\n } else if (stickerToAdd.type === \"event\" /* Event */) {\n this.tag(stickerToAdd.value);\n }\n this.tags.push(stickerToAdd.toTag());\n }\n /**\n * Removes a sticker from the story.\n *\n * @param {number} index - The index of the sticker to remove.\n */\n removeSticker(index) {\n const stickers = this.stickers;\n if (index < 0 || index >= stickers.length) return;\n let stickerCount = 0;\n for (let i = 0; i < this.tags.length; i++) {\n if (this.tags[i][0] === \"sticker\") {\n if (stickerCount === index) {\n this.tags.splice(i, 1);\n break;\n }\n stickerCount++;\n }\n }\n }\n};\nvar coordinates = (position) => `${position.x},${position.y}`;\nvar dimension = (dimension2) => `${dimension2.width}x${dimension2.height}`;\n\n// src/events/kinds/subscriptions/amount.ts\nvar possibleIntervalFrequencies = [\n \"daily\",\n \"weekly\",\n \"monthly\",\n \"quarterly\",\n \"yearly\"\n];\nfunction calculateTermDurationInSeconds(term) {\n switch (term) {\n case \"daily\":\n return 24 * 60 * 60;\n case \"weekly\":\n return 7 * 24 * 60 * 60;\n case \"monthly\":\n return 30 * 24 * 60 * 60;\n case \"quarterly\":\n return 3 * 30 * 24 * 60 * 60;\n case \"yearly\":\n return 365 * 24 * 60 * 60;\n }\n}\nfunction newAmount(amount, currency, term) {\n return [\"amount\", amount.toString(), currency, term];\n}\nfunction parseTagToSubscriptionAmount(tag) {\n const amount = Number.parseInt(tag[1]);\n if (Number.isNaN(amount) || amount === void 0 || amount === null || amount <= 0) return void 0;\n const currency = tag[2];\n if (currency === void 0 || currency === \"\") return void 0;\n const term = tag[3];\n if (term === void 0) return void 0;\n if (!possibleIntervalFrequencies.includes(term)) return void 0;\n return {\n amount,\n currency,\n term\n };\n}\n\n// src/events/kinds/subscriptions/tier.ts\nvar NDKSubscriptionTier = class _NDKSubscriptionTier extends NDKArticle {\n static kind = 37001 /* SubscriptionTier */;\n static kinds = [37001 /* SubscriptionTier */];\n constructor(ndk, rawEvent) {\n const k = rawEvent?.kind ?? 37001 /* SubscriptionTier */;\n super(ndk, rawEvent);\n this.kind = k;\n }\n /**\n * Creates a new NDKSubscriptionTier from an event\n * @param event\n * @returns NDKSubscriptionTier\n */\n static from(event) {\n return new _NDKSubscriptionTier(event.ndk, event);\n }\n /**\n * Returns perks for this tier\n */\n get perks() {\n return this.getMatchingTags(\"perk\").map((tag) => tag[1]).filter((perk) => perk !== void 0);\n }\n /**\n * Adds a perk to this tier\n */\n addPerk(perk) {\n this.tags.push([\"perk\", perk]);\n }\n /**\n * Returns the amount for this tier\n */\n get amounts() {\n return this.getMatchingTags(\"amount\").map((tag) => parseTagToSubscriptionAmount(tag)).filter((a) => a !== void 0);\n }\n /**\n * Adds an amount to this tier\n * @param amount Amount in the smallest unit of the currency (e.g. cents, msats)\n * @param currency Currency code. Use msat for millisatoshis\n * @param term One of daily, weekly, monthly, quarterly, yearly\n */\n addAmount(amount, currency, term) {\n this.tags.push(newAmount(amount, currency, term));\n }\n /**\n * Sets a relay where content related to this tier can be found\n * @param relayUrl URL of the relay\n */\n set relayUrl(relayUrl) {\n this.tags.push([\"r\", relayUrl]);\n }\n /**\n * Returns the relay URLs for this tier\n */\n get relayUrls() {\n return this.getMatchingTags(\"r\").map((tag) => tag[1]).filter((relay) => relay !== void 0);\n }\n /**\n * Gets the verifier pubkey for this tier. This is the pubkey that will generate\n * subscription payment receipts\n */\n get verifierPubkey() {\n return this.tagValue(\"p\");\n }\n /**\n * Sets the verifier pubkey for this tier.\n */\n set verifierPubkey(pubkey) {\n this.removeTag(\"p\");\n if (pubkey) this.tags.push([\"p\", pubkey]);\n }\n /**\n * Checks if this tier is valid\n */\n get isValid() {\n return this.title !== void 0 && // Must have a title\n this.amounts.length > 0;\n }\n};\n\n// src/events/kinds/video.ts\nvar NDKVideo = class _NDKVideo extends NDKEvent {\n static kind = 21 /* Video */;\n static kinds = [34235 /* HorizontalVideo */, 34236 /* VerticalVideo */, 22 /* ShortVideo */, 21 /* Video */];\n _imetas;\n /**\n * Creates a NDKArticle from an existing NDKEvent.\n *\n * @param event NDKEvent to create the NDKArticle from.\n * @returns NDKArticle\n */\n static from(event) {\n return new _NDKVideo(event.ndk, event.rawEvent());\n }\n /**\n * Getter for the article title.\n *\n * @returns {string | undefined} - The article title if available, otherwise undefined.\n */\n get title() {\n return this.tagValue(\"title\");\n }\n /**\n * Setter for the article title.\n *\n * @param {string | undefined} title - The title to set for the article.\n */\n set title(title) {\n this.removeTag(\"title\");\n if (title) this.tags.push([\"title\", title]);\n }\n /**\n * Getter for the article thumbnail.\n *\n * @returns {string | undefined} - The article thumbnail if available, otherwise undefined.\n */\n get thumbnail() {\n let thumbnail;\n if (this.imetas && this.imetas.length > 0) {\n thumbnail = this.imetas[0].image?.[0];\n }\n return thumbnail ?? this.tagValue(\"thumb\");\n }\n get imetas() {\n if (this._imetas) return this._imetas;\n this._imetas = this.tags.filter((tag) => tag[0] === \"imeta\").map(mapImetaTag);\n return this._imetas;\n }\n set imetas(tags) {\n this._imetas = tags;\n this.tags = this.tags.filter((tag) => tag[0] !== \"imeta\");\n this.tags.push(...tags.map(imetaTagToTag));\n }\n get url() {\n if (this.imetas && this.imetas.length > 0) {\n return this.imetas[0].url;\n }\n return this.tagValue(\"url\");\n }\n /**\n * Getter for the article's publication timestamp.\n *\n * @returns {number | undefined} - The Unix timestamp of when the article was published or undefined.\n */\n get published_at() {\n const tag = this.tagValue(\"published_at\");\n if (tag) {\n return Number.parseInt(tag);\n }\n return void 0;\n }\n /**\n * Generates content tags for the article.\n *\n * This method first checks and sets the publication date if not available,\n * and then generates content tags based on the base NDKEvent class.\n *\n * @returns {ContentTag} - The generated content tags.\n */\n async generateTags() {\n super.generateTags();\n if (!this.kind) {\n if (this.imetas?.[0]?.dim) {\n const [width, height] = this.imetas[0].dim.split(\"x\");\n const isPortrait = width && height && Number.parseInt(width) < Number.parseInt(height);\n const isShort = this.duration && this.duration < 120;\n if (isShort && isPortrait) this.kind = 22 /* ShortVideo */;\n else this.kind = 21 /* Video */;\n }\n }\n return super.generateTags();\n }\n get duration() {\n const tag = this.tagValue(\"duration\");\n if (tag) {\n return Number.parseInt(tag);\n }\n return void 0;\n }\n /**\n * Setter for the video's duration\n *\n * @param {number | undefined} duration - The duration to set for the video (in seconds)\n */\n set duration(dur) {\n this.removeTag(\"duration\");\n if (dur !== void 0) {\n this.tags.push([\"duration\", Math.floor(dur).toString()]);\n }\n }\n};\n\n// src/events/kinds/wiki.ts\nvar NDKWiki = class _NDKWiki extends NDKArticle {\n static kind = 30818 /* Wiki */;\n static kinds = [30818 /* Wiki */];\n static from(event) {\n return new _NDKWiki(event.ndk, event.rawEvent());\n }\n get isDefered() {\n return this.hasTag(\"a\", \"defer\");\n }\n get deferedId() {\n return this.tagValue(\"a\", \"defer\");\n }\n /**\n * Defers the author's wiki event to another wiki event.\n *\n * Wiki-events can tag other wiki-events with a `defer` marker to indicate that it considers someone else's entry as a \"better\" version of itself. If using a `defer` marker both `a` and `e` tags SHOULD be used.\n *\n * @example\n * myWiki.defer = betterWikiEntryOnTheSameTopic;\n * myWiki.publishReplaceable()\n */\n set defer(deferedTo) {\n this.removeTag(\"a\", \"defer\");\n this.tag(deferedTo, \"defer\");\n }\n};\nvar NDKWikiMergeRequest = class _NDKWikiMergeRequest extends NDKEvent {\n static kinds = [818 /* WikiMergeRequest */];\n static from(event) {\n return new _NDKWikiMergeRequest(event.ndk, event.rawEvent());\n }\n /**\n * The target ID (<kind:pubkey:d-tag>) of the wiki event to merge into.\n */\n get targetId() {\n return this.tagValue(\"a\");\n }\n /**\n * Sets the target ID (<kind:pubkey:d-tag>) of the wiki event to merge into.\n */\n set target(targetEvent) {\n this.tags = this.tags.filter((tag) => {\n if (tag[0] === \"a\") return true;\n if (tag[0] === \"e\" && tag[3] !== \"source\") return true;\n });\n this.tag(targetEvent);\n }\n /**\n * The source ID of the wiki event to merge from.\n */\n get sourceId() {\n return this.tagValue(\"e\", \"source\");\n }\n /**\n * Sets the event we are asking to get merged into the target.\n */\n set source(sourceEvent) {\n this.removeTag(\"e\", \"source\");\n this.tag(sourceEvent, \"source\", false, \"e\");\n }\n};\n\n// src/events/kinds/blossom-list.ts\nvar NDKBlossomList = class _NDKBlossomList extends NDKEvent {\n static kinds = [10063 /* BlossomList */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 10063 /* BlossomList */;\n }\n static from(ndkEvent) {\n return new _NDKBlossomList(ndkEvent.ndk, ndkEvent.rawEvent());\n }\n /**\n * Returns all Blossom servers in the list\n */\n get servers() {\n return this.tags.filter((tag) => tag[0] === \"server\").map((tag) => tag[1]);\n }\n /**\n * Sets the list of Blossom servers\n */\n set servers(servers) {\n this.tags = this.tags.filter((tag) => tag[0] !== \"server\");\n for (const server of servers) {\n this.tags.push([\"server\", server]);\n }\n }\n /**\n * Returns the default Blossom server (first in the list)\n */\n get default() {\n const servers = this.servers;\n return servers.length > 0 ? servers[0] : void 0;\n }\n /**\n * Sets the default Blossom server by moving it to the beginning of the list\n */\n set default(server) {\n if (!server) return;\n const currentServers = this.servers;\n const filteredServers = currentServers.filter((s) => s !== server);\n this.servers = [server, ...filteredServers];\n }\n /**\n * Adds a server to the list if it doesn't already exist\n */\n addServer(server) {\n if (!server) return;\n const currentServers = this.servers;\n if (!currentServers.includes(server)) {\n this.servers = [...currentServers, server];\n }\n }\n /**\n * Removes a server from the list\n */\n removeServer(server) {\n if (!server) return;\n const currentServers = this.servers;\n this.servers = currentServers.filter((s) => s !== server);\n }\n};\n\n// src/events/kinds/follow-pack.ts\nvar NDKFollowPack = class _NDKFollowPack extends NDKEvent {\n static kind = 39089 /* FollowPack */;\n static kinds = [39089 /* FollowPack */, 39092 /* MediaFollowPack */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 39089 /* FollowPack */;\n }\n /**\n * Converts a generic NDKEvent to an NDKFollowPack.\n */\n static from(ndkEvent) {\n return new _NDKFollowPack(ndkEvent.ndk, ndkEvent);\n }\n /**\n * Gets the title from the tags.\n */\n get title() {\n return this.tagValue(\"title\");\n }\n /**\n * Sets the title tag.\n */\n set title(value) {\n this.removeTag(\"title\");\n if (value) this.tags.push([\"title\", value]);\n }\n /**\n * Gets the image URL from the tags.\n */\n /**\n * Gets the image URL from the tags.\n * Looks for an imeta tag first (returns its url), then falls back to the image tag.\n */\n get image() {\n const imetaTag = this.tags.find((tag) => tag[0] === \"imeta\");\n if (imetaTag) {\n const imeta = mapImetaTag(imetaTag);\n if (imeta.url) return imeta.url;\n }\n return this.tagValue(\"image\");\n }\n /**\n * Sets the image URL tag.\n */\n /**\n * Sets the image tag.\n * Accepts a string (URL) or an NDKImetaTag.\n * If given an NDKImetaTag, sets both the imeta tag and the image tag (using the url).\n * If undefined, removes both tags.\n */\n set image(value) {\n this.tags = this.tags.filter((tag) => tag[0] !== \"imeta\" && tag[0] !== \"image\");\n if (typeof value === \"string\") {\n if (value !== void 0) {\n this.tags.push([\"image\", value]);\n }\n } else if (value && typeof value === \"object\") {\n this.tags.push(imetaTagToTag(value));\n if (value.url) {\n this.tags.push([\"image\", value.url]);\n }\n }\n }\n /**\n * Gets all pubkeys from p tags.\n */\n get pubkeys() {\n return Array.from(new Set(this.tags.filter((tag) => tag[0] === \"p\").map((tag) => tag[1])));\n }\n /**\n * Sets the pubkeys (replaces all p tags).\n */\n set pubkeys(pubkeys) {\n this.tags = this.tags.filter((tag) => tag[0] !== \"p\");\n for (const pubkey of pubkeys) {\n this.tags.push([\"p\", pubkey]);\n }\n }\n /**\n * Gets the description from the tags.\n */\n get description() {\n return this.tagValue(\"description\");\n }\n /**\n * Sets the description tag.\n */\n set description(value) {\n this.removeTag(\"description\");\n if (value) this.tags.push([\"description\", value]);\n }\n};\n\n// src/signers/private-key/index.ts\nimport { finalizeEvent, generateSecretKey, getPublicKey, nip04, nip44 } from \"nostr-tools\";\nimport { bytesToHex as bytesToHex2, hexToBytes } from \"@noble/hashes/utils\";\nimport { nip19 as nip194 } from \"nostr-tools\";\n\n// src/signers/registry.ts\nvar signerRegistry = /* @__PURE__ */ new Map();\nfunction registerSigner(type, signerClass) {\n signerRegistry.set(type, signerClass);\n}\n\n// src/signers/private-key/index.ts\nvar NDKPrivateKeySigner = class _NDKPrivateKeySigner {\n _user;\n _privateKey;\n _pubkey;\n /**\n * Create a new signer from a private key.\n * @param privateKey - The private key to use in hex form or nsec.\n * @param ndk - The NDK instance to use.\n */\n constructor(privateKeyOrNsec, ndk) {\n if (typeof privateKeyOrNsec === \"string\") {\n if (privateKeyOrNsec.startsWith(\"nsec1\")) {\n const { type, data } = nip194.decode(privateKeyOrNsec);\n if (type === \"nsec\") this._privateKey = data;\n else throw new Error(\"Invalid private key provided.\");\n } else if (privateKeyOrNsec.length === 64) {\n this._privateKey = hexToBytes(privateKeyOrNsec);\n } else {\n throw new Error(\"Invalid private key provided.\");\n }\n } else {\n this._privateKey = privateKeyOrNsec;\n }\n this._pubkey = getPublicKey(this._privateKey);\n if (ndk) this._user = ndk.getUser({ pubkey: this._pubkey });\n this._user ??= new NDKUser({ pubkey: this._pubkey });\n }\n /**\n * Get the private key in hex form.\n */\n get privateKey() {\n if (!this._privateKey) throw new Error(\"Not ready\");\n return bytesToHex2(this._privateKey);\n }\n /**\n * Get the public key in hex form.\n */\n get pubkey() {\n if (!this._pubkey) throw new Error(\"Not ready\");\n return this._pubkey;\n }\n /**\n * Get the private key in nsec form.\n */\n get nsec() {\n if (!this._privateKey) throw new Error(\"Not ready\");\n return nip194.nsecEncode(this._privateKey);\n }\n /**\n * Get the public key in npub form.\n */\n get npub() {\n if (!this._pubkey) throw new Error(\"Not ready\");\n return nip194.npubEncode(this._pubkey);\n }\n /**\n * Generate a new private key.\n */\n static generate() {\n const privateKey = generateSecretKey();\n return new _NDKPrivateKeySigner(privateKey);\n }\n /**\n * Noop in NDKPrivateKeySigner.\n */\n async blockUntilReady() {\n return this._user;\n }\n /**\n * Get the user.\n */\n async user() {\n return this._user;\n }\n /**\n * Get the user.\n */\n get userSync() {\n return this._user;\n }\n async sign(event) {\n if (!this._privateKey) {\n throw Error(\"Attempted to sign without a private key\");\n }\n return finalizeEvent(event, this._privateKey).sig;\n }\n async encryptionEnabled(scheme) {\n const enabled = [];\n if (!scheme || scheme === \"nip04\") enabled.push(\"nip04\");\n if (!scheme || scheme === \"nip44\") enabled.push(\"nip44\");\n return enabled;\n }\n async encrypt(recipient, value, scheme) {\n if (!this._privateKey || !this.privateKey) {\n throw Error(\"Attempted to encrypt without a private key\");\n }\n const recipientHexPubKey = recipient.pubkey;\n if (scheme === \"nip44\") {\n const conversationKey = nip44.v2.utils.getConversationKey(this._privateKey, recipientHexPubKey);\n return await nip44.v2.encrypt(value, conversationKey);\n }\n return await nip04.encrypt(this._privateKey, recipientHexPubKey, value);\n }\n async decrypt(sender, value, scheme) {\n if (!this._privateKey || !this.privateKey) {\n throw Error(\"Attempted to decrypt without a private key\");\n }\n const senderHexPubKey = sender.pubkey;\n if (scheme === \"nip44\") {\n const conversationKey = nip44.v2.utils.getConversationKey(this._privateKey, senderHexPubKey);\n return await nip44.v2.decrypt(value, conversationKey);\n }\n return await nip04.decrypt(this._privateKey, senderHexPubKey, value);\n }\n /**\n * Serializes the signer's private key into a storable format.\n * @returns A JSON string containing the type and the hex private key.\n */\n toPayload() {\n if (!this._privateKey) throw new Error(\"Private key not available\");\n const payload = {\n type: \"private-key\",\n payload: this.privateKey\n // Use the hex private key\n };\n return JSON.stringify(payload);\n }\n /**\n * Deserializes the signer from a payload string.\n * @param payloadString The JSON string obtained from toPayload().\n * @param ndk Optional NDK instance.\n * @returns An instance of NDKPrivateKeySigner.\n */\n static async fromPayload(payloadString, ndk) {\n const payload = JSON.parse(payloadString);\n if (payload.type !== \"private-key\") {\n throw new Error(`Invalid payload type: expected 'private-key', got ${payload.type}`);\n }\n if (!payload.payload || typeof payload.payload !== \"string\") {\n throw new Error(\"Invalid payload content for private-key signer\");\n }\n return new _NDKPrivateKeySigner(payload.payload, ndk);\n }\n};\nregisterSigner(\"private-key\", NDKPrivateKeySigner);\n\n// src/events/kinds/project.ts\nvar NDKProject = class _NDKProject extends NDKEvent {\n static kind = 31933 /* Project */;\n static kinds = [31933 /* Project */];\n _signer;\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind = 31933 /* Project */;\n }\n static from(event) {\n return new _NDKProject(event.ndk, event.rawEvent());\n }\n set repo(value) {\n this.removeTag(\"repo\");\n if (value) this.tags.push([\"repo\", value]);\n }\n set hashtags(values) {\n this.removeTag(\"hashtags\");\n if (values.filter((t) => t.length > 0).length) this.tags.push([\"hashtags\", ...values]);\n }\n get hashtags() {\n const tag = this.tags.find((tag2) => tag2[0] === \"hashtags\");\n return tag ? tag.slice(1) : [];\n }\n get repo() {\n return this.tagValue(\"repo\");\n }\n get title() {\n return this.tagValue(\"title\");\n }\n set title(value) {\n this.removeTag(\"title\");\n if (value) this.tags.push([\"title\", value]);\n }\n get picture() {\n return this.tagValue(\"picture\");\n }\n set picture(value) {\n this.removeTag(\"picture\");\n if (value) this.tags.push([\"picture\", value]);\n }\n set description(value) {\n this.content = value;\n }\n get description() {\n return this.content;\n }\n /**\n * The project slug, derived from the 'd' tag.\n */\n get slug() {\n return this.dTag ?? \"empty-dtag\";\n }\n async getSigner() {\n if (this._signer) return this._signer;\n const encryptedKey = this.tagValue(\"key\");\n if (!encryptedKey) {\n this._signer = NDKPrivateKeySigner.generate();\n await this.encryptAndSaveNsec();\n } else {\n const decryptedKey = await this.ndk?.signer?.decrypt(this.ndk.activeUser, encryptedKey);\n if (!decryptedKey) {\n throw new Error(\"Failed to decrypt project key or missing signer context.\");\n }\n this._signer = new NDKPrivateKeySigner(decryptedKey);\n }\n return this._signer;\n }\n async getNsec() {\n const signer = await this.getSigner();\n return signer.privateKey;\n }\n async setNsec(value) {\n this._signer = new NDKPrivateKeySigner(value);\n await this.encryptAndSaveNsec();\n }\n async encryptAndSaveNsec() {\n if (!this._signer) throw new Error(\"Signer is not set.\");\n const key = this._signer.privateKey;\n const encryptedKey = await this.ndk?.signer?.encrypt(this.ndk.activeUser, key);\n if (encryptedKey) {\n this.removeTag(\"key\");\n this.tags.push([\"key\", encryptedKey]);\n }\n }\n};\n\n// src/events/kinds/thread.ts\nvar NDKThread = class _NDKThread extends NDKEvent {\n static kind = 11 /* Thread */;\n static kinds = [11 /* Thread */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 11 /* Thread */;\n }\n /**\n * Creates an NDKThread from an existing NDKEvent.\n *\n * @param event NDKEvent to create the NDKThread from.\n * @returns NDKThread\n */\n static from(event) {\n return new _NDKThread(event.ndk, event);\n }\n /**\n * Gets the title of the thread.\n */\n get title() {\n return this.tagValue(\"title\");\n }\n /**\n * Sets the title of the thread.\n */\n set title(title) {\n this.removeTag(\"title\");\n if (title) {\n this.tags.push([\"title\", title]);\n }\n }\n};\n\n// src/events/kinds/drafts.ts\nvar NDKDraft = class _NDKDraft extends NDKEvent {\n _event;\n static kind = 31234 /* Draft */;\n static kinds = [31234 /* Draft */, 1234 /* DraftCheckpoint */];\n /**\n * Can be used to include a different pubkey as part of the draft.\n * This is useful when we want to make the draft a proposal for a different user to publish.\n */\n counterparty;\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 31234 /* Draft */;\n }\n static from(event) {\n return new _NDKDraft(event.ndk, event);\n }\n /**\n * Sets an identifier (i.e. d-tag)\n */\n set identifier(id) {\n this.removeTag(\"d\");\n this.tags.push([\"d\", id]);\n }\n get identifier() {\n return this.dTag;\n }\n /**\n * Event that is to be saved.\n */\n set event(e) {\n if (!(e instanceof NDKEvent)) this._event = new NDKEvent(void 0, e);\n else this._event = e;\n this.prepareEvent();\n }\n /**\n * Marks the event as a checkpoint for another draft event.\n */\n set checkpoint(parent) {\n if (parent) {\n this.tags.push(parent.tagReference());\n this.kind = 1234 /* DraftCheckpoint */;\n } else {\n this.removeTag(\"a\");\n this.kind = 31234 /* Draft */;\n }\n }\n get isCheckpoint() {\n return this.kind === 1234 /* DraftCheckpoint */;\n }\n get isProposal() {\n const pTag = this.tagValue(\"p\");\n return !!pTag && pTag !== this.pubkey;\n }\n /**\n * Gets the event.\n * @param param0\n * @returns NDKEvent of the draft event or null if the draft event has been deleted (emptied).\n */\n async getEvent(signer) {\n if (this._event) return this._event;\n signer ??= this.ndk?.signer;\n if (!signer) throw new Error(\"No signer available\");\n if (this.content && this.content.length > 0) {\n try {\n const ownPubkey = signer.pubkey;\n const pubkeys = [this.tagValue(\"p\"), this.pubkey].filter(Boolean);\n const counterpartyPubkey = pubkeys.find((pubkey) => pubkey !== ownPubkey);\n let user;\n user = new NDKUser({ pubkey: counterpartyPubkey ?? ownPubkey });\n await this.decrypt(user, signer);\n const payload = JSON.parse(this.content);\n this._event = await wrapEvent(new NDKEvent(this.ndk, payload));\n return this._event;\n } catch (e) {\n console.error(e);\n return void 0;\n }\n } else {\n return null;\n }\n }\n prepareEvent() {\n if (!this._event) throw new Error(\"No event has been provided\");\n this.removeTag(\"k\");\n if (this._event.kind) this.tags.push([\"k\", this._event.kind.toString()]);\n this.content = JSON.stringify(this._event.rawEvent());\n }\n /**\n * Generates draft event.\n *\n * @param signer: Optional signer to encrypt with\n * @param publish: Whether to publish, optionally specifying relaySet to publish to\n */\n async save({ signer, publish, relaySet }) {\n signer ??= this.ndk?.signer;\n if (!signer) throw new Error(\"No signer available\");\n const user = this.counterparty || await signer.user();\n await this.encrypt(user, signer);\n if (this.counterparty) {\n const pubkey = this.counterparty.pubkey;\n this.removeTag(\"p\");\n this.tags.push([\"p\", pubkey]);\n }\n if (publish === false) return;\n return this.publishReplaceable(relaySet);\n }\n};\n\n// src/events/kinds/task.ts\nvar NDKTask = class _NDKTask extends NDKEvent {\n static kind = 1934 /* Task */;\n static kinds = [1934 /* Task */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind = 1934 /* Task */;\n }\n static from(event) {\n return new _NDKTask(event.ndk, event.rawEvent());\n }\n set title(value) {\n this.removeTag(\"title\");\n if (value) this.tags.push([\"title\", value]);\n }\n get title() {\n return this.tagValue(\"title\");\n }\n set project(project) {\n this.removeTag(\"a\");\n this.tags.push(project.tagReference());\n }\n get projectSlug() {\n const tag = this.getMatchingTags(\"a\")[0];\n return tag ? tag[1].split(/:/)?.[2] : void 0;\n }\n};\n\n// src/events/kinds/project-template.ts\nvar NDKProjectTemplate = class _NDKProjectTemplate extends NDKEvent {\n static kind = 30717 /* ProjectTemplate */;\n static kinds = [30717 /* ProjectTemplate */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind = 30717 /* ProjectTemplate */;\n }\n static from(event) {\n return new _NDKProjectTemplate(event.ndk, event.rawEvent());\n }\n /**\n * Template identifier from 'd' tag\n */\n get templateId() {\n return this.dTag ?? \"\";\n }\n set templateId(value) {\n this.dTag = value;\n }\n /**\n * Template name from 'title' tag\n */\n get name() {\n return this.tagValue(\"title\") ?? \"\";\n }\n set name(value) {\n this.removeTag(\"title\");\n if (value) this.tags.push([\"title\", value]);\n }\n /**\n * Template description from 'description' tag\n */\n get description() {\n return this.tagValue(\"description\") ?? \"\";\n }\n set description(value) {\n this.removeTag(\"description\");\n if (value) this.tags.push([\"description\", value]);\n }\n /**\n * Git repository URL from 'uri' tag\n */\n get repoUrl() {\n return this.tagValue(\"uri\") ?? \"\";\n }\n set repoUrl(value) {\n this.removeTag(\"uri\");\n if (value) this.tags.push([\"uri\", value]);\n }\n /**\n * Template preview image URL from 'image' tag\n */\n get image() {\n return this.tagValue(\"image\");\n }\n set image(value) {\n this.removeTag(\"image\");\n if (value) this.tags.push([\"image\", value]);\n }\n /**\n * Command to run from 'command' tag\n */\n get command() {\n return this.tagValue(\"command\");\n }\n set command(value) {\n this.removeTag(\"command\");\n if (value) this.tags.push([\"command\", value]);\n }\n /**\n * Agent configuration from 'agent' tag\n */\n get agentConfig() {\n const agentTag = this.tagValue(\"agent\");\n if (!agentTag) return void 0;\n try {\n return JSON.parse(agentTag);\n } catch {\n return void 0;\n }\n }\n set agentConfig(value) {\n this.removeTag(\"agent\");\n if (value) {\n this.tags.push([\"agent\", JSON.stringify(value)]);\n }\n }\n /**\n * Template tags from 't' tags\n */\n get templateTags() {\n return this.getMatchingTags(\"t\").map((tag) => tag[1]).filter(Boolean);\n }\n set templateTags(values) {\n this.tags = this.tags.filter((tag) => tag[0] !== \"t\");\n values.forEach((value) => {\n if (value) this.tags.push([\"t\", value]);\n });\n }\n};\n\n// src/events/kinds/relay-list.ts\nvar READ_MARKER = \"read\";\nvar WRITE_MARKER = \"write\";\nvar NDKRelayList = class _NDKRelayList extends NDKEvent {\n static kinds = [10002 /* RelayList */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 10002 /* RelayList */;\n }\n static from(ndkEvent) {\n return new _NDKRelayList(ndkEvent.ndk, ndkEvent.rawEvent());\n }\n get readRelayUrls() {\n return this.tags.filter((tag) => tag[0] === \"r\" || tag[0] === \"relay\").filter((tag) => !tag[2] || tag[2] && tag[2] === READ_MARKER).map((tag) => tryNormalizeRelayUrl(tag[1])).filter((url) => !!url);\n }\n set readRelayUrls(relays) {\n for (const relay of relays) {\n this.tags.push([\"r\", relay, READ_MARKER]);\n }\n }\n get writeRelayUrls() {\n return this.tags.filter((tag) => tag[0] === \"r\" || tag[0] === \"relay\").filter((tag) => !tag[2] || tag[2] && tag[2] === WRITE_MARKER).map((tag) => tryNormalizeRelayUrl(tag[1])).filter((url) => !!url);\n }\n set writeRelayUrls(relays) {\n for (const relay of relays) {\n this.tags.push([\"r\", relay, WRITE_MARKER]);\n }\n }\n get bothRelayUrls() {\n return this.tags.filter((tag) => tag[0] === \"r\" || tag[0] === \"relay\").filter((tag) => !tag[2]).map((tag) => tag[1]);\n }\n set bothRelayUrls(relays) {\n for (const relay of relays) {\n this.tags.push([\"r\", relay]);\n }\n }\n get relays() {\n return this.tags.filter((tag) => tag[0] === \"r\" || tag[0] === \"relay\").map((tag) => tag[1]);\n }\n /**\n * Provides a relaySet for the relays in this list.\n */\n get relaySet() {\n if (!this.ndk) throw new Error(\"NDKRelayList has no NDK instance\");\n return new NDKRelaySet(\n new Set(this.relays.map((u) => this.ndk?.pool.getRelay(u)).filter((r) => !!r)),\n this.ndk\n );\n }\n};\nfunction relayListFromKind3(ndk, contactList) {\n try {\n const content = JSON.parse(contactList.content);\n const relayList = new NDKRelayList(ndk);\n const readRelays = /* @__PURE__ */ new Set();\n const writeRelays = /* @__PURE__ */ new Set();\n for (let [key, config] of Object.entries(content)) {\n try {\n key = normalizeRelayUrl(key);\n } catch {\n continue;\n }\n if (!config) {\n readRelays.add(key);\n writeRelays.add(key);\n } else {\n const relayConfig = config;\n if (relayConfig.write) writeRelays.add(key);\n if (relayConfig.read) readRelays.add(key);\n }\n }\n relayList.readRelayUrls = Array.from(readRelays);\n relayList.writeRelayUrls = Array.from(writeRelays);\n return relayList;\n } catch {\n }\n return void 0;\n}\n\n// src/events/kinds/repost.ts\nvar NDKRepost = class _NDKRepost extends NDKEvent {\n _repostedEvents;\n static kinds = [6, 16];\n // Repost, GenericRepost\n static from(event) {\n return new _NDKRepost(event.ndk, event.rawEvent());\n }\n /**\n * Returns all reposted events by the current event.\n *\n * @param klass Optional class to convert the events to.\n * @returns\n */\n async repostedEvents(klass, opts) {\n const items = [];\n if (!this.ndk) throw new Error(\"NDK instance not set\");\n if (this._repostedEvents !== void 0) return this._repostedEvents;\n for (const eventId of this.repostedEventIds()) {\n const filter = filterForId(eventId);\n const event = await this.ndk.fetchEvent(filter, opts);\n if (event) {\n items.push(klass ? klass.from(event) : event);\n }\n }\n return items;\n }\n /**\n * Returns the reposted event IDs.\n */\n repostedEventIds() {\n return this.tags.filter((t) => t[0] === \"e\" || t[0] === \"a\").map((t) => t[1]);\n }\n};\nfunction filterForId(id) {\n if (id.match(/:/)) {\n const [kind, pubkey, identifier] = id.split(\":\");\n return {\n kinds: [Number.parseInt(kind)],\n authors: [pubkey],\n \"#d\": [identifier]\n };\n }\n return { ids: [id] };\n}\n\n// src/events/kinds/classified.ts\nvar NDKClassified = class _NDKClassified extends NDKEvent {\n static kinds = [30402 /* Classified */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 30402 /* Classified */;\n }\n /**\n * Creates a NDKClassified from an existing NDKEvent.\n *\n * @param event NDKEvent to create the NDKClassified from.\n * @returns NDKClassified\n */\n static from(event) {\n return new _NDKClassified(event.ndk, event);\n }\n /**\n * Getter for the classified title.\n *\n * @returns {string | undefined} - The classified title if available, otherwise undefined.\n */\n get title() {\n return this.tagValue(\"title\");\n }\n /**\n * Setter for the classified title.\n *\n * @param {string | undefined} title - The title to set for the classified.\n */\n set title(title) {\n this.removeTag(\"title\");\n if (title) this.tags.push([\"title\", title]);\n }\n /**\n * Getter for the classified summary.\n *\n * @returns {string | undefined} - The classified summary if available, otherwise undefined.\n */\n get summary() {\n return this.tagValue(\"summary\");\n }\n /**\n * Setter for the classified summary.\n *\n * @param {string | undefined} summary - The summary to set for the classified.\n */\n set summary(summary) {\n this.removeTag(\"summary\");\n if (summary) this.tags.push([\"summary\", summary]);\n }\n /**\n * Getter for the classified's publication timestamp.\n *\n * @returns {number | undefined} - The Unix timestamp of when the classified was published or undefined.\n */\n get published_at() {\n const tag = this.tagValue(\"published_at\");\n if (tag) {\n return Number.parseInt(tag);\n }\n return void 0;\n }\n /**\n * Setter for the classified's publication timestamp.\n *\n * @param {number | undefined} timestamp - The Unix timestamp to set for the classified's publication date.\n */\n set published_at(timestamp) {\n this.removeTag(\"published_at\");\n if (timestamp !== void 0) {\n this.tags.push([\"published_at\", timestamp.toString()]);\n }\n }\n /**\n * Getter for the classified location.\n *\n * @returns {string | undefined} - The classified location if available, otherwise undefined.\n */\n get location() {\n return this.tagValue(\"location\");\n }\n /**\n * Setter for the classified location.\n *\n * @param {string | undefined} location - The location to set for the classified.\n */\n set location(location) {\n this.removeTag(\"location\");\n if (location) this.tags.push([\"location\", location]);\n }\n /**\n * Getter for the classified price.\n *\n * @returns {NDKClassifiedPriceTag | undefined} - The classified price if available, otherwise undefined.\n */\n get price() {\n const priceTag = this.tags.find((tag) => tag[0] === \"price\");\n if (priceTag) {\n return {\n amount: Number.parseFloat(priceTag[1]),\n currency: priceTag[2],\n frequency: priceTag[3]\n };\n }\n return void 0;\n }\n /**\n * Setter for the classified price.\n *\n * @param price - The price to set for the classified.\n */\n set price(priceTag) {\n if (typeof priceTag === \"string\") {\n priceTag = {\n amount: Number.parseFloat(priceTag)\n };\n }\n if (priceTag?.amount) {\n const tag = [\"price\", priceTag.amount.toString()];\n if (priceTag.currency) tag.push(priceTag.currency);\n if (priceTag.frequency) tag.push(priceTag.frequency);\n this.tags.push(tag);\n } else {\n this.removeTag(\"price\");\n }\n }\n /**\n * Generates content tags for the classified.\n *\n * This method first checks and sets the publication date if not available,\n * and then generates content tags based on the base NDKEvent class.\n *\n * @returns {ContentTag} - The generated content tags.\n */\n async generateTags() {\n super.generateTags();\n if (!this.published_at) {\n this.published_at = this.created_at;\n }\n return super.generateTags();\n }\n};\n\n// src/events/kinds/nip89/app-handler.ts\nvar NDKAppHandlerEvent = class _NDKAppHandlerEvent extends NDKEvent {\n profile;\n static kinds = [31990 /* AppHandler */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 31990 /* AppHandler */;\n }\n static from(ndkEvent) {\n const event = new _NDKAppHandlerEvent(ndkEvent.ndk, ndkEvent.rawEvent());\n if (event.isValid) {\n return event;\n }\n return null;\n }\n get isValid() {\n const combinations = /* @__PURE__ */ new Map();\n const combinationFromTag = (tag) => [tag[0], tag[2]].join(\":\").toLowerCase();\n const tagsToInspect = [\"web\", \"android\", \"ios\"];\n for (const tag of this.tags) {\n if (tagsToInspect.includes(tag[0])) {\n const combination = combinationFromTag(tag);\n if (combinations.has(combination)) {\n if (combinations.get(combination) !== tag[1].toLowerCase()) {\n return false;\n }\n }\n combinations.set(combination, tag[1].toLowerCase());\n }\n }\n return true;\n }\n /**\n * Fetches app handler information\n * If no app information is available on the kind:31990,\n * we fetch the event's author's profile and return that instead.\n */\n async fetchProfile() {\n if (this.profile === void 0 && this.content.length > 0) {\n try {\n const profile = JSON.parse(this.content);\n if (profile?.name) {\n return profile;\n }\n this.profile = null;\n } catch (_e) {\n this.profile = null;\n }\n }\n return new Promise((resolve, reject) => {\n const author = this.author;\n author.fetchProfile().then(() => {\n resolve(author.profile);\n }).catch(reject);\n });\n }\n};\n\n// src/events/kinds/dvm/feedback.ts\nvar NDKDvmJobFeedbackStatus = /* @__PURE__ */ ((NDKDvmJobFeedbackStatus2) => {\n NDKDvmJobFeedbackStatus2[\"Processing\"] = \"processing\";\n NDKDvmJobFeedbackStatus2[\"Success\"] = \"success\";\n NDKDvmJobFeedbackStatus2[\"Scheduled\"] = \"scheduled\";\n NDKDvmJobFeedbackStatus2[\"PayReq\"] = \"payment_required\";\n return NDKDvmJobFeedbackStatus2;\n})(NDKDvmJobFeedbackStatus || {});\nvar NDKDVMJobFeedback = class _NDKDVMJobFeedback extends NDKEvent {\n static kinds = [7e3 /* DVMJobFeedback */];\n constructor(ndk, event) {\n super(ndk, event);\n this.kind ??= 7e3 /* DVMJobFeedback */;\n }\n static async from(event) {\n const e = new _NDKDVMJobFeedback(event.ndk, event.rawEvent());\n if (e.encrypted) await e.dvmDecrypt();\n return e;\n }\n get status() {\n return this.tagValue(\"status\");\n }\n set status(status) {\n this.removeTag(\"status\");\n if (status !== void 0) {\n this.tags.push([\"status\", status]);\n }\n }\n get encrypted() {\n return !!this.getMatchingTags(\"encrypted\")[0];\n }\n async dvmDecrypt() {\n await this.decrypt();\n const decryptedContent = JSON.parse(this.content);\n this.tags.push(...decryptedContent);\n }\n};\n\n// src/events/kinds/subscriptions/subscription-start.ts\nimport debug4 from \"debug\";\nvar NDKSubscriptionStart = class _NDKSubscriptionStart extends NDKEvent {\n debug;\n static kinds = [7001 /* Subscribe */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 7001 /* Subscribe */;\n this.debug = ndk?.debug.extend(\"subscription-start\") ?? debug4(\"ndk:subscription-start\");\n }\n static from(event) {\n return new _NDKSubscriptionStart(event.ndk, event.rawEvent());\n }\n /**\n * Recipient of the subscription. I.e. The author of this event subscribes to this user.\n */\n get recipient() {\n const pTag = this.getMatchingTags(\"p\")?.[0];\n if (!pTag) return void 0;\n const user = new NDKUser({ pubkey: pTag[1] });\n return user;\n }\n set recipient(user) {\n this.removeTag(\"p\");\n if (!user) return;\n this.tags.push([\"p\", user.pubkey]);\n }\n /**\n * The amount of the subscription.\n */\n get amount() {\n const amountTag = this.getMatchingTags(\"amount\")?.[0];\n if (!amountTag) return void 0;\n return parseTagToSubscriptionAmount(amountTag);\n }\n set amount(amount) {\n this.removeTag(\"amount\");\n if (!amount) return;\n this.tags.push(newAmount(amount.amount, amount.currency, amount.term));\n }\n /**\n * The event id or NIP-33 tag id of the tier that the user is subscribing to.\n */\n get tierId() {\n const eTag = this.getMatchingTags(\"e\")?.[0];\n const aTag = this.getMatchingTags(\"a\")?.[0];\n if (!eTag || !aTag) return void 0;\n return eTag[1] ?? aTag[1];\n }\n set tier(tier) {\n this.removeTag(\"e\");\n this.removeTag(\"a\");\n this.removeTag(\"event\");\n if (!tier) return;\n this.tag(tier);\n this.removeTag(\"p\");\n this.tags.push([\"p\", tier.pubkey]);\n this.tags.push([\"event\", JSON.stringify(tier.rawEvent())]);\n }\n /**\n * Fetches the tier that the user is subscribing to.\n */\n async fetchTier() {\n const eventTag = this.tagValue(\"event\");\n if (eventTag) {\n try {\n const parsedEvent = JSON.parse(eventTag);\n return new NDKSubscriptionTier(this.ndk, parsedEvent);\n } catch {\n this.debug(\"Failed to parse event tag\");\n }\n }\n const tierId = this.tierId;\n if (!tierId) return void 0;\n const e = await this.ndk?.fetchEvent(tierId);\n if (!e) return void 0;\n return NDKSubscriptionTier.from(e);\n }\n get isValid() {\n if (this.getMatchingTags(\"amount\").length !== 1) {\n this.debug(\"Invalid # of amount tag\");\n return false;\n }\n if (!this.amount) {\n this.debug(\"Invalid amount tag\");\n return false;\n }\n if (this.getMatchingTags(\"p\").length !== 1) {\n this.debug(\"Invalid # of p tag\");\n return false;\n }\n if (!this.recipient) {\n this.debug(\"Invalid p tag\");\n return false;\n }\n return true;\n }\n};\n\n// src/events/kinds/subscriptions/receipt.ts\nimport debug5 from \"debug\";\nvar NDKSubscriptionReceipt = class _NDKSubscriptionReceipt extends NDKEvent {\n debug;\n static kinds = [7003 /* SubscriptionReceipt */];\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 7003 /* SubscriptionReceipt */;\n this.debug = ndk?.debug.extend(\"subscription-start\") ?? debug5(\"ndk:subscription-start\");\n }\n static from(event) {\n return new _NDKSubscriptionReceipt(event.ndk, event.rawEvent());\n }\n /**\n * This is the person being subscribed to\n */\n get recipient() {\n const pTag = this.getMatchingTags(\"p\")?.[0];\n if (!pTag) return void 0;\n const user = new NDKUser({ pubkey: pTag[1] });\n return user;\n }\n set recipient(user) {\n this.removeTag(\"p\");\n if (!user) return;\n this.tags.push([\"p\", user.pubkey]);\n }\n /**\n * This is the person subscribing\n */\n get subscriber() {\n const PTag = this.getMatchingTags(\"P\")?.[0];\n if (!PTag) return void 0;\n const user = new NDKUser({ pubkey: PTag[1] });\n return user;\n }\n set subscriber(user) {\n this.removeTag(\"P\");\n if (!user) return;\n this.tags.push([\"P\", user.pubkey]);\n }\n set subscriptionStart(event) {\n this.debug(`before setting subscription start: ${this.rawEvent}`);\n this.removeTag(\"e\");\n this.tag(event, \"subscription\", true);\n this.debug(`after setting subscription start: ${this.rawEvent}`);\n }\n get tierName() {\n const tag = this.getMatchingTags(\"tier\")?.[0];\n return tag?.[1];\n }\n get isValid() {\n const period = this.validPeriod;\n if (!period) {\n return false;\n }\n if (period.start > period.end) {\n return false;\n }\n const pTags = this.getMatchingTags(\"p\");\n const PTags = this.getMatchingTags(\"P\");\n if (pTags.length !== 1 || PTags.length !== 1) {\n return false;\n }\n return true;\n }\n get validPeriod() {\n const tag = this.getMatchingTags(\"valid\")?.[0];\n if (!tag) return void 0;\n try {\n return {\n start: new Date(Number.parseInt(tag[1]) * 1e3),\n end: new Date(Number.parseInt(tag[2]) * 1e3)\n };\n } catch {\n return void 0;\n }\n }\n set validPeriod(period) {\n this.removeTag(\"valid\");\n if (!period) return;\n this.tags.push([\n \"valid\",\n Math.floor(period.start.getTime() / 1e3).toString(),\n Math.floor(period.end.getTime() / 1e3).toString()\n ]);\n }\n get startPeriod() {\n return this.validPeriod?.start;\n }\n get endPeriod() {\n return this.validPeriod?.end;\n }\n /**\n * Whether the subscription is currently active\n */\n isActive(time) {\n time ??= /* @__PURE__ */ new Date();\n const period = this.validPeriod;\n if (!period) return false;\n if (time < period.start) return false;\n if (time > period.end) return false;\n return true;\n }\n};\n\n// src/events/kinds/cashu/mint.ts\nvar NDKCashuMint = class _NDKCashuMint extends NDKEvent {\n static kind = 38172 /* CashuMintAnnouncement */;\n static kinds = [38172 /* CashuMintAnnouncement */];\n constructor(ndk, event) {\n super(ndk, event);\n this.kind ??= 38172 /* CashuMintAnnouncement */;\n }\n static async from(event) {\n const mint = new _NDKCashuMint(event.ndk, event);\n return mint;\n }\n /**\n * The mint's identifier (pubkey)\n */\n get identifier() {\n return this.tagValue(\"d\");\n }\n set identifier(value) {\n this.removeTag(\"d\");\n if (value) this.tags.push([\"d\", value]);\n }\n /**\n * The mint URL\n */\n get url() {\n return this.tagValue(\"u\");\n }\n set url(value) {\n this.removeTag(\"u\");\n if (value) this.tags.push([\"u\", value]);\n }\n /**\n * Supported NUT protocols\n */\n get nuts() {\n return this.getMatchingTags(\"nuts\").map((t) => t[1]);\n }\n set nuts(values) {\n this.removeTag(\"nuts\");\n for (const value of values) {\n this.tags.push([\"nuts\", value]);\n }\n }\n /**\n * Network (mainnet/testnet/signet/regtest)\n */\n get network() {\n return this.tagValue(\"n\");\n }\n set network(value) {\n this.removeTag(\"n\");\n if (value) this.tags.push([\"n\", value]);\n }\n /**\n * Optional metadata\n */\n get metadata() {\n if (!this.content) return void 0;\n try {\n return JSON.parse(this.content);\n } catch {\n return void 0;\n }\n }\n set metadata(value) {\n if (value) {\n this.content = JSON.stringify(value);\n } else {\n this.content = \"\";\n }\n }\n};\n\n// src/events/kinds/cashu/fedimint.ts\nvar NDKFedimintMint = class _NDKFedimintMint extends NDKEvent {\n static kind = 38173 /* FedimintMintAnnouncement */;\n static kinds = [38173 /* FedimintMintAnnouncement */];\n constructor(ndk, event) {\n super(ndk, event);\n this.kind ??= 38173 /* FedimintMintAnnouncement */;\n }\n static async from(event) {\n const mint = new _NDKFedimintMint(event.ndk, event);\n return mint;\n }\n /**\n * The federation ID\n */\n get identifier() {\n return this.tagValue(\"d\");\n }\n set identifier(value) {\n this.removeTag(\"d\");\n if (value) this.tags.push([\"d\", value]);\n }\n /**\n * Invite codes (multiple allowed)\n */\n get inviteCodes() {\n return this.getMatchingTags(\"u\").map((t) => t[1]);\n }\n set inviteCodes(values) {\n this.removeTag(\"u\");\n for (const value of values) {\n this.tags.push([\"u\", value]);\n }\n }\n /**\n * Supported modules\n */\n get modules() {\n return this.getMatchingTags(\"modules\").map((t) => t[1]);\n }\n set modules(values) {\n this.removeTag(\"modules\");\n for (const value of values) {\n this.tags.push([\"modules\", value]);\n }\n }\n /**\n * Network (mainnet/testnet/signet/regtest)\n */\n get network() {\n return this.tagValue(\"n\");\n }\n set network(value) {\n this.removeTag(\"n\");\n if (value) this.tags.push([\"n\", value]);\n }\n /**\n * Optional metadata\n */\n get metadata() {\n if (!this.content) return void 0;\n try {\n return JSON.parse(this.content);\n } catch {\n return void 0;\n }\n }\n set metadata(value) {\n if (value) {\n this.content = JSON.stringify(value);\n } else {\n this.content = \"\";\n }\n }\n};\n\n// src/events/kinds/cashu/mint-recommendation.ts\nvar NDKMintRecommendation = class _NDKMintRecommendation extends NDKEvent {\n static kind = 38e3 /* EcashMintRecommendation */;\n static kinds = [38e3 /* EcashMintRecommendation */];\n constructor(ndk, event) {\n super(ndk, event);\n this.kind ??= 38e3 /* EcashMintRecommendation */;\n }\n static async from(event) {\n const recommendation = new _NDKMintRecommendation(event.ndk, event);\n return recommendation;\n }\n /**\n * Event kind being recommended (38173 for Fedimint or 38172 for Cashu)\n */\n get recommendedKind() {\n const value = this.tagValue(\"k\");\n return value ? Number(value) : void 0;\n }\n set recommendedKind(value) {\n this.removeTag(\"k\");\n if (value) this.tags.push([\"k\", value.toString()]);\n }\n /**\n * Identifier for the recommended mint event\n */\n get identifier() {\n return this.tagValue(\"d\");\n }\n set identifier(value) {\n this.removeTag(\"d\");\n if (value) this.tags.push([\"d\", value]);\n }\n /**\n * Mint connection URLs/invite codes (multiple allowed)\n */\n get urls() {\n return this.getMatchingTags(\"u\").map((t) => t[1]);\n }\n set urls(values) {\n this.removeTag(\"u\");\n for (const value of values) {\n this.tags.push([\"u\", value]);\n }\n }\n /**\n * Pointers to specific mint events\n * Returns array of {kind, identifier, relay} objects\n */\n get mintEventPointers() {\n return this.getMatchingTags(\"a\").map((t) => ({\n kind: Number(t[1].split(\":\")[0]),\n identifier: t[1].split(\":\")[2],\n relay: t[2]\n }));\n }\n /**\n * Add a pointer to a specific mint event\n */\n addMintEventPointer(kind, pubkey, identifier, relay) {\n const aTag = [`a`, `${kind}:${pubkey}:${identifier}`];\n if (relay) aTag.push(relay);\n this.tags.push(aTag);\n }\n /**\n * Review/recommendation text\n */\n get review() {\n return this.content;\n }\n set review(value) {\n this.content = value;\n }\n};\n\n// src/events/wrap.ts\nvar registeredEventClasses = /* @__PURE__ */ new Set();\nfunction registerEventClass(eventClass) {\n registeredEventClasses.add(eventClass);\n}\nfunction unregisterEventClass(eventClass) {\n registeredEventClasses.delete(eventClass);\n}\nfunction getRegisteredEventClasses() {\n return new Set(registeredEventClasses);\n}\nfunction wrapEvent(event) {\n const eventWrappingMap = /* @__PURE__ */ new Map();\n const builtInClasses = [\n NDKImage,\n NDKVideo,\n NDKCashuMintList,\n NDKArticle,\n NDKHighlight,\n NDKDraft,\n NDKWiki,\n NDKWikiMergeRequest,\n NDKNutzap,\n NDKProject,\n NDKTask,\n NDKProjectTemplate,\n NDKSimpleGroupMemberList,\n NDKSimpleGroupMetadata,\n NDKSubscriptionTier,\n NDKSubscriptionStart,\n NDKSubscriptionReceipt,\n NDKList,\n NDKRelayList,\n NDKStory,\n NDKBlossomList,\n NDKFollowPack,\n NDKThread,\n NDKRepost,\n NDKClassified,\n NDKAppHandlerEvent,\n NDKDVMJobFeedback,\n NDKCashuMint,\n NDKFedimintMint,\n NDKMintRecommendation\n ];\n const allClasses = [...builtInClasses, ...registeredEventClasses];\n for (const klass2 of allClasses) {\n for (const kind of klass2.kinds) {\n eventWrappingMap.set(kind, klass2);\n }\n }\n const klass = eventWrappingMap.get(event.kind);\n if (klass) return klass.from(event);\n return event;\n}\n\n// src/subscription/utils.ts\nimport { nip19 as nip195 } from \"nostr-tools\";\nvar MAX_SUBID_LENGTH = 20;\nfunction queryFullyFilled(subscription) {\n if (filterIncludesIds(subscription.filter)) {\n if (resultHasAllRequestedIds(subscription)) {\n return true;\n }\n }\n return false;\n}\nfunction compareFilter(filter1, filter2) {\n if (Object.keys(filter1).length !== Object.keys(filter2).length) return false;\n for (const [key, value] of Object.entries(filter1)) {\n const valuesInFilter2 = filter2[key];\n if (!valuesInFilter2) return false;\n if (Array.isArray(value) && Array.isArray(valuesInFilter2)) {\n const v = value;\n for (const valueInFilter2 of valuesInFilter2) {\n const val = valueInFilter2;\n if (!v.includes(val)) {\n return false;\n }\n }\n } else {\n if (valuesInFilter2 !== value) return false;\n }\n }\n return true;\n}\nfunction filterIncludesIds(filter) {\n return !!filter.ids;\n}\nfunction resultHasAllRequestedIds(subscription) {\n const ids = subscription.filter.ids;\n return !!ids && ids.length === subscription.eventFirstSeen.size;\n}\nfunction generateSubId(subscriptions, filters) {\n const subIds = subscriptions.map((sub) => sub.subId).filter(Boolean);\n const subIdParts = [];\n const filterNonKindKeys = /* @__PURE__ */ new Set();\n const filterKinds = /* @__PURE__ */ new Set();\n if (subIds.length > 0) {\n subIdParts.push(Array.from(new Set(subIds)).join(\",\"));\n } else {\n for (const filter of filters) {\n for (const key of Object.keys(filter)) {\n if (key === \"kinds\") {\n filter.kinds?.forEach((k) => filterKinds.add(k));\n } else {\n filterNonKindKeys.add(key);\n }\n }\n }\n if (filterKinds.size > 0) {\n subIdParts.push(`kinds:${Array.from(filterKinds).join(\",\")}`);\n }\n if (filterNonKindKeys.size > 0) {\n subIdParts.push(Array.from(filterNonKindKeys).join(\",\"));\n }\n }\n let subId = subIdParts.join(\"-\");\n if (subId.length > MAX_SUBID_LENGTH) subId = subId.substring(0, MAX_SUBID_LENGTH);\n subId += `-${Math.floor(Math.random() * 999).toString()}`;\n return subId;\n}\nfunction filterForEventsTaggingId(id) {\n try {\n const decoded = nip195.decode(id);\n switch (decoded.type) {\n case \"naddr\":\n return {\n \"#a\": [`${decoded.data.kind}:${decoded.data.pubkey}:${decoded.data.identifier}`]\n };\n case \"nevent\":\n return { \"#e\": [decoded.data.id] };\n case \"note\":\n return { \"#e\": [decoded.data] };\n case \"nprofile\":\n return { \"#p\": [decoded.data.pubkey] };\n case \"npub\":\n return { \"#p\": [decoded.data] };\n }\n } catch {\n }\n}\nfunction filterAndRelaySetFromBech32(bech322, ndk) {\n const filter = filterFromId(bech322);\n const relays = relaysFromBech32(bech322, ndk);\n if (relays.length === 0) return { filter };\n return {\n filter,\n relaySet: new NDKRelaySet(new Set(relays), ndk)\n };\n}\nfunction filterFromId(id) {\n let decoded;\n if (id.match(NIP33_A_REGEX)) {\n const [kind, pubkey, identifier] = id.split(\":\");\n const filter = {\n authors: [pubkey],\n kinds: [Number.parseInt(kind)]\n };\n if (identifier) {\n filter[\"#d\"] = [identifier];\n }\n return filter;\n }\n if (id.match(BECH32_REGEX)) {\n try {\n decoded = nip195.decode(id);\n switch (decoded.type) {\n case \"nevent\": {\n const filter = { ids: [decoded.data.id] };\n if (decoded.data.author) filter.authors = [decoded.data.author];\n if (decoded.data.kind) filter.kinds = [decoded.data.kind];\n return filter;\n }\n case \"note\":\n return { ids: [decoded.data] };\n case \"naddr\": {\n const filter = {\n authors: [decoded.data.pubkey],\n kinds: [decoded.data.kind]\n };\n if (decoded.data.identifier) filter[\"#d\"] = [decoded.data.identifier];\n return filter;\n }\n }\n } catch (e) {\n console.error(\"Error decoding\", id, e);\n }\n }\n return { ids: [id] };\n}\nfunction isNip33AValue(value) {\n return value.match(NIP33_A_REGEX) !== null;\n}\nvar NIP33_A_REGEX = /^(\\d+):([0-9A-Fa-f]+)(?::(.*))?$/;\nvar BECH32_REGEX = /^n(event|ote|profile|pub|addr)1[\\d\\w]+$/;\nfunction relaysFromBech32(bech322, ndk) {\n try {\n const decoded = nip195.decode(bech322);\n if ([\"naddr\", \"nevent\"].includes(decoded?.type)) {\n const data = decoded.data;\n if (data?.relays) {\n return data.relays.map((r) => new NDKRelay(r, ndk.relayAuthDefaultPolicy, ndk));\n }\n }\n } catch (_e) {\n }\n return [];\n}\n\n// src/utils/filter-validation.ts\nvar NDKFilterValidationMode = /* @__PURE__ */ ((NDKFilterValidationMode2) => {\n NDKFilterValidationMode2[\"VALIDATE\"] = \"validate\";\n NDKFilterValidationMode2[\"FIX\"] = \"fix\";\n NDKFilterValidationMode2[\"IGNORE\"] = \"ignore\";\n return NDKFilterValidationMode2;\n})(NDKFilterValidationMode || {});\nfunction processFilters(filters, mode = \"validate\" /* VALIDATE */, debug9) {\n if (mode === \"ignore\" /* IGNORE */) {\n return filters;\n }\n const issues = [];\n const processedFilters = filters.map((filter, index) => {\n const result = processFilter(filter, mode, index, issues, debug9);\n return result;\n });\n if (mode === \"validate\" /* VALIDATE */ && issues.length > 0) {\n throw new Error(`Invalid filter(s) detected:\n${issues.join(\"\\n\")}`);\n }\n return processedFilters;\n}\nfunction processFilter(filter, mode, filterIndex, issues, debug9) {\n const isValidating = mode === \"validate\" /* VALIDATE */;\n const cleanedFilter = isValidating ? filter : { ...filter };\n if (filter.ids) {\n const validIds = [];\n filter.ids.forEach((id, idx) => {\n if (id === void 0) {\n if (isValidating) {\n issues.push(`Filter[${filterIndex}].ids[${idx}] is undefined`);\n } else {\n debug9?.(`Fixed: Removed undefined value at ids[${idx}]`);\n }\n } else if (typeof id !== \"string\") {\n if (isValidating) {\n issues.push(`Filter[${filterIndex}].ids[${idx}] is not a string (got ${typeof id})`);\n } else {\n debug9?.(`Fixed: Removed non-string value at ids[${idx}] (was ${typeof id})`);\n }\n } else if (!/^[0-9a-f]{64}$/i.test(id)) {\n if (isValidating) {\n issues.push(`Filter[${filterIndex}].ids[${idx}] is not a valid 64-char hex string: \"${id}\"`);\n } else {\n debug9?.(`Fixed: Removed invalid hex string at ids[${idx}]`);\n }\n } else {\n validIds.push(id);\n }\n });\n if (!isValidating) {\n cleanedFilter.ids = validIds.length > 0 ? validIds : void 0;\n }\n }\n if (filter.authors) {\n const validAuthors = [];\n filter.authors.forEach((author, idx) => {\n if (author === void 0) {\n if (isValidating) {\n issues.push(`Filter[${filterIndex}].authors[${idx}] is undefined`);\n } else {\n debug9?.(`Fixed: Removed undefined value at authors[${idx}]`);\n }\n } else if (typeof author !== \"string\") {\n if (isValidating) {\n issues.push(`Filter[${filterIndex}].authors[${idx}] is not a string (got ${typeof author})`);\n } else {\n debug9?.(`Fixed: Removed non-string value at authors[${idx}] (was ${typeof author})`);\n }\n } else if (!/^[0-9a-f]{64}$/i.test(author)) {\n if (isValidating) {\n issues.push(\n `Filter[${filterIndex}].authors[${idx}] is not a valid 64-char hex pubkey: \"${author}\"`\n );\n } else {\n debug9?.(`Fixed: Removed invalid hex pubkey at authors[${idx}]`);\n }\n } else {\n validAuthors.push(author);\n }\n });\n if (!isValidating) {\n cleanedFilter.authors = validAuthors.length > 0 ? validAuthors : void 0;\n }\n }\n if (filter.kinds) {\n const validKinds = [];\n filter.kinds.forEach((kind, idx) => {\n if (kind === void 0) {\n if (isValidating) {\n issues.push(`Filter[${filterIndex}].kinds[${idx}] is undefined`);\n } else {\n debug9?.(`Fixed: Removed undefined value at kinds[${idx}]`);\n }\n } else if (typeof kind !== \"number\") {\n if (isValidating) {\n issues.push(`Filter[${filterIndex}].kinds[${idx}] is not a number (got ${typeof kind})`);\n } else {\n debug9?.(`Fixed: Removed non-number value at kinds[${idx}] (was ${typeof kind})`);\n }\n } else if (!Number.isInteger(kind)) {\n if (isValidating) {\n issues.push(`Filter[${filterIndex}].kinds[${idx}] is not an integer: ${kind}`);\n } else {\n debug9?.(`Fixed: Removed non-integer value at kinds[${idx}]: ${kind}`);\n }\n } else if (kind < 0 || kind > 65535) {\n if (isValidating) {\n issues.push(`Filter[${filterIndex}].kinds[${idx}] is out of valid range (0-65535): ${kind}`);\n } else {\n debug9?.(`Fixed: Removed out-of-range kind at kinds[${idx}]: ${kind}`);\n }\n } else {\n validKinds.push(kind);\n }\n });\n if (!isValidating) {\n cleanedFilter.kinds = validKinds.length > 0 ? validKinds : void 0;\n }\n }\n for (const key in filter) {\n if (key.startsWith(\"#\") && key.length === 2) {\n const tagValues = filter[key];\n if (Array.isArray(tagValues)) {\n const validValues = [];\n tagValues.forEach((value, idx) => {\n if (value === void 0) {\n if (isValidating) {\n issues.push(`Filter[${filterIndex}].${key}[${idx}] is undefined`);\n } else {\n debug9?.(`Fixed: Removed undefined value at ${key}[${idx}]`);\n }\n } else if (typeof value !== \"string\") {\n if (isValidating) {\n issues.push(`Filter[${filterIndex}].${key}[${idx}] is not a string (got ${typeof value})`);\n } else {\n debug9?.(`Fixed: Removed non-string value at ${key}[${idx}] (was ${typeof value})`);\n }\n } else {\n if ((key === \"#e\" || key === \"#p\") && !/^[0-9a-f]{64}$/i.test(value)) {\n if (isValidating) {\n issues.push(\n `Filter[${filterIndex}].${key}[${idx}] is not a valid 64-char hex string: \"${value}\"`\n );\n } else {\n debug9?.(`Fixed: Removed invalid hex string at ${key}[${idx}]`);\n }\n } else {\n validValues.push(value);\n }\n }\n });\n if (!isValidating) {\n cleanedFilter[key] = validValues.length > 0 ? validValues : void 0;\n }\n }\n }\n }\n if (!isValidating) {\n Object.keys(cleanedFilter).forEach((key) => {\n if (cleanedFilter[key] === void 0) {\n delete cleanedFilter[key];\n }\n });\n }\n return cleanedFilter;\n}\n\n// src/subscription/index.ts\nvar NDKSubscriptionCacheUsage = /* @__PURE__ */ ((NDKSubscriptionCacheUsage2) => {\n NDKSubscriptionCacheUsage2[\"ONLY_CACHE\"] = \"ONLY_CACHE\";\n NDKSubscriptionCacheUsage2[\"CACHE_FIRST\"] = \"CACHE_FIRST\";\n NDKSubscriptionCacheUsage2[\"PARALLEL\"] = \"PARALLEL\";\n NDKSubscriptionCacheUsage2[\"ONLY_RELAY\"] = \"ONLY_RELAY\";\n return NDKSubscriptionCacheUsage2;\n})(NDKSubscriptionCacheUsage || {});\nvar defaultOpts = {\n closeOnEose: false,\n cacheUsage: \"CACHE_FIRST\" /* CACHE_FIRST */,\n dontSaveToCache: false,\n groupable: true,\n groupableDelay: 100,\n groupableDelayType: \"at-most\",\n cacheUnconstrainFilter: [\"limit\", \"since\", \"until\"],\n includeMuted: false\n};\nvar NDKSubscription = class extends EventEmitter4 {\n subId;\n filters;\n opts;\n pool;\n skipVerification = false;\n skipValidation = false;\n /**\n * Tracks the filters as they are executed on each relay\n */\n relayFilters;\n relaySet;\n ndk;\n debug;\n /**\n * Events that have been seen by the subscription, with the time they were first seen.\n */\n eventFirstSeen = /* @__PURE__ */ new Map();\n /**\n * Relays that have sent an EOSE.\n */\n eosesSeen = /* @__PURE__ */ new Set();\n /**\n * The time the last event was received by the subscription.\n * This is used to calculate when EOSE should be emitted.\n */\n lastEventReceivedAt;\n /**\n * The most recent event timestamp from cache results.\n * This is used for addSinceFromCache functionality.\n */\n mostRecentCacheEventTimestamp;\n internalId;\n /**\n * Whether the subscription should close when all relays have reached the end of the event stream.\n */\n closeOnEose;\n /**\n * Pool monitor callback\n */\n poolMonitor;\n skipOptimisticPublishEvent = false;\n /**\n * Filters to remove when querying the cache.\n */\n cacheUnconstrainFilter;\n constructor(ndk, filters, opts, subId) {\n super();\n this.ndk = ndk;\n this.opts = { ...defaultOpts, ...opts || {} };\n this.pool = this.opts.pool || ndk.pool;\n const rawFilters = Array.isArray(filters) ? filters : [filters];\n const validationMode = ndk.filterValidationMode === \"validate\" ? \"validate\" /* VALIDATE */ : ndk.filterValidationMode === \"fix\" ? \"fix\" /* FIX */ : \"ignore\" /* IGNORE */;\n this.filters = processFilters(rawFilters, validationMode, ndk.debug);\n if (this.filters.length === 0) {\n throw new Error(\"Subscription must have at least one filter\");\n }\n this.subId = subId || this.opts.subId;\n this.internalId = Math.random().toString(36).substring(7);\n this.debug = ndk.debug.extend(`subscription[${this.opts.subId ?? this.internalId}]`);\n if (this.opts.relaySet) {\n this.relaySet = this.opts.relaySet;\n } else if (this.opts.relayUrls) {\n this.relaySet = NDKRelaySet.fromRelayUrls(this.opts.relayUrls, this.ndk);\n }\n this.skipVerification = this.opts.skipVerification || false;\n this.skipValidation = this.opts.skipValidation || false;\n this.closeOnEose = this.opts.closeOnEose || false;\n this.skipOptimisticPublishEvent = this.opts.skipOptimisticPublishEvent || false;\n this.cacheUnconstrainFilter = this.opts.cacheUnconstrainFilter;\n }\n /**\n * Returns the relays that have not yet sent an EOSE.\n */\n relaysMissingEose() {\n if (!this.relayFilters) return [];\n const relaysMissingEose = Array.from(this.relayFilters?.keys()).filter(\n (url) => !this.eosesSeen.has(this.pool.getRelay(url, false, false))\n );\n return relaysMissingEose;\n }\n /**\n * Provides access to the first filter of the subscription for\n * backwards compatibility.\n */\n get filter() {\n return this.filters[0];\n }\n get groupableDelay() {\n if (!this.isGroupable()) return void 0;\n return this.opts?.groupableDelay;\n }\n get groupableDelayType() {\n return this.opts?.groupableDelayType || \"at-most\";\n }\n isGroupable() {\n return this.opts?.groupable || false;\n }\n shouldQueryCache() {\n if (this.opts.addSinceFromCache) return true;\n if (this.opts?.cacheUsage === \"ONLY_RELAY\" /* ONLY_RELAY */) return false;\n const hasNonEphemeralKind = this.filters.some((f) => f.kinds?.some((k) => kindIsEphemeral(k)));\n if (hasNonEphemeralKind) return true;\n return true;\n }\n shouldQueryRelays() {\n return this.opts?.cacheUsage !== \"ONLY_CACHE\" /* ONLY_CACHE */;\n }\n shouldWaitForCache() {\n if (this.opts.addSinceFromCache) return true;\n return (\n // Must want to close on EOSE; subscriptions\n // that want to receive further updates must\n // always hit the relay\n !!this.opts.closeOnEose && // Cache adapter must claim to be fast\n !!this.ndk.cacheAdapter?.locking && // If explicitly told to run in parallel, then\n // we should not wait for the cache\n this.opts.cacheUsage !== \"PARALLEL\" /* PARALLEL */\n );\n }\n /**\n * Start the subscription. This is the main method that should be called\n * after creating a subscription.\n *\n * @param emitCachedEvents - Whether to emit events coming from a synchronous cache\n *\n * When using a synchronous cache, the events will be returned immediately\n * by this function. If you will use those returned events, you should\n * set emitCachedEvents to false to prevent seeing them as duplicate events.\n */\n start(emitCachedEvents = true) {\n let cacheResult;\n const updateStateFromCacheResults = (events) => {\n if (emitCachedEvents) {\n for (const event of events) {\n if (event.created_at && (!this.mostRecentCacheEventTimestamp || event.created_at > this.mostRecentCacheEventTimestamp)) {\n this.mostRecentCacheEventTimestamp = event.created_at;\n }\n this.eventReceived(event, void 0, true, false);\n }\n } else {\n cacheResult = [];\n for (const event of events) {\n if (event.created_at && (!this.mostRecentCacheEventTimestamp || event.created_at > this.mostRecentCacheEventTimestamp)) {\n this.mostRecentCacheEventTimestamp = event.created_at;\n }\n event.ndk = this.ndk;\n const e = this.opts.wrap ? wrapEvent(event) : event;\n if (!e) break;\n if (e instanceof Promise) {\n e.then((wrappedEvent) => {\n this.emitEvent(false, wrappedEvent, void 0, true, false);\n });\n break;\n }\n this.eventFirstSeen.set(e.id, Date.now());\n cacheResult.push(e);\n }\n }\n };\n const loadFromRelays = () => {\n if (this.shouldQueryRelays()) {\n this.startWithRelays();\n this.startPoolMonitor();\n } else {\n this.emit(\"eose\", this);\n }\n };\n if (this.shouldQueryCache()) {\n cacheResult = this.startWithCache();\n if (cacheResult instanceof Promise) {\n if (this.shouldWaitForCache()) {\n cacheResult.then((events) => {\n updateStateFromCacheResults(events);\n if (queryFullyFilled(this)) {\n this.emit(\"eose\", this);\n return;\n }\n loadFromRelays();\n });\n return null;\n }\n cacheResult.then((events) => {\n updateStateFromCacheResults(events);\n });\n loadFromRelays();\n return null;\n }\n updateStateFromCacheResults(cacheResult);\n if (queryFullyFilled(this)) {\n this.emit(\"eose\", this);\n } else {\n loadFromRelays();\n }\n return cacheResult;\n }\n loadFromRelays();\n return null;\n }\n /**\n * We want to monitor for new relays that are coming online, in case\n * they should be part of this subscription.\n */\n startPoolMonitor() {\n const _d = this.debug.extend(\"pool-monitor\");\n this.poolMonitor = (relay) => {\n if (this.relayFilters?.has(relay.url)) return;\n const calc = calculateRelaySetsFromFilters(this.ndk, this.filters, this.pool);\n if (calc.get(relay.url)) {\n this.relayFilters?.set(relay.url, this.filters);\n relay.subscribe(this, this.filters);\n }\n };\n this.pool.on(\"relay:connect\", this.poolMonitor);\n }\n onStopped;\n stop() {\n this.emit(\"close\", this);\n this.poolMonitor && this.pool.off(\"relay:connect\", this.poolMonitor);\n this.onStopped?.();\n }\n /**\n * @returns Whether the subscription has an authors filter.\n */\n hasAuthorsFilter() {\n return this.filters.some((f) => f.authors?.length);\n }\n startWithCache() {\n if (this.ndk.cacheAdapter?.query) {\n return this.ndk.cacheAdapter.query(this);\n }\n return [];\n }\n /**\n * Find available relays that should be part of this subscription and execute in them.\n *\n * Note that this is executed in addition to using the pool monitor, so even if the relay set\n * that is computed (i.e. we don't have any relays available), when relays come online, we will\n * check if we need to execute in them.\n */\n startWithRelays() {\n let filters = this.filters;\n if (this.opts.addSinceFromCache && this.mostRecentCacheEventTimestamp) {\n const sinceTimestamp = this.mostRecentCacheEventTimestamp + 1;\n filters = filters.map((filter) => ({\n ...filter,\n since: Math.max(filter.since || 0, sinceTimestamp)\n }));\n }\n if (!this.relaySet || this.relaySet.relays.size === 0) {\n this.relayFilters = calculateRelaySetsFromFilters(this.ndk, filters, this.pool);\n } else {\n this.relayFilters = /* @__PURE__ */ new Map();\n for (const relay of this.relaySet.relays) {\n this.relayFilters.set(relay.url, filters);\n }\n }\n for (const [relayUrl, filters2] of this.relayFilters) {\n const relay = this.pool.getRelay(relayUrl, true, true, filters2);\n relay.subscribe(this, filters2);\n }\n }\n /**\n * Refresh relay connections when outbox data becomes available.\n * This recalculates which relays should receive this subscription and\n * connects to any newly discovered relays.\n */\n refreshRelayConnections() {\n if (this.relaySet && this.relaySet.relays.size > 0) {\n return;\n }\n const updatedRelaySets = calculateRelaySetsFromFilters(this.ndk, this.filters, this.pool);\n for (const [relayUrl, filters] of updatedRelaySets) {\n if (!this.relayFilters?.has(relayUrl)) {\n this.relayFilters?.set(relayUrl, filters);\n const relay = this.pool.getRelay(relayUrl, true, true, filters);\n relay.subscribe(this, filters);\n }\n }\n }\n // EVENT handling\n /**\n * Called when an event is received from a relay or the cache\n * @param event\n * @param relay\n * @param fromCache Whether the event was received from the cache\n * @param optimisticPublish Whether this event is coming from an optimistic publish\n */\n eventReceived(event, relay, fromCache = false, optimisticPublish = false) {\n const eventId = event.id;\n const eventAlreadySeen = this.eventFirstSeen.has(eventId);\n let ndkEvent;\n if (event instanceof NDKEvent) ndkEvent = event;\n if (!eventAlreadySeen) {\n ndkEvent ??= new NDKEvent(this.ndk, event);\n ndkEvent.ndk = this.ndk;\n ndkEvent.relay = relay;\n if (!fromCache && !optimisticPublish) {\n if (!this.skipValidation) {\n if (!ndkEvent.isValid) {\n this.debug(\"Event failed validation %s from relay %s\", eventId, relay?.url);\n return;\n }\n }\n if (relay) {\n const shouldVerify = relay.shouldValidateEvent();\n if (shouldVerify && !this.skipVerification) {\n ndkEvent.relay = relay;\n if (!this.ndk.asyncSigVerification) {\n if (!ndkEvent.verifySignature(true)) {\n this.debug(\"Event failed signature validation\", event);\n this.ndk.reportInvalidSignature(ndkEvent, relay);\n return;\n }\n relay.addValidatedEvent();\n }\n } else {\n relay.addNonValidatedEvent();\n }\n }\n if (this.ndk.cacheAdapter && !this.opts.dontSaveToCache) {\n this.ndk.cacheAdapter.setEvent(ndkEvent, this.filters, relay);\n }\n }\n if (!this.opts.includeMuted && this.ndk.muteFilter(ndkEvent)) {\n this.debug(\"Event muted, skipping\");\n return;\n }\n if (!optimisticPublish || this.skipOptimisticPublishEvent !== true) {\n this.emitEvent(this.opts?.wrap ?? false, ndkEvent, relay, fromCache, optimisticPublish);\n this.eventFirstSeen.set(eventId, Date.now());\n }\n } else {\n const timeSinceFirstSeen = Date.now() - (this.eventFirstSeen.get(eventId) || 0);\n this.emit(\"event:dup\", event, relay, timeSinceFirstSeen, this, fromCache, optimisticPublish);\n if (relay) {\n const signature = verifiedSignatures.get(eventId);\n if (signature && typeof signature === \"string\") {\n if (event.sig === signature) {\n relay.addValidatedEvent();\n } else {\n const eventToReport = event instanceof NDKEvent ? event : new NDKEvent(this.ndk, event);\n this.ndk.reportInvalidSignature(eventToReport, relay);\n }\n }\n }\n }\n this.lastEventReceivedAt = Date.now();\n }\n /**\n * Optionally wraps, sync or async, and emits the event (if one comes back from the wrapper)\n */\n emitEvent(wrap, evt, relay, fromCache, optimisticPublish) {\n const wrapped = wrap ? wrapEvent(evt) : evt;\n if (wrapped instanceof Promise) {\n wrapped.then((e) => this.emitEvent(false, e, relay, fromCache, optimisticPublish));\n } else if (wrapped) {\n this.emit(\"event\", wrapped, relay, this, fromCache, optimisticPublish);\n }\n }\n closedReceived(relay, reason) {\n this.emit(\"closed\", relay, reason);\n }\n // EOSE handling\n eoseTimeout;\n eosed = false;\n eoseReceived(relay) {\n this.debug(\"EOSE received from %s\", relay.url);\n this.eosesSeen.add(relay);\n let lastEventSeen = this.lastEventReceivedAt ? Date.now() - this.lastEventReceivedAt : void 0;\n const hasSeenAllEoses = this.eosesSeen.size === this.relayFilters?.size;\n const queryFilled = queryFullyFilled(this);\n const performEose = (reason) => {\n this.debug(\"Performing EOSE: %s %d\", reason, this.eosed);\n if (this.eosed) return;\n if (this.eoseTimeout) clearTimeout(this.eoseTimeout);\n this.emit(\"eose\", this);\n this.eosed = true;\n if (this.opts?.closeOnEose) this.stop();\n };\n if (queryFilled || hasSeenAllEoses) {\n performEose(\"query filled or seen all\");\n } else if (this.relayFilters) {\n let timeToWaitForNextEose = 1e3;\n const connectedRelays = new Set(this.pool.connectedRelays().map((r) => r.url));\n const connectedRelaysWithFilters = Array.from(this.relayFilters.keys()).filter(\n (url) => connectedRelays.has(url)\n );\n if (connectedRelaysWithFilters.length === 0) {\n this.debug(\n \"No connected relays, waiting for all relays to connect\",\n Array.from(this.relayFilters.keys()).join(\", \")\n );\n return;\n }\n const percentageOfRelaysThatHaveSentEose = this.eosesSeen.size / connectedRelaysWithFilters.length;\n this.debug(\"Percentage of relays that have sent EOSE\", {\n subId: this.subId,\n percentageOfRelaysThatHaveSentEose,\n seen: this.eosesSeen.size,\n total: connectedRelaysWithFilters.length\n });\n if (this.eosesSeen.size >= 2 && percentageOfRelaysThatHaveSentEose >= 0.5) {\n timeToWaitForNextEose = timeToWaitForNextEose * (1 - percentageOfRelaysThatHaveSentEose);\n if (timeToWaitForNextEose === 0) {\n performEose(\"time to wait was 0\");\n return;\n }\n if (this.eoseTimeout) clearTimeout(this.eoseTimeout);\n const sendEoseTimeout = () => {\n lastEventSeen = this.lastEventReceivedAt ? Date.now() - this.lastEventReceivedAt : void 0;\n if (lastEventSeen !== void 0 && lastEventSeen < 20) {\n this.eoseTimeout = setTimeout(sendEoseTimeout, timeToWaitForNextEose);\n } else {\n performEose(`send eose timeout: ${timeToWaitForNextEose}`);\n }\n };\n this.eoseTimeout = setTimeout(sendEoseTimeout, timeToWaitForNextEose);\n }\n }\n }\n};\nvar kindIsEphemeral = (kind) => kind >= 2e4 && kind < 3e4;\n\n// src/user/follows.ts\nasync function follows(opts, outbox, kind = 3 /* Contacts */) {\n if (!this.ndk) throw new Error(\"NDK not set\");\n const contactListEvent = await this.ndk.fetchEvent(\n { kinds: [kind], authors: [this.pubkey] },\n opts || { groupable: false }\n );\n if (contactListEvent) {\n const pubkeys = /* @__PURE__ */ new Set();\n contactListEvent.tags.forEach((tag) => {\n if (tag[0] === \"p\") pubkeys.add(tag[1]);\n });\n if (outbox) {\n this.ndk?.outboxTracker?.trackUsers(Array.from(pubkeys));\n }\n return [...pubkeys].reduce((acc, pubkey) => {\n const user = new NDKUser({ pubkey });\n user.ndk = this.ndk;\n acc.add(user);\n return acc;\n }, /* @__PURE__ */ new Set());\n }\n return /* @__PURE__ */ new Set();\n}\n\n// src/user/nip05.ts\nvar NIP05_REGEX = /^(?:([\\w.+-]+)@)?([\\w.-]+)$/;\nasync function getNip05For(ndk, fullname, _fetch = fetch, fetchOpts = {}) {\n return await ndk.queuesNip05.add({\n id: fullname,\n func: async () => {\n if (ndk.cacheAdapter?.loadNip05) {\n const profile = await ndk.cacheAdapter.loadNip05(fullname);\n if (profile !== \"missing\") {\n if (profile) {\n const user = new NDKUser({\n pubkey: profile.pubkey,\n relayUrls: profile.relays,\n nip46Urls: profile.nip46\n });\n user.ndk = ndk;\n return user;\n }\n if (fetchOpts.cache !== \"no-cache\") {\n return null;\n }\n }\n }\n const match = fullname.match(NIP05_REGEX);\n if (!match) return null;\n const [_, name = \"_\", domain] = match;\n try {\n const res = await _fetch(`https://${domain}/.well-known/nostr.json?name=${name}`, fetchOpts);\n const { names, relays, nip46 } = parseNIP05Result(await res.json());\n const pubkey = names[name.toLowerCase()];\n let profile = null;\n if (pubkey) {\n profile = { pubkey, relays: relays?.[pubkey], nip46: nip46?.[pubkey] };\n }\n if (ndk?.cacheAdapter?.saveNip05) {\n ndk.cacheAdapter.saveNip05(fullname, profile);\n }\n return profile;\n } catch (_e) {\n if (ndk?.cacheAdapter?.saveNip05) {\n ndk?.cacheAdapter.saveNip05(fullname, null);\n }\n console.error(\"Failed to fetch NIP05 for\", fullname, _e);\n return null;\n }\n }\n });\n}\nfunction parseNIP05Result(json) {\n const result = {\n names: {}\n };\n for (const [name, pubkey] of Object.entries(json.names)) {\n if (typeof name === \"string\" && typeof pubkey === \"string\") {\n result.names[name.toLowerCase()] = pubkey;\n }\n }\n if (json.relays) {\n result.relays = {};\n for (const [pubkey, relays] of Object.entries(json.relays)) {\n if (typeof pubkey === \"string\" && Array.isArray(relays)) {\n result.relays[pubkey] = relays.filter((relay) => typeof relay === \"string\");\n }\n }\n }\n if (json.nip46) {\n result.nip46 = {};\n for (const [pubkey, nip46] of Object.entries(json.nip46)) {\n if (typeof pubkey === \"string\" && Array.isArray(nip46)) {\n result.nip46[pubkey] = nip46.filter((relay) => typeof relay === \"string\");\n }\n }\n }\n return result;\n}\n\n// src/user/profile.ts\nfunction profileFromEvent(event) {\n const profile = {};\n let payload;\n try {\n payload = JSON.parse(event.content);\n } catch (error) {\n throw new Error(`Failed to parse profile event: ${error}`);\n }\n profile.profileEvent = JSON.stringify(event.rawEvent());\n for (const key of Object.keys(payload)) {\n switch (key) {\n case \"name\":\n profile.name = payload.name;\n break;\n case \"display_name\":\n profile.displayName = payload.display_name;\n break;\n case \"image\":\n case \"picture\":\n profile.picture = payload.picture || payload.image;\n profile.image = profile.picture;\n break;\n case \"banner\":\n profile.banner = payload.banner;\n break;\n case \"bio\":\n profile.bio = payload.bio;\n break;\n case \"nip05\":\n profile.nip05 = payload.nip05;\n break;\n case \"lud06\":\n profile.lud06 = payload.lud06;\n break;\n case \"lud16\":\n profile.lud16 = payload.lud16;\n break;\n case \"about\":\n profile.about = payload.about;\n break;\n case \"website\":\n profile.website = payload.website;\n break;\n default:\n profile[key] = payload[key];\n break;\n }\n }\n profile.created_at = event.created_at;\n return profile;\n}\nfunction serializeProfile(profile) {\n const payload = {};\n for (const [key, val] of Object.entries(profile)) {\n switch (key) {\n case \"username\":\n case \"name\":\n payload.name = val;\n break;\n case \"displayName\":\n payload.display_name = val;\n break;\n case \"image\":\n case \"picture\":\n payload.picture = val;\n break;\n case \"bio\":\n case \"about\":\n payload.about = val;\n break;\n default:\n payload[key] = val;\n break;\n }\n }\n return JSON.stringify(payload);\n}\n\n// src/user/index.ts\nvar NDKUser = class _NDKUser {\n ndk;\n profile;\n profileEvent;\n _npub;\n _pubkey;\n relayUrls = [];\n nip46Urls = [];\n constructor(opts) {\n if (opts.npub) this._npub = opts.npub;\n if (opts.hexpubkey) this._pubkey = opts.hexpubkey;\n if (opts.pubkey) this._pubkey = opts.pubkey;\n if (opts.relayUrls) this.relayUrls = opts.relayUrls;\n if (opts.nip46Urls) this.nip46Urls = opts.nip46Urls;\n if (opts.nprofile) {\n try {\n const decoded = nip196.decode(opts.nprofile);\n if (decoded.type === \"nprofile\") {\n this._pubkey = decoded.data.pubkey;\n if (decoded.data.relays && decoded.data.relays.length > 0) {\n this.relayUrls.push(...decoded.data.relays);\n }\n }\n } catch (e) {\n console.error(\"Failed to decode nprofile\", e);\n }\n }\n }\n get npub() {\n if (!this._npub) {\n if (!this._pubkey) throw new Error(\"pubkey not set\");\n this._npub = nip196.npubEncode(this.pubkey);\n }\n return this._npub;\n }\n get nprofile() {\n const relays = this.profileEvent?.onRelays?.map((r) => r.url);\n return nip196.nprofileEncode({\n pubkey: this.pubkey,\n relays\n });\n }\n set npub(npub2) {\n this._npub = npub2;\n }\n /**\n * Get the user's pubkey\n * @returns {string} The user's pubkey\n */\n get pubkey() {\n if (!this._pubkey) {\n if (!this._npub) throw new Error(\"npub not set\");\n this._pubkey = nip196.decode(this.npub).data;\n }\n return this._pubkey;\n }\n /**\n * Set the user's pubkey\n * @param pubkey {string} The user's pubkey\n */\n set pubkey(pubkey) {\n this._pubkey = pubkey;\n }\n /**\n * Equivalent to NDKEvent.filters().\n * @returns {NDKFilter}\n */\n filter() {\n return { \"#p\": [this.pubkey] };\n }\n /**\n * Gets NIP-57 and NIP-61 information that this user has signaled\n *\n * @param getAll {boolean} Whether to get all zap info or just the first one\n */\n async getZapInfo(timeoutMs) {\n if (!this.ndk) throw new Error(\"No NDK instance found\");\n const promiseWithTimeout = async (promise) => {\n if (!timeoutMs) return promise;\n let timeoutId;\n const timeoutPromise = new Promise((_, reject) => {\n timeoutId = setTimeout(() => reject(new Error(\"Timeout\")), timeoutMs);\n });\n try {\n const result = await Promise.race([promise, timeoutPromise]);\n if (timeoutId) clearTimeout(timeoutId);\n return result;\n } catch (e) {\n if (e instanceof Error && e.message === \"Timeout\") {\n try {\n const result = await promise;\n return result;\n } catch (_originalError) {\n return void 0;\n }\n }\n return void 0;\n }\n };\n const [userProfile, mintListEvent] = await Promise.all([\n promiseWithTimeout(this.fetchProfile()),\n promiseWithTimeout(this.ndk.fetchEvent({ kinds: [10019 /* CashuMintList */], authors: [this.pubkey] }))\n ]);\n const res = /* @__PURE__ */ new Map();\n if (mintListEvent) {\n const mintList = NDKCashuMintList.from(mintListEvent);\n if (mintList.mints.length > 0) {\n res.set(\"nip61\", {\n mints: mintList.mints,\n relays: mintList.relays,\n p2pk: mintList.p2pk\n });\n }\n }\n if (userProfile) {\n const { lud06, lud16 } = userProfile;\n res.set(\"nip57\", { lud06, lud16 });\n }\n return res;\n }\n /**\n * Instantiate an NDKUser from a NIP-05 string\n * @param nip05Id {string} The user's NIP-05\n * @param ndk {NDK} An NDK instance\n * @param skipCache {boolean} Whether to skip the cache or not\n * @returns {NDKUser | undefined} An NDKUser if one is found for the given NIP-05, undefined otherwise.\n */\n static async fromNip05(nip05Id, ndk, skipCache = false) {\n if (!ndk) throw new Error(\"No NDK instance found\");\n const opts = {};\n if (skipCache) opts.cache = \"no-cache\";\n const profile = await getNip05For(ndk, nip05Id, ndk?.httpFetch, opts);\n if (profile) {\n const user = new _NDKUser({\n pubkey: profile.pubkey,\n relayUrls: profile.relays,\n nip46Urls: profile.nip46\n });\n user.ndk = ndk;\n return user;\n }\n }\n /**\n * Fetch a user's profile\n * @param opts {NDKSubscriptionOptions} A set of NDKSubscriptionOptions\n * @param storeProfileEvent {boolean} Whether to store the profile event or not\n * @returns User Profile\n */\n async fetchProfile(opts, storeProfileEvent = false) {\n if (!this.ndk) throw new Error(\"NDK not set\");\n let setMetadataEvent = null;\n if (this.ndk.cacheAdapter && (this.ndk.cacheAdapter.fetchProfile || this.ndk.cacheAdapter.fetchProfileSync) && opts?.cacheUsage !== \"ONLY_RELAY\" /* ONLY_RELAY */) {\n let profile = null;\n if (this.ndk.cacheAdapter.fetchProfileSync) {\n profile = this.ndk.cacheAdapter.fetchProfileSync(this.pubkey);\n } else if (this.ndk.cacheAdapter.fetchProfile) {\n profile = await this.ndk.cacheAdapter.fetchProfile(this.pubkey);\n }\n if (profile) {\n this.profile = profile;\n return profile;\n }\n }\n opts ??= {};\n opts.cacheUsage ??= \"ONLY_RELAY\" /* ONLY_RELAY */;\n opts.closeOnEose ??= true;\n opts.groupable ??= true;\n opts.groupableDelay ??= 250;\n if (!setMetadataEvent) {\n setMetadataEvent = await this.ndk.fetchEvent({ kinds: [0], authors: [this.pubkey] }, opts);\n }\n if (!setMetadataEvent) return null;\n this.profile = profileFromEvent(setMetadataEvent);\n if (storeProfileEvent && this.profile && this.ndk.cacheAdapter && this.ndk.cacheAdapter.saveProfile) {\n this.ndk.cacheAdapter.saveProfile(this.pubkey, this.profile);\n }\n return this.profile;\n }\n /**\n * Returns a set of users that this user follows.\n *\n * @deprecated Use followSet instead\n */\n follows = follows.bind(this);\n /**\n * Returns a set of pubkeys that this user follows.\n *\n * @param opts - NDKSubscriptionOptions\n * @param outbox - boolean\n * @param kind - number\n */\n async followSet(opts, outbox, kind = 3 /* Contacts */) {\n const follows2 = await this.follows(opts, outbox, kind);\n return new Set(Array.from(follows2).map((f) => f.pubkey));\n }\n /** @deprecated Use referenceTags instead. */\n /**\n * Get the tag that can be used to reference this user in an event\n * @returns {NDKTag} an NDKTag\n */\n tagReference() {\n return [\"p\", this.pubkey];\n }\n /**\n * Get the tags that can be used to reference this user in an event\n * @returns {NDKTag[]} an array of NDKTag\n */\n referenceTags(marker) {\n const tag = [[\"p\", this.pubkey]];\n if (!marker) return tag;\n tag[0].push(\"\", marker);\n return tag;\n }\n /**\n * Publishes the current profile.\n */\n async publish() {\n if (!this.ndk) throw new Error(\"No NDK instance found\");\n if (!this.profile) throw new Error(\"No profile available\");\n this.ndk.assertSigner();\n const event = new NDKEvent(this.ndk, {\n kind: 0,\n content: serializeProfile(this.profile)\n });\n await event.publish();\n }\n /**\n * Add a follow to this user's contact list\n *\n * @param newFollow {NDKUser} The user to follow\n * @param currentFollowList {Set<NDKUser>} The current follow list\n * @param kind {NDKKind} The kind to use for this contact list (defaults to `3`)\n * @returns {Promise<boolean>} True if the follow was added, false if the follow already exists\n */\n async follow(newFollow, currentFollowList, kind = 3 /* Contacts */) {\n if (!this.ndk) throw new Error(\"No NDK instance found\");\n this.ndk.assertSigner();\n if (!currentFollowList) {\n currentFollowList = await this.follows(void 0, void 0, kind);\n }\n if (currentFollowList.has(newFollow)) {\n return false;\n }\n currentFollowList.add(newFollow);\n const event = new NDKEvent(this.ndk, { kind });\n for (const follow of currentFollowList) {\n event.tag(follow);\n }\n await event.publish();\n return true;\n }\n /**\n * Remove a follow from this user's contact list\n *\n * @param user {NDKUser} The user to unfollow\n * @param currentFollowList {Set<NDKUser>} The current follow list\n * @param kind {NDKKind} The kind to use for this contact list (defaults to `3`)\n * @returns The relays were the follow list was published or false if the user wasn't found\n */\n async unfollow(user, currentFollowList, kind = 3 /* Contacts */) {\n if (!this.ndk) throw new Error(\"No NDK instance found\");\n this.ndk.assertSigner();\n if (!currentFollowList) {\n currentFollowList = await this.follows(void 0, void 0, kind);\n }\n const newUserFollowList = /* @__PURE__ */ new Set();\n let foundUser = false;\n for (const follow of currentFollowList) {\n if (follow.pubkey !== user.pubkey) {\n newUserFollowList.add(follow);\n } else {\n foundUser = true;\n }\n }\n if (!foundUser) return false;\n const event = new NDKEvent(this.ndk, { kind });\n for (const follow of newUserFollowList) {\n event.tag(follow);\n }\n return await event.publish();\n }\n /**\n * Validate a user's NIP-05 identifier (usually fetched from their kind:0 profile data)\n *\n * @param nip05Id The NIP-05 string to validate\n * @returns {Promise<boolean | null>} True if the NIP-05 is found and matches this user's pubkey,\n * False if the NIP-05 is found but doesn't match this user's pubkey,\n * null if the NIP-05 isn't found on the domain or we're unable to verify (because of network issues, etc.)\n */\n async validateNip05(nip05Id) {\n if (!this.ndk) throw new Error(\"No NDK instance found\");\n const profilePointer = await getNip05For(this.ndk, nip05Id);\n if (profilePointer === null) return null;\n return profilePointer.pubkey === this.pubkey;\n }\n};\n\n// src/user/pin.ts\nasync function pinEvent(user, event, pinEvent2, publish) {\n const kind = 10001 /* PinList */;\n if (!user.ndk) throw new Error(\"No NDK instance found\");\n user.ndk.assertSigner();\n if (!pinEvent2) {\n const events = await user.ndk.fetchEvents(\n { kinds: [kind], authors: [user.pubkey] },\n { cacheUsage: \"ONLY_RELAY\" /* ONLY_RELAY */ }\n );\n if (events.size > 0) {\n pinEvent2 = lists_default.from(Array.from(events)[0]);\n } else {\n pinEvent2 = new NDKEvent(user.ndk, {\n kind\n });\n }\n }\n pinEvent2.tag(event);\n if (publish) {\n await pinEvent2.publish();\n }\n return pinEvent2;\n}\n\n// src/events/kinds/dvm/request.ts\nvar NDKDVMRequest = class _NDKDVMRequest extends NDKEvent {\n static from(event) {\n return new _NDKDVMRequest(event.ndk, event.rawEvent());\n }\n set bid(msatAmount) {\n if (msatAmount === void 0) {\n this.removeTag(\"bid\");\n } else {\n this.tags.push([\"bid\", msatAmount.toString()]);\n }\n }\n get bid() {\n const v = this.tagValue(\"bid\");\n if (v === void 0) return void 0;\n return Number.parseInt(v);\n }\n /**\n * Adds a new input to the job\n * @param args The arguments to the input\n */\n addInput(...args) {\n this.tags.push([\"i\", ...args]);\n }\n /**\n * Adds a new parameter to the job\n */\n addParam(...args) {\n this.tags.push([\"param\", ...args]);\n }\n set output(output) {\n if (output === void 0) {\n this.removeTag(\"output\");\n } else {\n if (typeof output === \"string\") output = [output];\n this.tags.push([\"output\", ...output]);\n }\n }\n get output() {\n const outputTag = this.getMatchingTags(\"output\")[0];\n return outputTag ? outputTag.slice(1) : void 0;\n }\n get params() {\n const paramTags = this.getMatchingTags(\"param\");\n return paramTags.map((t) => t.slice(1));\n }\n getParam(name) {\n const paramTag = this.getMatchingTags(\"param\").find((t) => t[1] === name);\n return paramTag ? paramTag[2] : void 0;\n }\n createFeedback(status) {\n const feedback = new NDKDVMJobFeedback(this.ndk);\n feedback.tag(this, \"job\");\n feedback.status = status;\n return feedback;\n }\n /**\n * Enables job encryption for this event\n * @param dvm DVM that will receive the event\n * @param signer Signer to use for encryption\n */\n async encryption(dvm, signer) {\n const dvmTags = [\"i\", \"param\", \"output\", \"relays\", \"bid\"];\n const tags = this.tags.filter((t) => dvmTags.includes(t[0]));\n this.tags = this.tags.filter((t) => !dvmTags.includes(t[0]));\n this.content = JSON.stringify(tags);\n this.tag(dvm);\n this.tags.push([\"encrypted\"]);\n await this.encrypt(dvm, signer);\n }\n /**\n * Sets the DVM that will receive the event\n */\n set dvm(dvm) {\n this.removeTag(\"p\");\n if (dvm) this.tag(dvm);\n }\n};\n\n// src/events/kinds/dvm/NDKTranscriptionDVM.ts\nvar NDKTranscriptionDVM = class _NDKTranscriptionDVM extends NDKDVMRequest {\n constructor(ndk, event) {\n super(ndk, event);\n this.kind = 5e3 /* DVMReqTextExtraction */;\n }\n static from(event) {\n return new _NDKTranscriptionDVM(event.ndk, event.rawEvent());\n }\n /**\n * Returns the original source of the transcription\n */\n get url() {\n const inputTags = this.getMatchingTags(\"i\");\n if (inputTags.length !== 1) {\n return void 0;\n }\n return inputTags[0][1];\n }\n /**\n * Getter for the title tag\n */\n get title() {\n return this.tagValue(\"title\");\n }\n /**\n * Setter for the title tag\n */\n set title(value) {\n this.removeTag(\"title\");\n if (value) {\n this.tags.push([\"title\", value]);\n }\n }\n /**\n * Getter for the image tag\n */\n get image() {\n return this.tagValue(\"image\");\n }\n /**\n * Setter for the image tag\n */\n set image(value) {\n this.removeTag(\"image\");\n if (value) {\n this.tags.push([\"image\", value]);\n }\n }\n};\n\n// src/events/kinds/dvm/result.ts\nvar NDKDVMJobResult = class _NDKDVMJobResult extends NDKEvent {\n static from(event) {\n return new _NDKDVMJobResult(event.ndk, event.rawEvent());\n }\n setAmount(msat, invoice) {\n this.removeTag(\"amount\");\n const tag = [\"amount\", msat.toString()];\n if (invoice) tag.push(invoice);\n this.tags.push(tag);\n }\n set result(result) {\n if (result === void 0) {\n this.content = \"\";\n } else {\n this.content = result;\n }\n }\n get result() {\n if (this.content === \"\") {\n return void 0;\n }\n return this.content;\n }\n set status(status) {\n this.removeTag(\"status\");\n if (status !== void 0) {\n this.tags.push([\"status\", status]);\n }\n }\n get status() {\n return this.tagValue(\"status\");\n }\n get jobRequestId() {\n for (const eTag of this.getMatchingTags(\"e\")) {\n if (eTag[2] === \"job\") return eTag[1];\n }\n if (this.jobRequest) return this.jobRequest.id;\n return this.tagValue(\"e\");\n }\n set jobRequest(event) {\n this.removeTag(\"request\");\n if (event) {\n this.kind = event.kind + 1e3;\n this.tags.push([\"request\", JSON.stringify(event.rawEvent())]);\n this.tag(event);\n }\n }\n get jobRequest() {\n const tag = this.tagValue(\"request\");\n if (tag === void 0) {\n return void 0;\n }\n return new NDKEvent(this.ndk, JSON.parse(tag));\n }\n};\n\n// src/events/kinds/cashu/token.ts\nfunction proofsTotalBalance(proofs) {\n return proofs.reduce((acc, proof) => {\n if (proof.amount < 0) {\n throw new Error(\"proof amount is negative\");\n }\n return acc + proof.amount;\n }, 0);\n}\nvar NDKCashuToken = class _NDKCashuToken extends NDKEvent {\n _proofs = [];\n _mint;\n static kind = 7375 /* CashuToken */;\n static kinds = [7375 /* CashuToken */];\n /**\n * Tokens that this token superseeds\n */\n _deletes = [];\n original;\n constructor(ndk, event) {\n super(ndk, event);\n this.kind ??= 7375 /* CashuToken */;\n }\n static async from(event) {\n const token = new _NDKCashuToken(event.ndk, event);\n token.original = event;\n try {\n await token.decrypt();\n } catch {\n token.content = token.original.content;\n }\n try {\n const content = JSON.parse(token.content);\n token.proofs = content.proofs;\n token.mint = content.mint ?? token.tagValue(\"mint\");\n token.deletedTokens = content.del ?? [];\n if (!Array.isArray(token.proofs)) return;\n } catch (_e) {\n return;\n }\n return token;\n }\n get proofs() {\n return this._proofs;\n }\n set proofs(proofs) {\n const cs = /* @__PURE__ */ new Set();\n this._proofs = proofs.filter((proof) => {\n if (cs.has(proof.C)) {\n console.warn(\"Passed in proofs had duplicates, ignoring\", proof.C);\n return false;\n }\n if (proof.amount < 0) {\n console.warn(\"Invalid proof with negative amount\", proof);\n return false;\n }\n cs.add(proof.C);\n return true;\n }).map(this.cleanProof);\n }\n /**\n * Returns a minimal proof object with only essential properties\n */\n cleanProof(proof) {\n return {\n id: proof.id,\n amount: proof.amount,\n C: proof.C,\n secret: proof.secret\n };\n }\n async toNostrEvent(pubkey) {\n if (!this.ndk) throw new Error(\"no ndk\");\n if (!this.ndk.signer) throw new Error(\"no signer\");\n const payload = {\n proofs: this.proofs.map(this.cleanProof),\n mint: this.mint,\n del: this.deletedTokens ?? []\n };\n this.content = JSON.stringify(payload);\n const user = await this.ndk.signer.user();\n await this.encrypt(user, void 0, \"nip44\");\n return super.toNostrEvent(pubkey);\n }\n set mint(mint) {\n this._mint = mint;\n }\n get mint() {\n return this._mint;\n }\n /**\n * Tokens that were deleted by the creation of this token.\n */\n get deletedTokens() {\n return this._deletes;\n }\n /**\n * Marks tokens that were deleted by the creation of this token.\n */\n set deletedTokens(tokenIds) {\n this._deletes = tokenIds;\n }\n get amount() {\n return proofsTotalBalance(this.proofs);\n }\n async publish(relaySet, timeoutMs, requiredRelayCount) {\n if (this.original) {\n return this.original.publish(relaySet, timeoutMs, requiredRelayCount);\n }\n return super.publish(relaySet, timeoutMs, requiredRelayCount);\n }\n};\n\n// src/events/kinds/cashu/tx.ts\nvar MARKERS = {\n REDEEMED: \"redeemed\",\n CREATED: \"created\",\n DESTROYED: \"destroyed\",\n RESERVED: \"reserved\"\n};\nvar NDKCashuWalletTx = class _NDKCashuWalletTx extends NDKEvent {\n static MARKERS = MARKERS;\n static kind = 7376 /* CashuWalletTx */;\n static kinds = [7376 /* CashuWalletTx */];\n constructor(ndk, event) {\n super(ndk, event);\n this.kind ??= 7376 /* CashuWalletTx */;\n }\n static async from(event) {\n const walletChange = new _NDKCashuWalletTx(event.ndk, event);\n const prevContent = walletChange.content;\n try {\n await walletChange.decrypt();\n } catch (_e) {\n walletChange.content ??= prevContent;\n }\n try {\n const contentTags = JSON.parse(walletChange.content);\n walletChange.tags = [...contentTags, ...walletChange.tags];\n } catch (_e) {\n return;\n }\n return walletChange;\n }\n set direction(direction) {\n this.removeTag(\"direction\");\n if (direction) this.tags.push([\"direction\", direction]);\n }\n get direction() {\n return this.tagValue(\"direction\");\n }\n set amount(amount) {\n this.removeTag(\"amount\");\n this.tags.push([\"amount\", amount.toString()]);\n }\n get amount() {\n const val = this.tagValue(\"amount\");\n if (val === void 0) return void 0;\n return Number(val);\n }\n set fee(fee) {\n this.removeTag(\"fee\");\n this.tags.push([\"fee\", fee.toString()]);\n }\n get fee() {\n const val = this.tagValue(\"fee\");\n if (val === void 0) return void 0;\n return Number(val);\n }\n set unit(unit) {\n this.removeTag(\"unit\");\n if (unit) this.tags.push([\"unit\", unit.toString()]);\n }\n get unit() {\n return this.tagValue(\"unit\");\n }\n set description(description) {\n this.removeTag(\"description\");\n if (description) this.tags.push([\"description\", description.toString()]);\n }\n get description() {\n return this.tagValue(\"description\");\n }\n set mint(mint) {\n this.removeTag(\"mint\");\n if (mint) this.tags.push([\"mint\", mint.toString()]);\n }\n get mint() {\n return this.tagValue(\"mint\");\n }\n /**\n * Tags tokens that were created in this history event\n */\n set destroyedTokens(events) {\n for (const event of events) {\n this.tags.push(event.tagReference(MARKERS.DESTROYED));\n }\n }\n set destroyedTokenIds(ids) {\n for (const id of ids) {\n this.tags.push([\"e\", id, \"\", MARKERS.DESTROYED]);\n }\n }\n /**\n * Tags tokens that were created in this history event\n */\n set createdTokens(events) {\n for (const event of events) {\n this.tags.push(event.tagReference(MARKERS.CREATED));\n }\n }\n set reservedTokens(events) {\n for (const event of events) {\n this.tags.push(event.tagReference(MARKERS.RESERVED));\n }\n }\n addRedeemedNutzap(event) {\n this.tag(event, MARKERS.REDEEMED);\n }\n async toNostrEvent(pubkey) {\n const encryptedTags = [];\n const unencryptedTags = [];\n for (const tag of this.tags) {\n if (!this.shouldEncryptTag(tag)) {\n unencryptedTags.push(tag);\n } else {\n encryptedTags.push(tag);\n }\n }\n this.tags = unencryptedTags.filter((t) => t[0] !== \"client\");\n this.content = JSON.stringify(encryptedTags);\n const user = await this.ndk?.signer?.user();\n if (user) {\n const ownPubkey = user.pubkey;\n this.tags = this.tags.filter((t) => t[0] !== \"p\" || t[1] !== ownPubkey);\n }\n await this.encrypt(user, void 0, \"nip44\");\n return super.toNostrEvent(pubkey);\n }\n /**\n * Whether this entry includes a redemption of a Nutzap\n */\n get hasNutzapRedemption() {\n return this.getMatchingTags(\"e\", MARKERS.REDEEMED).length > 0;\n }\n shouldEncryptTag(tag) {\n const unencryptedTagNames = [\"client\"];\n if (unencryptedTagNames.includes(tag[0])) {\n return false;\n }\n if (tag[0] === \"e\" && tag[3] === MARKERS.REDEEMED) {\n return false;\n }\n if (tag[0] === \"p\") return false;\n return true;\n }\n};\n\n// src/events/gift-wrapping.ts\nimport { getEventHash as getEventHash2 } from \"nostr-tools\";\nasync function giftWrap(event, recipient, signer, params = {}) {\n let _signer = signer;\n params.scheme ??= \"nip44\";\n if (!_signer) {\n if (!event.ndk) throw new Error(\"no signer available for giftWrap\");\n _signer = event.ndk.signer;\n }\n if (!_signer) throw new Error(\"no signer\");\n if (!_signer.encryptionEnabled || !_signer.encryptionEnabled(params.scheme))\n throw new Error(\"signer is not able to giftWrap\");\n const rumor = getRumorEvent(event, params?.rumorKind);\n const seal = await getSealEvent(rumor, recipient, _signer, params.scheme);\n const wrap = await getWrapEvent(seal, recipient, params);\n return new NDKEvent(event.ndk, wrap);\n}\nasync function giftUnwrap(event, sender, signer, scheme = \"nip44\") {\n const _sender = sender || new NDKUser({ pubkey: event.pubkey });\n let _signer = signer;\n if (!_signer) {\n if (!event.ndk) throw new Error(\"no signer available for giftUnwrap\");\n _signer = event.ndk.signer;\n }\n if (!signer) throw new Error(\"no signer\");\n try {\n const seal = JSON.parse(await signer.decrypt(_sender, event.content, scheme));\n if (!seal) throw new Error(\"Failed to decrypt wrapper\");\n if (!new NDKEvent(void 0, seal).verifySignature(false))\n throw new Error(\"GiftSeal signature verification failed!\");\n const rumorSender = new NDKUser({ pubkey: seal.pubkey });\n const rumor = JSON.parse(await signer.decrypt(rumorSender, seal.content, scheme));\n if (!rumor) throw new Error(\"Failed to decrypt seal\");\n if (rumor.pubkey !== seal.pubkey) throw new Error(\"Invalid GiftWrap, sender validation failed!\");\n return new NDKEvent(event.ndk, rumor);\n } catch (_e) {\n return Promise.reject(\"Got error unwrapping event! See console log.\");\n }\n}\nfunction getRumorEvent(event, kind) {\n const rumor = event.rawEvent();\n rumor.kind = kind || rumor.kind || 14 /* PrivateDirectMessage */;\n rumor.sig = void 0;\n rumor.id = getEventHash2(rumor);\n return new NDKEvent(event.ndk, rumor);\n}\nasync function getSealEvent(rumor, recipient, signer, scheme = \"nip44\") {\n const seal = new NDKEvent(rumor.ndk);\n seal.kind = 13 /* GiftWrapSeal */;\n seal.created_at = approximateNow(5);\n seal.content = JSON.stringify(rumor.rawEvent());\n await seal.encrypt(recipient, signer, scheme);\n await seal.sign(signer);\n return seal;\n}\nasync function getWrapEvent(sealed, recipient, params, scheme = \"nip44\") {\n const signer = NDKPrivateKeySigner.generate();\n const wrap = new NDKEvent(sealed.ndk);\n wrap.kind = 1059 /* GiftWrap */;\n wrap.created_at = approximateNow(5);\n if (params?.wrapTags) wrap.tags = params.wrapTags;\n wrap.tag(recipient);\n wrap.content = JSON.stringify(sealed.rawEvent());\n await wrap.encrypt(recipient, signer, scheme);\n await wrap.sign(signer);\n return wrap;\n}\nfunction approximateNow(drift = 0) {\n return Math.round(Date.now() / 1e3 - Math.random() * 10 ** drift);\n}\n\n// src/events/kinds/simple-group/index.ts\nvar NDKSimpleGroup = class _NDKSimpleGroup {\n ndk;\n groupId;\n relaySet;\n fetchingMetadata;\n metadata;\n memberList;\n adminList;\n constructor(ndk, relaySet, groupId) {\n this.ndk = ndk;\n this.groupId = groupId ?? randomId(24);\n this.relaySet = relaySet;\n }\n get id() {\n return this.groupId;\n }\n relayUrls() {\n return this.relaySet?.relayUrls;\n }\n get name() {\n return this.metadata?.name;\n }\n get about() {\n return this.metadata?.about;\n }\n get picture() {\n return this.metadata?.picture;\n }\n get members() {\n return this.memberList?.members ?? [];\n }\n get admins() {\n return this.adminList?.members ?? [];\n }\n async getMetadata() {\n await this.ensureMetadataEvent();\n return this.metadata;\n }\n /**\n * Creates the group by publishing a kind:9007 event.\n * @param signer\n * @returns\n */\n async createGroup(signer) {\n signer ??= this.ndk.signer;\n if (!signer) throw new Error(\"No signer available\");\n const user = await signer.user();\n if (!user) throw new Error(\"No user available\");\n const event = new NDKEvent(this.ndk);\n event.kind = 9007 /* GroupAdminCreateGroup */;\n event.tags.push([\"h\", this.groupId]);\n await event.sign(signer);\n return event.publish(this.relaySet);\n }\n async setMetadata({ name, about, picture }) {\n const event = new NDKEvent(this.ndk);\n event.kind = 9002 /* GroupAdminEditMetadata */;\n event.tags.push([\"h\", this.groupId]);\n if (name) event.tags.push([\"name\", name]);\n if (about) event.tags.push([\"about\", about]);\n if (picture) event.tags.push([\"picture\", picture]);\n await event.sign();\n return event.publish(this.relaySet);\n }\n /**\n * Adds a user to the group using a kind:9000 event\n * @param user user to add\n * @param opts options\n */\n async addUser(user) {\n const addUserEvent = _NDKSimpleGroup.generateAddUserEvent(user.pubkey, this.groupId);\n addUserEvent.ndk = this.ndk;\n return addUserEvent;\n }\n async getMemberListEvent() {\n const memberList = await this.ndk.fetchEvent(\n {\n kinds: [39002 /* GroupMembers */],\n \"#d\": [this.groupId]\n },\n void 0,\n this.relaySet\n );\n if (!memberList) return null;\n return NDKSimpleGroupMemberList.from(memberList);\n }\n /**\n * Gets a list of users that belong to this group\n */\n async getMembers() {\n const members = [];\n const memberPubkeys = /* @__PURE__ */ new Set();\n const memberListEvent = await this.getMemberListEvent();\n if (!memberListEvent) return [];\n for (const pTag of memberListEvent.getMatchingTags(\"p\")) {\n const pubkey = pTag[1];\n if (memberPubkeys.has(pubkey)) continue;\n memberPubkeys.add(pubkey);\n try {\n members.push(this.ndk.getUser({ pubkey }));\n } catch {\n }\n }\n return members;\n }\n /**\n * Generates an event that lists the members of a group.\n * @param groupId\n * @returns\n */\n static generateUserListEvent(groupId) {\n const event = new NDKEvent(void 0, {\n kind: 39002 /* GroupMembers */,\n tags: [\n [\"h\", groupId],\n [\"alt\", \"Group Member List\"]\n ]\n });\n return event;\n }\n /**\n * Generates an event that adds a user to a group.\n * @param userPubkey pubkey of the user to add\n * @param groupId group to add the user to\n * @returns\n */\n static generateAddUserEvent(userPubkey, groupId) {\n const event = new NDKEvent(void 0, {\n kind: 9e3 /* GroupAdminAddUser */,\n tags: [[\"h\", groupId]]\n });\n event.tags.push([\"p\", userPubkey]);\n return event;\n }\n async requestToJoin(_pubkey, content) {\n const event = new NDKEvent(this.ndk, {\n kind: 9021 /* GroupAdminRequestJoin */,\n content: content ?? \"\",\n tags: [[\"h\", this.groupId]]\n });\n return event.publish(this.relaySet);\n }\n /**\n * Makes sure that a metadata event exists locally\n */\n async ensureMetadataEvent() {\n if (this.metadata) return;\n if (this.fetchingMetadata) return this.fetchingMetadata;\n this.fetchingMetadata = this.ndk.fetchEvent(\n {\n kinds: [39e3 /* GroupMetadata */],\n \"#d\": [this.groupId]\n },\n void 0,\n this.relaySet\n ).then((event) => {\n if (event) {\n this.metadata = NDKSimpleGroupMetadata.from(event);\n } else {\n this.metadata = new NDKSimpleGroupMetadata(this.ndk);\n this.metadata.dTag = this.groupId;\n }\n }).finally(() => {\n this.fetchingMetadata = void 0;\n }).catch(() => {\n throw new Error(`Failed to fetch metadata for group ${this.groupId}`);\n });\n return this.fetchingMetadata;\n }\n};\nfunction randomId(length) {\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n const charsLength = chars.length;\n let result = \"\";\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * charsLength));\n }\n return result;\n}\n\n// src/app-settings/index.ts\nvar NDKAppSettings = class _NDKAppSettings extends NDKEvent {\n appName;\n settings = {};\n constructor(ndk, rawEvent) {\n super(ndk, rawEvent);\n this.kind ??= 30078 /* AppSpecificData */;\n this.dTag ??= this.appName;\n if (this.content.length > 0) {\n try {\n this.settings = JSON.parse(this.content);\n } catch (error) {\n console.error(\"Error parsing app settings\", error);\n }\n }\n }\n static from(event) {\n return new _NDKAppSettings(event.ndk, event);\n }\n /**\n * Set a value for a given key.\n *\n * @param key\n * @param value\n */\n set(key, value) {\n this.settings[key] = value;\n }\n /**\n * Get a value for a given key.\n *\n * @param key\n * @returns\n */\n get(key) {\n return this.settings[key];\n }\n async publishReplaceable(relaySet, timeoutMs, requiredRelayCount) {\n this.content = JSON.stringify(this.settings);\n return super.publishReplaceable(relaySet, timeoutMs, requiredRelayCount);\n }\n};\n\n// src/relay/auth-policies.ts\nimport createDebug2 from \"debug\";\nfunction disconnect(pool, debug9) {\n debug9 ??= createDebug2(\"ndk:relay:auth-policies:disconnect\");\n return async (relay) => {\n debug9?.(`Relay ${relay.url} requested authentication, disconnecting`);\n pool.removeRelay(relay.url);\n };\n}\nasync function signAndAuth(event, relay, signer, debug9, resolve, reject) {\n try {\n await event.sign(signer);\n resolve(event);\n } catch (e) {\n debug9?.(`Failed to publish auth event to relay ${relay.url}`, e);\n reject(event);\n }\n}\nfunction signIn({ ndk, signer, debug: debug9 } = {}) {\n debug9 ??= createDebug2(\"ndk:auth-policies:signIn\");\n return async (relay, challenge) => {\n debug9?.(`Relay ${relay.url} requested authentication, signing in`);\n const event = new NDKEvent(ndk);\n event.kind = 22242 /* ClientAuth */;\n event.tags = [\n [\"relay\", relay.url],\n [\"challenge\", challenge]\n ];\n signer ??= ndk?.signer;\n return new Promise(async (resolve, reject) => {\n if (signer) {\n await signAndAuth(event, relay, signer, debug9, resolve, reject);\n } else {\n ndk?.once(\"signer:ready\", async (signer2) => {\n await signAndAuth(event, relay, signer2, debug9, resolve, reject);\n });\n }\n });\n };\n}\nvar NDKRelayAuthPolicies = {\n disconnect,\n signIn\n};\n\n// src/signers/nip07/index.ts\nimport debug6 from \"debug\";\nvar NDKNip07Signer = class _NDKNip07Signer {\n _userPromise;\n encryptionQueue = [];\n encryptionProcessing = false;\n debug;\n waitTimeout;\n _pubkey;\n ndk;\n _user;\n /**\n * @param waitTimeout - The timeout in milliseconds to wait for the NIP-07 to become available\n */\n constructor(waitTimeout = 1e3, ndk) {\n this.debug = debug6(\"ndk:nip07\");\n this.waitTimeout = waitTimeout;\n this.ndk = ndk;\n }\n get pubkey() {\n if (!this._pubkey) throw new Error(\"Not ready\");\n return this._pubkey;\n }\n async blockUntilReady() {\n await this.waitForExtension();\n const pubkey = await window.nostr?.getPublicKey();\n if (!pubkey) {\n throw new Error(\"User rejected access\");\n }\n this._pubkey = pubkey;\n let user;\n if (this.ndk) user = this.ndk.getUser({ pubkey });\n else user = new NDKUser({ pubkey });\n this._user = user;\n return user;\n }\n /**\n * Getter for the user property.\n * @returns The NDKUser instance.\n */\n async user() {\n if (!this._userPromise) {\n this._userPromise = this.blockUntilReady();\n }\n return this._userPromise;\n }\n get userSync() {\n if (!this._user) throw new Error(\"User not ready\");\n return this._user;\n }\n /**\n * Signs the given Nostr event.\n * @param event - The Nostr event to be signed.\n * @returns The signature of the signed event.\n * @throws Error if the NIP-07 is not available on the window object.\n */\n async sign(event) {\n await this.waitForExtension();\n const signedEvent = await window.nostr?.signEvent(event);\n if (!signedEvent) throw new Error(\"Failed to sign event\");\n return signedEvent.sig;\n }\n async relays(ndk) {\n await this.waitForExtension();\n const relays = await window.nostr?.getRelays?.() || {};\n const activeRelays = [];\n for (const url of Object.keys(relays)) {\n if (relays[url].read && relays[url].write) {\n activeRelays.push(url);\n }\n }\n return activeRelays.map((url) => new NDKRelay(url, ndk?.relayAuthDefaultPolicy, ndk));\n }\n async encryptionEnabled(nip) {\n const enabled = [];\n if ((!nip || nip === \"nip04\") && Boolean(window.nostr?.nip04)) enabled.push(\"nip04\");\n if ((!nip || nip === \"nip44\") && Boolean(window.nostr?.nip44)) enabled.push(\"nip44\");\n return enabled;\n }\n async encrypt(recipient, value, nip = \"nip04\") {\n if (!await this.encryptionEnabled(nip))\n throw new Error(`${nip}encryption is not available from your browser extension`);\n await this.waitForExtension();\n const recipientHexPubKey = recipient.pubkey;\n return this.queueEncryption(nip, \"encrypt\", recipientHexPubKey, value);\n }\n async decrypt(sender, value, nip = \"nip04\") {\n if (!await this.encryptionEnabled(nip))\n throw new Error(`${nip}encryption is not available from your browser extension`);\n await this.waitForExtension();\n const senderHexPubKey = sender.pubkey;\n return this.queueEncryption(nip, \"decrypt\", senderHexPubKey, value);\n }\n async queueEncryption(scheme, method, counterpartyHexpubkey, value) {\n return new Promise((resolve, reject) => {\n this.encryptionQueue.push({\n scheme,\n method,\n counterpartyHexpubkey,\n value,\n resolve,\n reject\n });\n if (!this.encryptionProcessing) {\n this.processEncryptionQueue();\n }\n });\n }\n async processEncryptionQueue(item, retries = 0) {\n if (!item && this.encryptionQueue.length === 0) {\n this.encryptionProcessing = false;\n return;\n }\n this.encryptionProcessing = true;\n const currentItem = item || this.encryptionQueue.shift();\n if (!currentItem) {\n this.encryptionProcessing = false;\n return;\n }\n const { scheme, method, counterpartyHexpubkey, value, resolve, reject } = currentItem;\n this.debug(\"Processing encryption queue item\", {\n method,\n counterpartyHexpubkey,\n value\n });\n try {\n const result = await window.nostr?.[scheme]?.[method](counterpartyHexpubkey, value);\n if (!result) throw new Error(\"Failed to encrypt/decrypt\");\n resolve(result);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes(\"call already executing\") && retries < 5) {\n this.debug(\"Retrying encryption queue item\", {\n method,\n counterpartyHexpubkey,\n value,\n retries\n });\n setTimeout(() => {\n this.processEncryptionQueue(currentItem, retries + 1);\n }, 50 * retries);\n return;\n }\n reject(error instanceof Error ? error : new Error(errorMessage));\n }\n this.processEncryptionQueue();\n }\n waitForExtension() {\n return new Promise((resolve, reject) => {\n if (window.nostr) {\n resolve();\n return;\n }\n let timerId;\n const intervalId = setInterval(() => {\n if (window.nostr) {\n clearTimeout(timerId);\n clearInterval(intervalId);\n resolve();\n }\n }, 100);\n timerId = setTimeout(() => {\n clearInterval(intervalId);\n reject(new Error(\"NIP-07 extension not available\"));\n }, this.waitTimeout);\n });\n }\n /**\n * Serializes the signer type into a storable format.\n * NIP-07 signers don't have persistent state to serialize beyond their type.\n * @returns A JSON string containing the type.\n */\n toPayload() {\n const payload = {\n type: \"nip07\",\n payload: \"\"\n // No specific payload needed for NIP-07\n };\n return JSON.stringify(payload);\n }\n /**\n * Deserializes the signer from a payload string.\n * Creates a new NDKNip07Signer instance.\n * @param payloadString The JSON string obtained from toPayload().\n * @param ndk Optional NDK instance.\n * @returns An instance of NDKNip07Signer.\n */\n static async fromPayload(payloadString, ndk) {\n const payload = JSON.parse(payloadString);\n if (payload.type !== \"nip07\") {\n throw new Error(`Invalid payload type: expected 'nip07', got ${payload.type}`);\n }\n return new _NDKNip07Signer(void 0, ndk);\n }\n};\nregisterSigner(\"nip07\", NDKNip07Signer);\n\n// src/signers/nip46/backend/index.ts\nimport { hexToBytes as hexToBytes2 } from \"@noble/hashes/utils\";\n\n// src/signers/nip46/rpc.ts\nimport { EventEmitter as EventEmitter5 } from \"tseep\";\nvar NDKNostrRpc = class extends EventEmitter5 {\n ndk;\n signer;\n relaySet;\n debug;\n encryptionType = \"nip04\";\n pool;\n constructor(ndk, signer, debug9, relayUrls) {\n super();\n this.ndk = ndk;\n this.signer = signer;\n if (relayUrls) {\n this.pool = new NDKPool(relayUrls, [], ndk, {\n debug: debug9.extend(\"rpc-pool\"),\n name: \"Nostr RPC\"\n });\n this.relaySet = new NDKRelaySet(/* @__PURE__ */ new Set(), ndk, this.pool);\n for (const url of relayUrls) {\n const relay = this.pool.getRelay(url, false, false);\n relay.authPolicy = NDKRelayAuthPolicies.signIn({ ndk, signer, debug: debug9 });\n this.relaySet.addRelay(relay);\n relay.connect();\n }\n }\n this.debug = debug9.extend(\"rpc\");\n }\n /**\n * Subscribe to a filter. This function will resolve once the subscription is ready.\n */\n subscribe(filter) {\n const sub = this.ndk.subscribe(\n filter,\n {\n closeOnEose: false,\n groupable: false,\n cacheUsage: \"ONLY_RELAY\" /* ONLY_RELAY */,\n pool: this.pool,\n relaySet: this.relaySet\n },\n false\n );\n sub.on(\"event\", async (event) => {\n try {\n const parsedEvent = await this.parseEvent(event);\n if (parsedEvent.method) {\n this.emit(\"request\", parsedEvent);\n } else {\n this.emit(`response-${parsedEvent.id}`, parsedEvent);\n this.emit(\"response\", parsedEvent);\n }\n } catch (e) {\n this.debug(\"error parsing event\", e, event.rawEvent());\n }\n });\n return new Promise((resolve) => {\n sub.on(\"eose\", () => {\n this.debug(\"eosed\");\n resolve(sub);\n });\n sub.start();\n });\n }\n async parseEvent(event) {\n if (this.encryptionType === \"nip44\" && event.content.includes(\"?iv=\")) {\n this.encryptionType = \"nip04\";\n } else if (this.encryptionType === \"nip04\" && !event.content.includes(\"?iv=\")) {\n this.encryptionType = \"nip44\";\n }\n const remoteUser = this.ndk.getUser({ pubkey: event.pubkey });\n remoteUser.ndk = this.ndk;\n let decryptedContent;\n try {\n decryptedContent = await this.signer.decrypt(remoteUser, event.content, this.encryptionType);\n } catch (_e) {\n const otherEncryptionType = this.encryptionType === \"nip04\" ? \"nip44\" : \"nip04\";\n decryptedContent = await this.signer.decrypt(remoteUser, event.content, otherEncryptionType);\n this.encryptionType = otherEncryptionType;\n }\n const parsedContent = JSON.parse(decryptedContent);\n const { id, method, params, result, error } = parsedContent;\n if (method) {\n return { id, pubkey: event.pubkey, method, params, event };\n }\n return { id, result, error, event };\n }\n async sendResponse(id, remotePubkey, result, kind = 24133 /* NostrConnect */, error) {\n const res = { id, result };\n if (error) {\n res.error = error;\n }\n const localUser = await this.signer.user();\n const remoteUser = this.ndk.getUser({ pubkey: remotePubkey });\n const event = new NDKEvent(this.ndk, {\n kind,\n content: JSON.stringify(res),\n tags: [[\"p\", remotePubkey]],\n pubkey: localUser.pubkey\n });\n event.content = await this.signer.encrypt(remoteUser, event.content, this.encryptionType);\n await event.sign(this.signer);\n await event.publish(this.relaySet);\n }\n /**\n * Sends a request.\n * @param remotePubkey\n * @param method\n * @param params\n * @param kind\n * @param id\n */\n async sendRequest(remotePubkey, method, params = [], kind = 24133, cb) {\n const id = Math.random().toString(36).substring(7);\n const localUser = await this.signer.user();\n const remoteUser = this.ndk.getUser({ pubkey: remotePubkey });\n const request = { id, method, params };\n const promise = new Promise(() => {\n const responseHandler = (response) => {\n if (response.result === \"auth_url\") {\n this.once(`response-${id}`, responseHandler);\n this.emit(\"authUrl\", response.error);\n } else if (cb) {\n cb(response);\n }\n };\n this.once(`response-${id}`, responseHandler);\n });\n const event = new NDKEvent(this.ndk, {\n kind,\n content: JSON.stringify(request),\n tags: [[\"p\", remotePubkey]],\n pubkey: localUser.pubkey\n });\n event.content = await this.signer.encrypt(remoteUser, event.content, this.encryptionType);\n await event.sign(this.signer);\n await event.publish(this.relaySet);\n return promise;\n }\n};\n\n// src/signers/nip46/backend/connect.ts\nvar ConnectEventHandlingStrategy = class {\n async handle(backend, id, remotePubkey, params) {\n const [_, token] = params;\n const debug9 = backend.debug.extend(\"connect\");\n debug9(`connection request from ${remotePubkey}`);\n if (token && backend.applyToken) {\n debug9(\"applying token\");\n await backend.applyToken(remotePubkey, token);\n }\n if (await backend.pubkeyAllowed({\n id,\n pubkey: remotePubkey,\n method: \"connect\",\n params: token\n })) {\n debug9(`connection request from ${remotePubkey} allowed`);\n return \"ack\";\n }\n debug9(`connection request from ${remotePubkey} rejected`);\n return void 0;\n }\n};\n\n// src/signers/nip46/backend/get-public-key.ts\nvar GetPublicKeyHandlingStrategy = class {\n async handle(backend, _id, _remotePubkey, _params) {\n return backend.localUser?.pubkey;\n }\n};\n\n// src/signers/nip46/backend/nip04-decrypt.ts\nvar Nip04DecryptHandlingStrategy = class {\n async handle(backend, id, remotePubkey, params) {\n const [senderPubkey, payload] = params;\n const senderUser = new NDKUser({ pubkey: senderPubkey });\n const decryptedPayload = await decrypt2(backend, id, remotePubkey, senderUser, payload);\n return decryptedPayload;\n }\n};\nasync function decrypt2(backend, id, remotePubkey, senderUser, payload) {\n if (!await backend.pubkeyAllowed({\n id,\n pubkey: remotePubkey,\n method: \"nip04_decrypt\",\n params: payload\n })) {\n backend.debug(`decrypt request from ${remotePubkey} rejected`);\n return void 0;\n }\n return await backend.signer.decrypt(senderUser, payload, \"nip04\");\n}\n\n// src/signers/nip46/backend/nip04-encrypt.ts\nvar Nip04EncryptHandlingStrategy = class {\n async handle(backend, id, remotePubkey, params) {\n const [recipientPubkey, payload] = params;\n const recipientUser = new NDKUser({ pubkey: recipientPubkey });\n const encryptedPayload = await encrypt2(backend, id, remotePubkey, recipientUser, payload);\n return encryptedPayload;\n }\n};\nasync function encrypt2(backend, id, remotePubkey, recipientUser, payload) {\n if (!await backend.pubkeyAllowed({\n id,\n pubkey: remotePubkey,\n method: \"nip04_encrypt\",\n params: payload\n })) {\n backend.debug(`encrypt request from ${remotePubkey} rejected`);\n return void 0;\n }\n return await backend.signer.encrypt(recipientUser, payload, \"nip04\");\n}\n\n// src/signers/nip46/backend/nip44-decrypt.ts\nvar Nip04DecryptHandlingStrategy2 = class {\n async handle(backend, id, remotePubkey, params) {\n const [senderPubkey, payload] = params;\n const senderUser = new NDKUser({ pubkey: senderPubkey });\n const decryptedPayload = await decrypt3(backend, id, remotePubkey, senderUser, payload);\n return decryptedPayload;\n }\n};\nasync function decrypt3(backend, id, remotePubkey, senderUser, payload) {\n if (!await backend.pubkeyAllowed({\n id,\n pubkey: remotePubkey,\n method: \"nip44_decrypt\",\n params: payload\n })) {\n backend.debug(`decrypt request from ${remotePubkey} rejected`);\n return void 0;\n }\n return await backend.signer.decrypt(senderUser, payload, \"nip44\");\n}\n\n// src/signers/nip46/backend/nip44-encrypt.ts\nvar Nip04EncryptHandlingStrategy2 = class {\n async handle(backend, id, remotePubkey, params) {\n const [recipientPubkey, payload] = params;\n const recipientUser = new NDKUser({ pubkey: recipientPubkey });\n const encryptedPayload = await encrypt3(backend, id, remotePubkey, recipientUser, payload);\n return encryptedPayload;\n }\n};\nasync function encrypt3(backend, id, remotePubkey, recipientUser, payload) {\n if (!await backend.pubkeyAllowed({\n id,\n pubkey: remotePubkey,\n method: \"nip44_encrypt\",\n params: payload\n })) {\n backend.debug(`encrypt request from ${remotePubkey} rejected`);\n return void 0;\n }\n return await backend.signer.encrypt(recipientUser, payload, \"nip44\");\n}\n\n// src/signers/nip46/backend/ping.ts\nvar PingEventHandlingStrategy = class {\n async handle(backend, id, remotePubkey, _params) {\n const debug9 = backend.debug.extend(\"ping\");\n debug9(`ping request from ${remotePubkey}`);\n if (await backend.pubkeyAllowed({ id, pubkey: remotePubkey, method: \"ping\" })) {\n debug9(`connection request from ${remotePubkey} allowed`);\n return \"pong\";\n }\n debug9(`connection request from ${remotePubkey} rejected`);\n return void 0;\n }\n};\n\n// src/signers/nip46/backend/sign-event.ts\nvar SignEventHandlingStrategy = class {\n async handle(backend, id, remotePubkey, params) {\n const event = await signEvent(backend, id, remotePubkey, params);\n if (!event) return void 0;\n return JSON.stringify(await event.toNostrEvent());\n }\n};\nasync function signEvent(backend, id, remotePubkey, params) {\n const [eventString] = params;\n backend.debug(`sign event request from ${remotePubkey}`);\n const event = new NDKEvent(backend.ndk, JSON.parse(eventString));\n backend.debug(\"event to sign\", event.rawEvent());\n if (!await backend.pubkeyAllowed({\n id,\n pubkey: remotePubkey,\n method: \"sign_event\",\n params: event\n })) {\n backend.debug(`sign event request from ${remotePubkey} rejected`);\n return void 0;\n }\n backend.debug(`sign event request from ${remotePubkey} allowed`);\n await event.sign(backend.signer);\n return event;\n}\n\n// src/signers/nip46/backend/index.ts\nvar NDKNip46Backend = class {\n ndk;\n signer;\n localUser;\n debug;\n rpc;\n permitCallback;\n relayUrls;\n /**\n * @param ndk The NDK instance to use\n * @param privateKeyOrSigner The private key or signer of the npub that wants to be published as\n * @param permitCallback Callback executed when permission is requested\n */\n constructor(ndk, privateKeyOrSigner, permitCallback, relayUrls) {\n this.ndk = ndk;\n if (privateKeyOrSigner instanceof Uint8Array) {\n this.signer = new NDKPrivateKeySigner(privateKeyOrSigner);\n } else if (privateKeyOrSigner instanceof String) {\n this.signer = new NDKPrivateKeySigner(hexToBytes2(privateKeyOrSigner));\n } else if (privateKeyOrSigner instanceof NDKPrivateKeySigner) {\n this.signer = privateKeyOrSigner;\n } else {\n throw new Error(\"Invalid signer\");\n }\n this.debug = ndk.debug.extend(\"nip46:backend\");\n this.relayUrls = relayUrls ?? Array.from(ndk.pool.relays.keys());\n this.rpc = new NDKNostrRpc(ndk, this.signer, this.debug, this.relayUrls);\n this.permitCallback = permitCallback;\n }\n /**\n * This method starts the backend, which will start listening for incoming\n * requests.\n */\n async start() {\n this.localUser = await this.signer.user();\n const sub = this.ndk.subscribe(\n {\n kinds: [24133],\n \"#p\": [this.localUser.pubkey]\n },\n { closeOnEose: false }\n );\n sub.on(\"event\", (e) => this.handleIncomingEvent(e));\n }\n handlers = {\n connect: new ConnectEventHandlingStrategy(),\n sign_event: new SignEventHandlingStrategy(),\n nip04_encrypt: new Nip04EncryptHandlingStrategy(),\n nip04_decrypt: new Nip04DecryptHandlingStrategy(),\n nip44_encrypt: new Nip04EncryptHandlingStrategy2(),\n nip44_decrypt: new Nip04DecryptHandlingStrategy2(),\n get_public_key: new GetPublicKeyHandlingStrategy(),\n ping: new PingEventHandlingStrategy()\n };\n /**\n * Enables the user to set a custom strategy for handling incoming events.\n * @param method - The method to set the strategy for\n * @param strategy - The strategy to set\n */\n setStrategy(method, strategy) {\n this.handlers[method] = strategy;\n }\n /**\n * Overload this method to apply tokens, which can\n * wrap permission sets to be applied to a pubkey.\n * @param pubkey public key to apply token to\n * @param token token to apply\n */\n async applyToken(_pubkey, _token) {\n throw new Error(\"connection token not supported\");\n }\n async handleIncomingEvent(event) {\n const { id, method, params } = await this.rpc.parseEvent(event);\n const remotePubkey = event.pubkey;\n let response;\n this.debug(\"incoming event\", { id, method, params });\n if (!event.verifySignature(false)) {\n this.debug(\"invalid signature\", event.rawEvent());\n return;\n }\n const strategy = this.handlers[method];\n if (strategy) {\n try {\n response = await strategy.handle(this, id, remotePubkey, params);\n } catch (e) {\n this.debug(\"error handling event\", e, { id, method, params });\n this.rpc.sendResponse(id, remotePubkey, \"error\", void 0, e.message);\n }\n } else {\n this.debug(\"unsupported method\", { method, params });\n }\n if (response) {\n this.debug(`sending response to ${remotePubkey}`, response);\n this.rpc.sendResponse(id, remotePubkey, response);\n } else {\n this.rpc.sendResponse(id, remotePubkey, \"error\", void 0, \"Not authorized\");\n }\n }\n /**\n * This method should be overriden by the user to allow or reject incoming\n * connections.\n */\n async pubkeyAllowed(params) {\n return this.permitCallback(params);\n }\n};\n\n// src/signers/nip46/index.ts\nimport { EventEmitter as EventEmitter6 } from \"tseep\";\n\n// src/signers/deserialization.ts\nasync function ndkSignerFromPayload(payloadString, ndk) {\n let parsed;\n try {\n parsed = JSON.parse(payloadString);\n } catch (e) {\n console.error(\"Failed to parse signer payload string\", payloadString, e);\n return void 0;\n }\n if (!parsed || typeof parsed.type !== \"string\") {\n console.error(\"Failed to parse signer payload string\", payloadString, new Error(\"Missing type field\"));\n return void 0;\n }\n const SignerClass = signerRegistry.get(parsed.type);\n if (!SignerClass) {\n throw new Error(`Unknown signer type: ${parsed.type}`);\n }\n try {\n return await SignerClass.fromPayload(payloadString, ndk);\n } catch (e) {\n const errorMsg = e instanceof Error ? e.message : String(e);\n throw new Error(`Failed to deserialize signer type ${parsed.type}: ${errorMsg}`);\n }\n}\n\n// src/signers/nip46/nostrconnect.ts\nfunction nostrConnectGenerateSecret() {\n return Math.random().toString(36).substring(2, 15);\n}\nfunction generateNostrConnectUri(pubkey, secret, relay, options) {\n const meta = {\n name: options?.name ? encodeURIComponent(options.name) : \"\",\n url: options?.url ? encodeURIComponent(options.url) : \"\",\n image: options?.image ? encodeURIComponent(options.image) : \"\",\n perms: options?.perms ? encodeURIComponent(options.perms) : \"\"\n };\n let uri = `nostrconnect://${pubkey}?image=${meta.image}&url=${meta.url}&name=${meta.name}&perms=${meta.perms}&secret=${encodeURIComponent(secret)}`;\n if (relay) {\n uri += `&relay=${encodeURIComponent(relay)}`;\n }\n return uri;\n}\n\n// src/signers/nip46/index.ts\nvar NDKNip46Signer = class _NDKNip46Signer extends EventEmitter6 {\n ndk;\n _user;\n /**\n * The pubkey of the bunker that will be providing signatures\n */\n bunkerPubkey;\n /**\n * The pubkey of the user that events will be published as\n */\n userPubkey;\n get pubkey() {\n if (!this.userPubkey) throw new Error(\"Not ready\");\n return this.userPubkey;\n }\n /**\n * An optional secret value provided to connect to the bunker\n */\n secret;\n localSigner;\n nip05;\n rpc;\n debug;\n relayUrls;\n subscription;\n /**\n * If using nostrconnect://, stores the nostrConnectURI\n */\n nostrConnectUri;\n /**\n * The random secret used for nostrconnect:// flows.\n */\n nostrConnectSecret;\n /**\n *\n * Don't instantiate this directly. Use the static methods instead.\n *\n * @example:\n * // for bunker:// flow\n * const signer = NDKNip46Signer.bunker(ndk, \"bunker://<connection-token>\")\n * const signer = NDKNip46Signer.bunker(ndk, \"<your-nip05>\"); // with nip05 flow\n * // for nostrconnect:// flow\n * const signer = NDKNip46Signer.nostrconnect(ndk, \"wss://relay.example.com\")\n *\n * @param ndk - The NDK instance to use\n * @param userOrConnectionToken - The public key, or a connection token, of the npub that wants to be published as\n * @param localSigner - The signer that will be used to request events to be signed\n */\n constructor(ndk, userOrConnectionToken, localSigner, relayUrls, nostrConnectOptions) {\n super();\n this.ndk = ndk;\n this.debug = ndk.debug.extend(\"nip46:signer\");\n this.relayUrls = relayUrls;\n if (!localSigner) {\n this.localSigner = NDKPrivateKeySigner.generate();\n } else {\n if (typeof localSigner === \"string\") {\n this.localSigner = new NDKPrivateKeySigner(localSigner);\n } else {\n this.localSigner = localSigner;\n }\n }\n if (userOrConnectionToken === false) {\n } else if (!userOrConnectionToken) {\n this.nostrconnectFlowInit(nostrConnectOptions);\n } else if (userOrConnectionToken.startsWith(\"bunker://\")) {\n this.bunkerFlowInit(userOrConnectionToken);\n } else {\n this.nip05Init(userOrConnectionToken);\n }\n this.rpc = new NDKNostrRpc(this.ndk, this.localSigner, this.debug, this.relayUrls);\n }\n /**\n * Connnect with a bunker:// flow\n * @param ndk\n * @param userOrConnectionToken bunker:// connection string\n * @param localSigner If you have previously authenticated with this signer, you can restore the session by providing the previously authenticated key\n */\n static bunker(ndk, userOrConnectionToken, localSigner) {\n return new _NDKNip46Signer(ndk, userOrConnectionToken, localSigner);\n }\n /**\n * Connect with a nostrconnect:// flow\n * @param ndk\n * @param relay - Relay used to connect with the signer\n * @param localSigner If you have previously authenticated with this signer, you can restore the session by providing the previously authenticated key\n */\n static nostrconnect(ndk, relay, localSigner, nostrConnectOptions) {\n return new _NDKNip46Signer(ndk, void 0, localSigner, [relay], nostrConnectOptions);\n }\n nostrconnectFlowInit(nostrConnectOptions) {\n this.nostrConnectSecret = nostrConnectGenerateSecret();\n const pubkey = this.localSigner.pubkey;\n this.nostrConnectUri = generateNostrConnectUri(\n pubkey,\n this.nostrConnectSecret,\n this.relayUrls?.[0],\n nostrConnectOptions\n );\n }\n bunkerFlowInit(connectionToken) {\n const bunkerUrl = new URL(connectionToken);\n const bunkerPubkey = bunkerUrl.hostname || bunkerUrl.pathname.replace(/^\\/\\//, \"\");\n const userPubkey = bunkerUrl.searchParams.get(\"pubkey\");\n const relayUrls = bunkerUrl.searchParams.getAll(\"relay\");\n const secret = bunkerUrl.searchParams.get(\"secret\");\n this.bunkerPubkey = bunkerPubkey;\n this.userPubkey = userPubkey;\n this.relayUrls = relayUrls;\n this.secret = secret;\n }\n nip05Init(nip05) {\n this.nip05 = nip05;\n }\n /**\n * We start listening for events from the bunker\n */\n async startListening() {\n if (this.subscription) return;\n const localUser = await this.localSigner.user();\n if (!localUser) throw new Error(\"Local signer not ready\");\n this.subscription = await this.rpc.subscribe({\n kinds: [24133 /* NostrConnect */],\n \"#p\": [localUser.pubkey]\n });\n }\n /**\n * Get the user that is being published as\n */\n async user() {\n if (this._user) return this._user;\n return this.blockUntilReady();\n }\n get userSync() {\n if (!this._user) throw new Error(\"Remote user not ready synchronously\");\n return this._user;\n }\n async blockUntilReadyNostrConnect() {\n return new Promise((resolve, reject) => {\n const connect = (response) => {\n if (response.result === this.nostrConnectSecret) {\n this._user = response.event.author;\n this.userPubkey = response.event.pubkey;\n this.bunkerPubkey = response.event.pubkey;\n this.rpc.off(\"response\", connect);\n resolve(this._user);\n }\n };\n this.startListening();\n this.rpc.on(\"response\", connect);\n });\n }\n async blockUntilReady() {\n if (!this.bunkerPubkey && !this.nostrConnectSecret && !this.nip05) {\n throw new Error(\"Bunker pubkey not set\");\n }\n if (this.nostrConnectSecret) return this.blockUntilReadyNostrConnect();\n if (this.nip05 && !this.userPubkey) {\n const user = await NDKUser.fromNip05(this.nip05, this.ndk);\n if (user) {\n this._user = user;\n this.userPubkey = user.pubkey;\n this.relayUrls = user.nip46Urls;\n this.rpc = new NDKNostrRpc(this.ndk, this.localSigner, this.debug, this.relayUrls);\n }\n }\n if (!this.bunkerPubkey && this.userPubkey) {\n this.bunkerPubkey = this.userPubkey;\n } else if (!this.bunkerPubkey) {\n throw new Error(\"Bunker pubkey not set\");\n }\n await this.startListening();\n this.rpc.on(\"authUrl\", (...props) => {\n this.emit(\"authUrl\", ...props);\n });\n return new Promise((resolve, reject) => {\n const connectParams = [this.userPubkey ?? \"\"];\n if (this.secret) connectParams.push(this.secret);\n if (!this.bunkerPubkey) throw new Error(\"Bunker pubkey not set\");\n this.rpc.sendRequest(this.bunkerPubkey, \"connect\", connectParams, 24133, (response) => {\n if (response.result === \"ack\") {\n this.getPublicKey().then((pubkey) => {\n this.userPubkey = pubkey;\n this._user = this.ndk.getUser({ pubkey });\n resolve(this._user);\n });\n } else {\n reject(response.error);\n }\n });\n });\n }\n stop() {\n this.subscription?.stop();\n this.subscription = void 0;\n }\n async getPublicKey() {\n if (this.userPubkey) return this.userPubkey;\n return new Promise((resolve, _reject) => {\n if (!this.bunkerPubkey) throw new Error(\"Bunker pubkey not set\");\n this.rpc.sendRequest(this.bunkerPubkey, \"get_public_key\", [], 24133, (response) => {\n resolve(response.result);\n });\n });\n }\n async encryptionEnabled(scheme) {\n if (scheme) return [scheme];\n return Promise.resolve([\"nip04\", \"nip44\"]);\n }\n async encrypt(recipient, value, scheme = \"nip04\") {\n return this.encryption(recipient, value, scheme, \"encrypt\");\n }\n async decrypt(sender, value, scheme = \"nip04\") {\n return this.encryption(sender, value, scheme, \"decrypt\");\n }\n async encryption(peer, value, scheme, method) {\n const promise = new Promise((resolve, reject) => {\n if (!this.bunkerPubkey) throw new Error(\"Bunker pubkey not set\");\n this.rpc.sendRequest(\n this.bunkerPubkey,\n `${scheme}_${method}`,\n [peer.pubkey, value],\n 24133,\n (response) => {\n if (!response.error) {\n resolve(response.result);\n } else {\n reject(response.error);\n }\n }\n );\n });\n return promise;\n }\n async sign(event) {\n const promise = new Promise((resolve, reject) => {\n if (!this.bunkerPubkey) throw new Error(\"Bunker pubkey not set\");\n this.rpc.sendRequest(\n this.bunkerPubkey,\n \"sign_event\",\n [JSON.stringify(event)],\n 24133,\n (response) => {\n if (!response.error) {\n const json = JSON.parse(response.result);\n resolve(json.sig);\n } else {\n reject(response.error);\n }\n }\n );\n });\n return promise;\n }\n /**\n * Allows creating a new account on the remote server.\n * @param username Desired username for the NIP-05\n * @param domain Desired domain for the NIP-05\n * @param email Email address to associate with this account -- Remote servers may use this for recovery\n * @returns The public key of the newly created account\n */\n async createAccount(username, domain, email) {\n await this.startListening();\n const req = [];\n if (username) req.push(username);\n if (domain) req.push(domain);\n if (email) req.push(email);\n return new Promise((resolve, reject) => {\n if (!this.bunkerPubkey) throw new Error(\"Bunker pubkey not set\");\n this.rpc.sendRequest(\n this.bunkerPubkey,\n \"create_account\",\n req,\n 24133 /* NostrConnect */,\n (response) => {\n if (!response.error) {\n const pubkey = response.result;\n resolve(pubkey);\n } else {\n reject(response.error);\n }\n }\n );\n });\n }\n /**\n * Serializes the signer's connection details and local signer state.\n * @returns A JSON string containing the type, connection info, and local signer payload.\n */\n toPayload() {\n if (!this.bunkerPubkey || !this.userPubkey) {\n throw new Error(\"NIP-46 signer is not fully initialized for serialization\");\n }\n const payload = {\n type: \"nip46\",\n payload: {\n bunkerPubkey: this.bunkerPubkey,\n userPubkey: this.userPubkey,\n relayUrls: this.relayUrls,\n secret: this.secret,\n localSignerPayload: this.localSigner.toPayload(),\n // Store nip05 if it was used for initialization, otherwise null\n nip05: this.nip05 || null\n }\n };\n return JSON.stringify(payload);\n }\n /**\n * Deserializes the signer from a payload string.\n * @param payloadString The JSON string obtained from toPayload().\n * @param ndk The NDK instance, required for NIP-46.\n * @returns An instance of NDKNip46Signer.\n */\n static async fromPayload(payloadString, ndk) {\n if (!ndk) {\n throw new Error(\"NDK instance is required to deserialize NIP-46 signer\");\n }\n const parsed = JSON.parse(payloadString);\n if (parsed.type !== \"nip46\") {\n throw new Error(`Invalid payload type: expected 'nip46', got ${parsed.type}`);\n }\n const payload = parsed.payload;\n if (!payload || typeof payload !== \"object\" || !payload.localSignerPayload) {\n throw new Error(\"Invalid payload content for nip46 signer\");\n }\n const localSigner = await ndkSignerFromPayload(payload.localSignerPayload, ndk);\n if (!localSigner) {\n throw new Error(\"Failed to deserialize local signer for NIP-46\");\n }\n if (!(localSigner instanceof NDKPrivateKeySigner)) {\n throw new Error(\"Local signer must be an instance of NDKPrivateKeySigner\");\n }\n let signer;\n signer = new _NDKNip46Signer(ndk, false, localSigner, payload.relayUrls);\n signer.userPubkey = payload.userPubkey;\n signer.bunkerPubkey = payload.bunkerPubkey;\n signer.relayUrls = payload.relayUrls;\n signer.secret = payload.secret;\n if (payload.userPubkey) {\n signer._user = new NDKUser({ pubkey: payload.userPubkey });\n if (signer._user) signer._user.ndk = ndk;\n }\n return signer;\n }\n};\nregisterSigner(\"nip46\", NDKNip46Signer);\n\n// src/dvm/schedule.ts\nfunction addRelays(event, relays) {\n const tags = [];\n if (!relays || relays.length === 0) {\n const poolRelays = event.ndk?.pool.relays;\n relays = poolRelays ? Object.keys(poolRelays) : void 0;\n }\n if (relays && relays.length > 0) tags.push([\"relays\", ...relays]);\n return tags;\n}\nasync function dvmSchedule(events, dvm, relays, encrypted = true, waitForConfirmationForMs) {\n if (!Array.isArray(events)) {\n events = [events];\n }\n const ndk = events[0].ndk;\n if (!ndk) throw new Error(\"NDK not set\");\n for (const event of events) {\n if (!event.sig) throw new Error(\"Event not signed\");\n if (!event.created_at) throw new Error(\"Event has no date\");\n if (!dvm) throw new Error(\"No DVM specified\");\n if (event.created_at <= Date.now() / 1e3) throw new Error(\"Event needs to be in the future\");\n }\n const scheduleEvent = new NDKDVMRequest(ndk, {\n kind: 5905 /* DVMEventSchedule */\n });\n for (const event of events) {\n scheduleEvent.addInput(JSON.stringify(event.rawEvent()), \"text\");\n }\n scheduleEvent.tags.push(...addRelays(events[0], relays));\n if (encrypted) {\n await scheduleEvent.encryption(dvm);\n } else {\n scheduleEvent.dvm = dvm;\n }\n await scheduleEvent.sign();\n let res;\n if (waitForConfirmationForMs) {\n res = ndk.subscribe(\n {\n kinds: [5905 /* DVMEventSchedule */ + 1e3, 7e3 /* DVMJobFeedback */],\n ...scheduleEvent.filter()\n },\n { groupable: false, closeOnEose: false }\n );\n }\n const timeoutPromise = new Promise((reject) => {\n setTimeout(() => {\n res?.stop();\n reject(\"Timeout waiting for an answer from the DVM\");\n }, waitForConfirmationForMs);\n });\n const schedulePromise = new Promise((resolve, reject) => {\n if (waitForConfirmationForMs) {\n res?.on(\"event\", async (e) => {\n res?.stop();\n if (e.kind === 7e3 /* DVMJobFeedback */) {\n const feedback = await NDKDVMJobFeedback.from(e);\n if (feedback.status === \"error\") {\n const statusTag = feedback.getMatchingTags(\"status\");\n reject(statusTag?.[2] ?? feedback);\n } else {\n resolve(feedback);\n }\n }\n resolve(e);\n });\n }\n scheduleEvent.publish().then(() => {\n if (!waitForConfirmationForMs) resolve(void 0);\n });\n });\n return new Promise((resolve, reject) => {\n if (waitForConfirmationForMs) {\n Promise.race([timeoutPromise, schedulePromise]).then((e) => {\n resolve(e);\n }).catch(reject);\n } else {\n schedulePromise.then(resolve);\n }\n });\n}\n\n// src/ndk/index.ts\nimport debug8 from \"debug\";\nimport { nip19 as nip198 } from \"nostr-tools\";\nimport { EventEmitter as EventEmitter8 } from \"tseep\";\n\n// src/events/dedup.ts\nfunction dedup(event1, event2) {\n if (event1.created_at > event2.created_at) {\n return event1;\n }\n return event2;\n}\n\n// src/outbox/tracker.ts\nimport { EventEmitter as EventEmitter7 } from \"tseep\";\nimport { LRUCache as LRUCache2 } from \"typescript-lru-cache\";\n\n// src/utils/get-users-relay-list.ts\nasync function getRelayListForUser(pubkey, ndk) {\n const list = await getRelayListForUsers([pubkey], ndk);\n return list.get(pubkey);\n}\nasync function getRelayListForUsers(pubkeys, ndk, skipCache = false, timeout = 1e3, relayHints) {\n const pool = ndk.outboxPool || ndk.pool;\n const set = /* @__PURE__ */ new Set();\n for (const relay of pool.relays.values()) set.add(relay);\n if (relayHints) {\n for (const hints of relayHints.values()) {\n for (const url of hints) {\n const relay = pool.getRelay(url, true, true);\n if (relay) set.add(relay);\n }\n }\n }\n const relayLists = /* @__PURE__ */ new Map();\n const fromContactList = /* @__PURE__ */ new Map();\n const relaySet = new NDKRelaySet(set, ndk);\n if (ndk.cacheAdapter?.locking && !skipCache) {\n const cachedList = await ndk.fetchEvents(\n { kinds: [3, 10002], authors: Array.from(new Set(pubkeys)) },\n { cacheUsage: \"ONLY_CACHE\" /* ONLY_CACHE */, subId: \"ndk-relay-list-fetch\" }\n );\n for (const relayList of cachedList) {\n if (relayList.kind === 10002) relayLists.set(relayList.pubkey, NDKRelayList.from(relayList));\n }\n for (const relayList of cachedList) {\n if (relayList.kind === 3) {\n if (relayLists.has(relayList.pubkey)) continue;\n const list = relayListFromKind3(ndk, relayList);\n if (list) fromContactList.set(relayList.pubkey, list);\n }\n }\n pubkeys = pubkeys.filter((pubkey) => !relayLists.has(pubkey) && !fromContactList.has(pubkey));\n }\n if (pubkeys.length === 0) return relayLists;\n const relayListEvents = /* @__PURE__ */ new Map();\n const contactListEvents = /* @__PURE__ */ new Map();\n return new Promise((resolve) => {\n const handleSubscription = async () => {\n const subscribeOpts = {\n closeOnEose: true,\n pool,\n groupable: true,\n subId: \"ndk-relay-list-fetch\",\n addSinceFromCache: true,\n relaySet\n };\n if (relaySet) subscribeOpts.relaySet = relaySet;\n const sub = ndk.subscribe({ kinds: [3, 10002], authors: pubkeys }, subscribeOpts, {\n onEvent: (event) => {\n if (event.kind === 10002 /* RelayList */) {\n const existingEvent = relayListEvents.get(event.pubkey);\n if (existingEvent && existingEvent.created_at > event.created_at) return;\n relayListEvents.set(event.pubkey, event);\n } else if (event.kind === 3 /* Contacts */) {\n const existingEvent = contactListEvents.get(event.pubkey);\n if (existingEvent && existingEvent.created_at > event.created_at) return;\n contactListEvents.set(event.pubkey, event);\n }\n },\n onEose: () => {\n for (const event of relayListEvents.values()) {\n relayLists.set(event.pubkey, NDKRelayList.from(event));\n }\n for (const pubkey of pubkeys) {\n if (relayLists.has(pubkey)) continue;\n const contactList = contactListEvents.get(pubkey);\n if (!contactList) continue;\n const list = relayListFromKind3(ndk, contactList);\n if (list) relayLists.set(pubkey, list);\n }\n resolve(relayLists);\n }\n });\n setTimeout(() => {\n resolve(relayLists);\n }, timeout);\n };\n handleSubscription();\n });\n}\n\n// src/outbox/tracker.ts\nvar OutboxItem = class {\n /**\n * Type of item\n */\n type;\n /**\n * The relay URLs that are of interest to this item\n */\n relayUrlScores;\n readRelays;\n writeRelays;\n constructor(type) {\n this.type = type;\n this.relayUrlScores = /* @__PURE__ */ new Map();\n this.readRelays = /* @__PURE__ */ new Set();\n this.writeRelays = /* @__PURE__ */ new Set();\n }\n};\nvar OutboxTracker = class extends EventEmitter7 {\n data;\n ndk;\n debug;\n constructor(ndk) {\n super();\n this.ndk = ndk;\n this.debug = ndk.debug.extend(\"outbox-tracker\");\n this.data = new LRUCache2({\n maxSize: 1e5,\n entryExpirationTimeInMS: 2 * 60 * 1e3\n });\n }\n /**\n * Adds a list of users to the tracker.\n * @param items\n * @param skipCache\n */\n async trackUsers(items, skipCache = false) {\n const promises = [];\n for (let i = 0; i < items.length; i += 400) {\n const slice = items.slice(i, i + 400);\n const pubkeys = slice.map((item) => getKeyFromItem(item)).filter((pubkey) => !this.data.has(pubkey));\n if (pubkeys.length === 0) continue;\n for (const pubkey of pubkeys) {\n this.data.set(pubkey, new OutboxItem(\"user\"));\n }\n const relayHints = /* @__PURE__ */ new Map();\n for (const item of slice) {\n if (item instanceof NDKUser && item.relayUrls.length > 0) {\n relayHints.set(item.pubkey, item.relayUrls);\n }\n }\n promises.push(\n new Promise((resolve) => {\n getRelayListForUsers(pubkeys, this.ndk, skipCache, 1e3, relayHints).then((relayLists) => {\n for (const [pubkey, relayList] of relayLists) {\n let outboxItem = this.data.get(pubkey);\n outboxItem ??= new OutboxItem(\"user\");\n if (relayList) {\n outboxItem.readRelays = new Set(normalize(relayList.readRelayUrls));\n outboxItem.writeRelays = new Set(normalize(relayList.writeRelayUrls));\n for (const relayUrl of outboxItem.readRelays) {\n if (this.ndk.pool.blacklistRelayUrls.has(relayUrl)) {\n outboxItem.readRelays.delete(relayUrl);\n }\n }\n for (const relayUrl of outboxItem.writeRelays) {\n if (this.ndk.pool.blacklistRelayUrls.has(relayUrl)) {\n outboxItem.writeRelays.delete(relayUrl);\n }\n }\n this.data.set(pubkey, outboxItem);\n this.emit(\"user:relay-list-updated\", pubkey, outboxItem);\n this.debug(\n `Adding ${outboxItem.readRelays.size} read relays and ${outboxItem.writeRelays.size} write relays for ${pubkey}`,\n relayList?.rawEvent()\n );\n }\n }\n }).finally(resolve);\n })\n );\n }\n return Promise.all(promises);\n }\n /**\n *\n * @param key\n * @param score\n */\n track(item, type, _skipCache = true) {\n const key = getKeyFromItem(item);\n type ??= getTypeFromItem(item);\n let outboxItem = this.data.get(key);\n if (!outboxItem) {\n outboxItem = new OutboxItem(type);\n if (item instanceof NDKUser) {\n this.trackUsers([item]);\n }\n }\n return outboxItem;\n }\n};\nfunction getKeyFromItem(item) {\n if (item instanceof NDKUser) {\n return item.pubkey;\n }\n return item;\n}\nfunction getTypeFromItem(item) {\n if (item instanceof NDKUser) {\n return \"user\";\n }\n return \"kind\";\n}\n\n// src/relay/sets/utils.ts\nfunction correctRelaySet(relaySet, pool) {\n const connectedRelays = pool.connectedRelays();\n const includesConnectedRelay = Array.from(relaySet.relays).some((relay) => {\n return connectedRelays.map((r) => r.url).includes(relay.url);\n });\n if (!includesConnectedRelay) {\n for (const relay of connectedRelays) {\n relaySet.addRelay(relay);\n }\n }\n if (connectedRelays.length === 0) {\n for (const relay of pool.relays.values()) {\n relaySet.addRelay(relay);\n }\n }\n return relaySet;\n}\n\n// src/subscription/manager.ts\nimport { matchFilters } from \"nostr-tools\";\nvar NDKSubscriptionManager = class {\n subscriptions;\n seenEvents = /* @__PURE__ */ new Map();\n constructor() {\n this.subscriptions = /* @__PURE__ */ new Map();\n }\n add(sub) {\n this.subscriptions.set(sub.internalId, sub);\n if (sub.onStopped) {\n }\n sub.onStopped = () => {\n this.subscriptions.delete(sub.internalId);\n };\n sub.on(\"close\", () => {\n this.subscriptions.delete(sub.internalId);\n });\n }\n seenEvent(eventId, relay) {\n const current = this.seenEvents.get(eventId) || [];\n current.push(relay);\n this.seenEvents.set(eventId, current);\n }\n /**\n * Whenever an event comes in, this function is called.\n * This function matches the received event against all the\n * known (i.e. active) NDKSubscriptions, and if it matches,\n * it sends the event to the subscription.\n *\n * This is the single place in the codebase that matches\n * incoming events with parties interested in the event.\n *\n * This is also what allows for reactivity in NDK apps, such that\n * whenever an active subscription receives an event that some\n * other active subscription would want to receive, both receive it.\n *\n * TODO This also allows for subscriptions that overlap in meaning\n * to be collapsed into one.\n *\n * I.e. if a subscription with filter: kinds: [1], authors: [alice]\n * is created and EOSEs, and then a subsequent subscription with\n * kinds: [1], authors: [alice] is created, once the second subscription\n * EOSEs we can safely close it, increment its refCount and close it,\n * and when the first subscription receives a new event from Alice this\n * code will make the second subscription receive the event even though\n * it has no active subscription on a relay.\n * @param event Raw event received from a relay\n * @param relay Relay that sent the event\n * @param optimisticPublish Whether the event is coming from an optimistic publish\n */\n dispatchEvent(event, relay, optimisticPublish = false) {\n if (relay) this.seenEvent(event.id, relay);\n const subscriptions = this.subscriptions.values();\n const matchingSubs = [];\n for (const sub of subscriptions) {\n if (matchFilters(sub.filters, event)) {\n matchingSubs.push(sub);\n }\n }\n for (const sub of matchingSubs) {\n sub.eventReceived(event, relay, false, optimisticPublish);\n }\n }\n};\n\n// src/ndk/active-user.ts\nimport createDebug3 from \"debug\";\nvar debug7 = createDebug3(\"ndk:active-user\");\nasync function getUserRelayList(user) {\n if (!this.autoConnectUserRelays) return;\n const userRelays = await getRelayListForUser(user.pubkey, this);\n if (!userRelays) return;\n for (const url of userRelays.relays) {\n let relay = this.pool.relays.get(url);\n if (!relay) {\n relay = new NDKRelay(url, this.relayAuthDefaultPolicy, this);\n this.pool.addRelay(relay);\n }\n }\n return userRelays;\n}\nasync function setActiveUser(user) {\n const pool = this.outboxPool || this.pool;\n if (pool.connectedRelays.length > 0) {\n setActiveUserConnected.call(this, user);\n } else {\n pool.once(\"connect\", () => {\n setActiveUserConnected.call(this, user);\n });\n }\n}\nasync function setActiveUserConnected(user) {\n const userRelays = await getUserRelayList.call(this, user);\n const filters = [\n {\n kinds: [10006 /* BlockRelayList */],\n authors: [user.pubkey]\n }\n ];\n if (this.autoFetchUserMutelist) {\n filters[0].kinds?.push(1e4 /* MuteList */);\n }\n const events = /* @__PURE__ */ new Map();\n const relaySet = userRelays ? userRelays.relaySet : void 0;\n this.subscribe(\n filters,\n { subId: \"active-user-settings\", closeOnEose: true, relaySet },\n {\n onEvent: (event) => {\n const prevEvent = events.get(event.kind);\n if (prevEvent && prevEvent.created_at >= event.created_at) return;\n events.set(event.kind, event);\n },\n onEose: () => {\n for (const event of events.values()) {\n processEvent.call(this, event);\n }\n }\n }\n );\n}\nasync function processEvent(event) {\n if (event.kind === 10006 /* BlockRelayList */) {\n processBlockRelayList.call(this, event);\n } else if (event.kind === 1e4 /* MuteList */) {\n processMuteList.call(this, event);\n }\n}\nfunction processBlockRelayList(event) {\n const list = lists_default.from(event);\n for (const item of list.items) {\n this.pool.blacklistRelayUrls.add(item[0]);\n }\n debug7(\"Added %d relays to relay blacklist\", list.items.length);\n}\nfunction processMuteList(muteList) {\n const list = lists_default.from(muteList);\n for (const item of list.items) {\n this.mutedIds.set(item[1], item[0]);\n }\n debug7(\"Added %d users to mute list\", list.items.length);\n}\n\n// src/ndk/entity.ts\nimport { nip19 as nip197 } from \"nostr-tools\";\nfunction getEntity(entity) {\n try {\n const decoded = nip197.decode(entity);\n if (decoded.type === \"npub\") return npub(this, decoded.data);\n if (decoded.type === \"nprofile\") return nprofile(this, decoded.data);\n return decoded;\n } catch (_e) {\n return null;\n }\n}\nfunction npub(ndk, pubkey) {\n return ndk.getUser({ pubkey });\n}\nfunction nprofile(ndk, profile) {\n const user = ndk.getUser({ pubkey: profile.pubkey });\n if (profile.relays) user.relayUrls = profile.relays;\n return user;\n}\n\n// src/ndk/fetch-event-from-tag.ts\nfunction isValidHint(hint) {\n if (!hint || hint === \"\") return false;\n try {\n new URL(hint);\n return true;\n } catch (_e) {\n return false;\n }\n}\nasync function fetchEventFromTag(tag, originalEvent, subOpts, fallback = {\n type: \"timeout\"\n}) {\n const d4 = this.debug.extend(\"fetch-event-from-tag\");\n const [_, id, hint] = tag;\n subOpts = {};\n d4(\"fetching event from tag\", tag, subOpts, fallback);\n const authorRelays = getRelaysForSync(this, originalEvent.pubkey);\n if (authorRelays && authorRelays.size > 0) {\n d4(\"fetching event from author relays %o\", Array.from(authorRelays));\n const relaySet2 = NDKRelaySet.fromRelayUrls(Array.from(authorRelays), this);\n const event2 = await this.fetchEvent(id, subOpts, relaySet2);\n if (event2) return event2;\n } else {\n d4(\"no author relays found for %s\", originalEvent.pubkey, originalEvent);\n }\n const relaySet = calculateRelaySetsFromFilters(this, [{ ids: [id] }], this.pool);\n d4(\"fetching event without relay hint\", relaySet);\n const event = await this.fetchEvent(id, subOpts);\n if (event) return event;\n if (hint && hint !== \"\") {\n const event2 = await this.fetchEvent(id, subOpts, this.pool.getRelay(hint, true, true, [{ ids: [id] }]));\n if (event2) return event2;\n }\n let result = void 0;\n const relay = isValidHint(hint) ? this.pool.getRelay(hint, false, true, [{ ids: [id] }]) : void 0;\n const fetchMaybeWithRelayHint = new Promise((resolve) => {\n this.fetchEvent(id, subOpts, relay).then(resolve);\n });\n if (!isValidHint(hint) || fallback.type === \"none\") {\n return fetchMaybeWithRelayHint;\n }\n const fallbackFetchPromise = new Promise(async (resolve) => {\n const fallbackRelaySet = fallback.relaySet;\n const timeout = fallback.timeout ?? 1500;\n const timeoutPromise = new Promise((resolve2) => setTimeout(resolve2, timeout));\n if (fallback.type === \"timeout\") await timeoutPromise;\n if (result) {\n resolve(result);\n } else {\n d4(\"fallback fetch triggered\");\n const fallbackEvent = await this.fetchEvent(id, subOpts, fallbackRelaySet);\n resolve(fallbackEvent);\n }\n });\n switch (fallback.type) {\n case \"timeout\":\n return Promise.race([fetchMaybeWithRelayHint, fallbackFetchPromise]);\n case \"eose\":\n result = await fetchMaybeWithRelayHint;\n if (result) return result;\n return fallbackFetchPromise;\n }\n}\n\n// src/ndk/queue/index.ts\nvar Queue = class {\n queue = [];\n maxConcurrency;\n processing = /* @__PURE__ */ new Set();\n promises = /* @__PURE__ */ new Map();\n constructor(_name, maxConcurrency) {\n this.maxConcurrency = maxConcurrency;\n }\n add(item) {\n if (this.promises.has(item.id)) {\n return this.promises.get(item.id);\n }\n const promise = new Promise((resolve, reject) => {\n this.queue.push({\n ...item,\n func: () => item.func().then(\n (result) => {\n resolve(result);\n return result;\n },\n (error) => {\n reject(error);\n throw error;\n }\n )\n });\n this.process();\n });\n this.promises.set(item.id, promise);\n promise.finally(() => {\n this.promises.delete(item.id);\n this.processing.delete(item.id);\n this.process();\n });\n return promise;\n }\n process() {\n if (this.processing.size >= this.maxConcurrency || this.queue.length === 0) {\n return;\n }\n const item = this.queue.shift();\n if (!item || this.processing.has(item.id)) {\n return;\n }\n this.processing.add(item.id);\n item.func();\n }\n clear() {\n this.queue = [];\n }\n clearProcessing() {\n this.processing.clear();\n }\n clearAll() {\n this.clear();\n this.clearProcessing();\n }\n length() {\n return this.queue.length;\n }\n};\n\n// src/ndk/index.ts\nvar DEFAULT_OUTBOX_RELAYS = [\"wss://purplepag.es/\", \"wss://nos.lol/\"];\nvar DEFAULT_BLACKLISTED_RELAYS = [\n \"wss://brb.io/\",\n // BRB\n \"wss://nostr.mutinywallet.com/\"\n // Don't try to read from this relay since it's a write-only relay\n // \"wss://purplepag.es/\", // This is a hack, since this is a mostly read-only relay, but not fully. Once we have relay routing this can be removed so it only receives the supported kinds\n];\nvar NDK = class extends EventEmitter8 {\n _explicitRelayUrls;\n blacklistRelayUrls;\n pool;\n outboxPool;\n _signer;\n _activeUser;\n cacheAdapter;\n debug;\n devWriteRelaySet;\n outboxTracker;\n mutedIds;\n muteFilter;\n clientName;\n clientNip89;\n queuesZapConfig;\n queuesNip05;\n asyncSigVerification = false;\n initialValidationRatio = 1;\n lowestValidationRatio = 0.1;\n validationRatioFn;\n autoBlacklistInvalidRelays = false;\n filterValidationMode = \"validate\";\n subManager;\n /**\n * Private storage for the signature verification function\n */\n _signatureVerificationFunction;\n /**\n * Private storage for the signature verification worker\n */\n _signatureVerificationWorker;\n /**\n * Rolling total of time spent (in ms) performing signature verifications.\n * Users can read this to monitor or display aggregate verification cost.\n */\n signatureVerificationTimeMs = 0;\n publishingFailureHandled = false;\n pools = [];\n /**\n * Default relay-auth policy that will be used when a relay requests authentication,\n * if no other policy is specified for that relay.\n *\n * @example Disconnect from relays that request authentication:\n * ```typescript\n * ndk.relayAuthDefaultPolicy = NDKAuthPolicies.disconnect(ndk.pool);\n * ```\n *\n * @example Sign in to relays that request authentication:\n * ```typescript\n * ndk.relayAuthDefaultPolicy = NDKAuthPolicies.signIn({ndk})\n * ```\n *\n * @example Sign in to relays that request authentication, asking the user for confirmation:\n * ```typescript\n * ndk.relayAuthDefaultPolicy = (relay: NDKRelay) => {\n * const signIn = NDKAuthPolicies.signIn({ndk});\n * if (confirm(`Relay ${relay.url} is requesting authentication, do you want to sign in?`)) {\n * signIn(relay);\n * }\n * }\n * ```\n */\n relayAuthDefaultPolicy;\n /**\n * Fetch function to use for HTTP requests.\n *\n * @example\n * ```typescript\n * import fetch from \"node-fetch\";\n *\n * ndk.httpFetch = fetch;\n * ```\n */\n httpFetch;\n /**\n * Provide a caller function to receive all networking traffic from relays\n */\n netDebug;\n autoConnectUserRelays = true;\n autoFetchUserMutelist = true;\n walletConfig;\n constructor(opts = {}) {\n super();\n this.debug = opts.debug || debug8(\"ndk\");\n this.netDebug = opts.netDebug;\n this._explicitRelayUrls = opts.explicitRelayUrls || [];\n this.blacklistRelayUrls = opts.blacklistRelayUrls || DEFAULT_BLACKLISTED_RELAYS;\n this.subManager = new NDKSubscriptionManager();\n this.pool = new NDKPool(opts.explicitRelayUrls || [], [], this);\n this.pool.name = \"Main\";\n this.pool.on(\"relay:auth\", async (relay, challenge) => {\n if (this.relayAuthDefaultPolicy) {\n await this.relayAuthDefaultPolicy(relay, challenge);\n }\n });\n this.autoConnectUserRelays = opts.autoConnectUserRelays ?? true;\n this.autoFetchUserMutelist = opts.autoFetchUserMutelist ?? true;\n this.clientName = opts.clientName;\n this.clientNip89 = opts.clientNip89;\n this.relayAuthDefaultPolicy = opts.relayAuthDefaultPolicy;\n if (opts.enableOutboxModel) {\n this.outboxPool = new NDKPool(opts.outboxRelayUrls || DEFAULT_OUTBOX_RELAYS, [], this, {\n debug: this.debug.extend(\"outbox-pool\"),\n name: \"Outbox Pool\"\n });\n this.outboxTracker = new OutboxTracker(this);\n this.outboxTracker.on(\"user:relay-list-updated\", (pubkey, outboxItem) => {\n this.debug(`Outbox relay list updated for ${pubkey}`);\n for (const subscription of this.subManager.subscriptions.values()) {\n const isRelevant = subscription.filters.some(\n (filter) => filter.authors && filter.authors.includes(pubkey)\n );\n if (isRelevant && typeof subscription.refreshRelayConnections === \"function\") {\n this.debug(`Refreshing relay connections for subscription ${subscription.internalId}`);\n subscription.refreshRelayConnections();\n }\n }\n });\n }\n this.signer = opts.signer;\n this.cacheAdapter = opts.cacheAdapter;\n this.mutedIds = opts.mutedIds || /* @__PURE__ */ new Map();\n this.muteFilter = opts.muteFilter || ((event) => {\n if (this.mutedIds.has(event.pubkey)) return true;\n if (event.id && this.mutedIds.has(event.id)) return true;\n return false;\n });\n if (opts.devWriteRelayUrls) {\n this.devWriteRelaySet = NDKRelaySet.fromRelayUrls(opts.devWriteRelayUrls, this);\n }\n this.queuesZapConfig = new Queue(\"zaps\", 3);\n this.queuesNip05 = new Queue(\"nip05\", 10);\n if (opts.signatureVerificationWorker) {\n this.signatureVerificationWorker = opts.signatureVerificationWorker;\n }\n if (opts.signatureVerificationFunction) {\n this.signatureVerificationFunction = opts.signatureVerificationFunction;\n }\n this.initialValidationRatio = opts.initialValidationRatio || 1;\n this.lowestValidationRatio = opts.lowestValidationRatio || 0.1;\n this.autoBlacklistInvalidRelays = opts.autoBlacklistInvalidRelays || false;\n this.validationRatioFn = opts.validationRatioFn || this.defaultValidationRatioFn;\n this.filterValidationMode = opts.filterValidationMode || \"validate\";\n try {\n this.httpFetch = fetch;\n } catch {\n }\n }\n set explicitRelayUrls(urls) {\n this._explicitRelayUrls = urls.map(normalizeRelayUrl);\n this.pool.relayUrls = urls;\n }\n get explicitRelayUrls() {\n return this._explicitRelayUrls || [];\n }\n /**\n * Set a Web Worker for signature verification.\n *\n * This method initializes the worker and sets the asyncSigVerification flag.\n * The actual verification is handled by the verifySignatureAsync function in signature.ts,\n * which will use the worker if available.\n */\n set signatureVerificationWorker(worker2) {\n this._signatureVerificationWorker = worker2;\n if (worker2) {\n signatureVerificationInit(worker2);\n this.asyncSigVerification = true;\n } else {\n this.asyncSigVerification = false;\n }\n }\n /**\n * Set a custom signature verification function.\n *\n * This method is particularly useful for platforms that don't support Web Workers,\n * such as React Native.\n *\n * When a function is provided, it will be used for signature verification\n * instead of the default worker-based verification. This enables signature\n * verification on platforms where Web Workers are not available.\n *\n * @example\n * ```typescript\n * import { verifySignatureAsync } from \"@nostr-dev-kit/ndk-mobile\";\n *\n * ndk.signatureVerificationFunction = verifySignatureAsync;\n * ```\n */\n set signatureVerificationFunction(fn) {\n this._signatureVerificationFunction = fn;\n this.asyncSigVerification = !!fn;\n }\n /**\n * Get the custom signature verification function\n */\n get signatureVerificationFunction() {\n return this._signatureVerificationFunction;\n }\n /**\n * Adds an explicit relay to the pool.\n * @param url\n * @param relayAuthPolicy Authentication policy to use if different from the default\n * @param connect Whether to connect to the relay automatically\n * @returns\n */\n addExplicitRelay(urlOrRelay, relayAuthPolicy, connect = true) {\n let relay;\n if (typeof urlOrRelay === \"string\") {\n relay = new NDKRelay(urlOrRelay, relayAuthPolicy, this);\n } else {\n relay = urlOrRelay;\n }\n this.pool.addRelay(relay, connect);\n this.explicitRelayUrls?.push(relay.url);\n return relay;\n }\n toJSON() {\n return { relayCount: this.pool.relays.size }.toString();\n }\n get activeUser() {\n return this._activeUser;\n }\n /**\n * Sets the active user for this NDK instance, typically this will be\n * called when assigning a signer to the NDK instance.\n *\n * This function will automatically connect to the user's relays if\n * `autoConnectUserRelays` is set to true.\n *\n * It will also fetch the user's mutelist if `autoFetchUserMutelist` is set to true.\n */\n set activeUser(user) {\n const differentUser = this._activeUser?.pubkey !== user?.pubkey;\n this._activeUser = user;\n if (user && differentUser) {\n setActiveUser.call(this, user);\n } else if (!user) {\n this.mutedIds = /* @__PURE__ */ new Map();\n }\n }\n get signer() {\n return this._signer;\n }\n set signer(newSigner) {\n this._signer = newSigner;\n if (newSigner) this.emit(\"signer:ready\", newSigner);\n newSigner?.user().then((user) => {\n user.ndk = this;\n this.activeUser = user;\n });\n }\n /**\n * Connect to relays with optional timeout.\n * If the timeout is reached, the connection will be continued to be established in the background.\n */\n async connect(timeoutMs) {\n if (this._signer && this.autoConnectUserRelays) {\n this.debug(\n \"Attempting to connect to user relays specified by signer %o\",\n await this._signer.relays?.(this)\n );\n if (this._signer.relays) {\n const relays = await this._signer.relays(this);\n relays.forEach((relay) => this.pool.addRelay(relay));\n }\n }\n const connections = [this.pool.connect(timeoutMs)];\n if (this.outboxPool) {\n connections.push(this.outboxPool.connect(timeoutMs));\n }\n return Promise.allSettled(connections).then(() => {\n });\n }\n /**\n * Centralized method to report an invalid signature, identifying the relay that provided it.\n * A single invalid signature means the relay is considered malicious.\n * All invalid signature detections (synchronous or asynchronous) should delegate to this method.\n *\n * @param event The event with an invalid signature\n * @param relay The relay that provided the invalid signature\n */\n reportInvalidSignature(event, relay) {\n this.debug(`Invalid signature detected for event ${event.id}${relay ? ` from relay ${relay.url}` : \"\"}`);\n this.emit(\"event:invalid-sig\", event, relay);\n if (this.autoBlacklistInvalidRelays && relay) {\n this.blacklistRelay(relay.url);\n }\n }\n /**\n * Add a relay URL to the blacklist as it has been identified as malicious\n */\n blacklistRelay(url) {\n if (!this.blacklistRelayUrls) {\n this.blacklistRelayUrls = [];\n }\n if (!this.blacklistRelayUrls.includes(url)) {\n this.blacklistRelayUrls.push(url);\n this.debug(`Added relay to blacklist: ${url}`);\n const relay = this.pool.getRelay(url, false, false);\n if (relay) {\n relay.disconnect();\n this.debug(`Disconnected from blacklisted relay: ${url}`);\n }\n }\n }\n /**\n * Default function to calculate validation ratio based on historical validation results.\n * The more events validated successfully, the lower the ratio goes (down to the minimum).\n */\n defaultValidationRatioFn(relay, validatedCount, nonValidatedCount) {\n if (validatedCount < 10) return this.initialValidationRatio;\n const trustFactor = Math.min(validatedCount / 100, 1);\n const calculatedRatio = this.initialValidationRatio * (1 - trustFactor) + this.lowestValidationRatio * trustFactor;\n return Math.max(calculatedRatio, this.lowestValidationRatio);\n }\n /**\n * Get a NDKUser object\n *\n * @param opts - User parameters object or a string (npub, nprofile, or hex pubkey)\n * @returns NDKUser instance\n *\n * @example\n * ```typescript\n * // Using parameters object\n * const user1 = ndk.getUser({ pubkey: \"hex...\" });\n *\n * // Using npub string\n * const user2 = ndk.getUser(\"npub1...\");\n *\n * // Using nprofile string (includes relay hints)\n * const user3 = ndk.getUser(\"nprofile1...\");\n *\n * // Using hex pubkey directly\n * const user4 = ndk.getUser(\"deadbeef...\");\n * ```\n */\n getUser(opts) {\n if (typeof opts === \"string\") {\n if (opts.startsWith(\"npub1\")) {\n const { type, data } = nip198.decode(opts);\n if (type !== \"npub\") throw new Error(`Invalid npub: ${opts}`);\n return this.getUser({ pubkey: data });\n } else if (opts.startsWith(\"nprofile1\")) {\n const { type, data } = nip198.decode(opts);\n if (type !== \"nprofile\") throw new Error(`Invalid nprofile: ${opts}`);\n return this.getUser({\n pubkey: data.pubkey,\n relayUrls: data.relays\n });\n } else {\n return this.getUser({ pubkey: opts });\n }\n }\n const user = new NDKUser(opts);\n user.ndk = this;\n return user;\n }\n /**\n * Get a NDKUser from a NIP05\n * @param nip05 NIP-05 ID\n * @param skipCache Skip cache\n * @returns\n */\n async getUserFromNip05(nip05, skipCache = false) {\n return NDKUser.fromNip05(nip05, this, skipCache);\n }\n /**\n * Creates and starts a new subscription.\n *\n * Subscriptions automatically start unless `autoStart` is set to `false`.\n * You can control automatic closing on EOSE via `opts.closeOnEose`.\n *\n * @param filters - A single NDKFilter object or an array of filters.\n * @param opts - Optional NDKSubscriptionOptions to customize behavior (e.g., caching, grouping).\n * @param handlers - Optional handlers for subscription events. Passing handlers is the preferred method of using ndk.subscribe.\n * - `onEvent`: Called for each event received.\n * - `onEvents`: Called once with an array of events when the subscription starts (from the cache).\n * - `onEose`: Called when the subscription receives EOSE.\n * For backwards compatibility, this third parameter also accepts a relaySet, the relaySet should be passed via `opts.relaySet`.\n *\n * @param _autoStart - For backwards compatibility, this can be a boolean indicating whether to start the subscription immediately.\n * This parameter is deprecated and will be removed in a future version.\n * - `false`: Creates the subscription but does not start it (call `subscription.start()` manually).\n * @returns The created NDKSubscription instance.\n *\n * @example Basic subscription\n * ```typescript\n * const sub = ndk.subscribe({ kinds: [1], authors: [pubkey] });\n * sub.on(\"event\", (event) => console.log(\"Kind 1 event:\", event.content));\n * ```\n *\n * @example Subscription with options and direct handlers\n * ```typescript\n * const sub = ndk.subscribe(\n * { kinds: [0], authors: [pubkey] },\n * { closeOnEose: true, cacheUsage: NDKSubscriptionCacheUsage.PARALLEL },\n * undefined, // Use default relay set calculation\n * {\n * onEvents: (events) => { // Renamed parameter\n * if (events.length > 0) {\n * console.log(`Got ${events.length} profile events from cache:`, events[0].content);\n * }\n * },\n * onEvent: (event) => { // Renamed parameter\n * console.log(\"Got profile update from relay:\", event.content); // Clarified source\n * },\n * onEose: () => console.log(\"Profile subscription finished.\")\n * }\n * );\n * ```\n *\n * @since 2.13.0 `relaySet` parameter removed; pass `relaySet` or `relayUrls` via `opts`.\n */\n subscribe(filters, opts, autoStartOrRelaySet = true, _autoStart = true) {\n let _relaySet = opts?.relaySet;\n let autoStart = _autoStart;\n if (autoStartOrRelaySet instanceof NDKRelaySet) {\n console.warn(\"relaySet is deprecated, use opts.relaySet instead. This will be removed in version v2.14.0\");\n _relaySet = autoStartOrRelaySet;\n autoStart = _autoStart;\n } else if (typeof autoStartOrRelaySet === \"boolean\" || typeof autoStartOrRelaySet === \"object\") {\n autoStart = autoStartOrRelaySet;\n }\n const subscription = new NDKSubscription(this, filters, { relaySet: _relaySet, ...opts });\n this.subManager.add(subscription);\n const pool = subscription.pool;\n if (subscription.relaySet) {\n for (const relay of subscription.relaySet.relays) {\n pool.useTemporaryRelay(relay, void 0, subscription.filters);\n }\n }\n if (this.outboxPool && subscription.hasAuthorsFilter()) {\n const authors = subscription.filters.filter((filter) => filter.authors && filter.authors?.length > 0).flatMap((filter) => filter.authors);\n this.outboxTracker?.trackUsers(authors);\n }\n if (autoStart) {\n let eventsHandler;\n if (typeof autoStart === \"object\") {\n if (autoStart.onEvent) subscription.on(\"event\", autoStart.onEvent);\n if (autoStart.onEose) subscription.on(\"eose\", autoStart.onEose);\n if (autoStart.onEvents) eventsHandler = autoStart.onEvents;\n }\n setTimeout(() => {\n const cachedEvents = subscription.start(!eventsHandler);\n if (cachedEvents && cachedEvents.length > 0 && !!eventsHandler) eventsHandler(cachedEvents);\n }, 0);\n }\n return subscription;\n }\n /**\n * Attempts to fetch an event from a tag, following relay hints and\n * other best practices.\n * @param tag Tag to fetch the event from\n * @param originalEvent Event where the tag came from\n * @param subOpts Subscription options to use when fetching the event\n * @param fallback Fallback options to use when the hint relay doesn't respond\n * @returns\n */\n fetchEventFromTag = fetchEventFromTag.bind(this);\n /**\n * Fetch an event from the cache synchronously.\n * @param idOrFilter event id in bech32 format or filter\n * @returns events from the cache or null if the cache is empty\n */\n fetchEventSync(idOrFilter) {\n if (!this.cacheAdapter) throw new Error(\"Cache adapter not set\");\n let filters;\n if (typeof idOrFilter === \"string\") filters = [filterFromId(idOrFilter)];\n else filters = idOrFilter;\n const sub = new NDKSubscription(this, filters);\n const events = this.cacheAdapter.query(sub);\n if (events instanceof Promise) throw new Error(\"Cache adapter is async\");\n return events.map((e) => {\n e.ndk = this;\n return e;\n });\n }\n /**\n * Fetch a single event.\n *\n * @param idOrFilter event id in bech32 format or filter\n * @param opts subscription options\n * @param relaySetOrRelay explicit relay set to use\n */\n async fetchEvent(idOrFilter, opts, relaySetOrRelay) {\n let filters;\n let relaySet;\n if (relaySetOrRelay instanceof NDKRelay) {\n relaySet = new NDKRelaySet(/* @__PURE__ */ new Set([relaySetOrRelay]), this);\n } else if (relaySetOrRelay instanceof NDKRelaySet) {\n relaySet = relaySetOrRelay;\n }\n if (!relaySetOrRelay && typeof idOrFilter === \"string\") {\n if (!isNip33AValue(idOrFilter)) {\n const relays = relaysFromBech32(idOrFilter, this);\n if (relays.length > 0) {\n relaySet = new NDKRelaySet(new Set(relays), this);\n relaySet = correctRelaySet(relaySet, this.pool);\n }\n }\n }\n if (typeof idOrFilter === \"string\") {\n filters = [filterFromId(idOrFilter)];\n } else if (Array.isArray(idOrFilter)) {\n filters = idOrFilter;\n } else {\n filters = [idOrFilter];\n }\n if (filters.length === 0) {\n throw new Error(`Invalid filter: ${JSON.stringify(idOrFilter)}`);\n }\n return new Promise((resolve) => {\n let fetchedEvent = null;\n const subscribeOpts = {\n ...opts || {},\n closeOnEose: true\n };\n if (relaySet) subscribeOpts.relaySet = relaySet;\n const s = this.subscribe(\n filters,\n subscribeOpts,\n // relaySet, // Removed: Passed via opts\n false\n // autoStart = false\n );\n const t2 = setTimeout(() => {\n s.stop();\n resolve(fetchedEvent);\n }, 1e4);\n s.on(\"event\", (event) => {\n event.ndk = this;\n if (!event.isReplaceable()) {\n clearTimeout(t2);\n resolve(event);\n } else if (!fetchedEvent || fetchedEvent.created_at < event.created_at) {\n fetchedEvent = event;\n }\n });\n s.on(\"eose\", () => {\n clearTimeout(t2);\n resolve(fetchedEvent);\n });\n s.start();\n });\n }\n /**\n * Fetch events\n */\n async fetchEvents(filters, opts, relaySet) {\n return new Promise((resolve) => {\n const events = /* @__PURE__ */ new Map();\n const subscribeOpts = {\n ...opts || {},\n closeOnEose: true\n };\n if (relaySet) subscribeOpts.relaySet = relaySet;\n const relaySetSubscription = this.subscribe(\n filters,\n subscribeOpts,\n // relaySet, // Removed: Passed via opts\n false\n // autoStart = false\n );\n const onEvent = (event) => {\n let _event;\n if (!(event instanceof NDKEvent)) _event = new NDKEvent(void 0, event);\n else _event = event;\n const dedupKey = _event.deduplicationKey();\n const existingEvent = events.get(dedupKey);\n if (existingEvent) {\n _event = dedup(existingEvent, _event);\n }\n _event.ndk = this;\n events.set(dedupKey, _event);\n };\n relaySetSubscription.on(\"event\", onEvent);\n relaySetSubscription.on(\"eose\", () => {\n resolve(new Set(events.values()));\n });\n relaySetSubscription.start();\n });\n }\n /**\n * Ensures that a signer is available to sign an event.\n */\n assertSigner() {\n if (!this.signer) {\n this.emit(\"signer:required\");\n throw new Error(\"Signer required\");\n }\n }\n getEntity = getEntity.bind(this);\n set wallet(wallet) {\n if (!wallet) {\n this.walletConfig = void 0;\n return;\n }\n this.walletConfig ??= {};\n this.walletConfig.lnPay = wallet?.lnPay?.bind(wallet);\n this.walletConfig.cashuPay = wallet?.cashuPay?.bind(wallet);\n }\n};\n\n// src/zap/invoice.ts\nimport { decode } from \"light-bolt11-decoder\";\nfunction zapInvoiceFromEvent(event) {\n const description = event.getMatchingTags(\"description\")[0];\n const bolt11 = event.getMatchingTags(\"bolt11\")[0];\n let decodedInvoice;\n let zapRequest;\n if (!description || !bolt11 || !bolt11[1]) {\n return null;\n }\n try {\n let zapRequestPayload = description[1];\n if (zapRequestPayload.startsWith(\"%\")) {\n zapRequestPayload = decodeURIComponent(zapRequestPayload);\n }\n if (zapRequestPayload === \"\") {\n return null;\n }\n zapRequest = JSON.parse(zapRequestPayload);\n decodedInvoice = decode(bolt11[1]);\n } catch (_e) {\n return null;\n }\n const amountSection = decodedInvoice.sections.find((s) => s.name === \"amount\");\n if (!amountSection) {\n return null;\n }\n const amount = Number.parseInt(amountSection.value);\n if (!amount) {\n return null;\n }\n const content = zapRequest.content;\n const sender = zapRequest.pubkey;\n const recipientTag = event.getMatchingTags(\"p\")[0];\n const recipient = recipientTag[1];\n let zappedEvent = event.getMatchingTags(\"e\")[0];\n if (!zappedEvent) {\n zappedEvent = event.getMatchingTags(\"a\")[0];\n }\n const zappedEventId = zappedEvent ? zappedEvent[1] : void 0;\n const zapInvoice = {\n id: event.id,\n zapper: event.pubkey,\n zappee: sender,\n zapped: recipient,\n zappedEvent: zappedEventId,\n amount,\n comment: content\n };\n return zapInvoice;\n}\n\n// src/zapper/index.ts\nimport createDebug5 from \"debug\";\nimport { EventEmitter as EventEmitter9 } from \"tseep\";\n\n// src/zapper/ln.ts\nimport { bech32 } from \"@scure/base\";\nimport createDebug4 from \"debug\";\nvar d2 = createDebug4(\"ndk:zapper:ln\");\nasync function getNip57ZapSpecFromLud({ lud06, lud16 }, ndk) {\n let zapEndpoint;\n if (lud16 && !lud16.startsWith(\"LNURL\")) {\n const [name, domain] = lud16.split(\"@\");\n zapEndpoint = `https://${domain}/.well-known/lnurlp/${name}`;\n } else if (lud06) {\n const { words } = bech32.decode(lud06, 1e3);\n const data = bech32.fromWords(words);\n const utf8Decoder = new TextDecoder(\"utf-8\");\n zapEndpoint = utf8Decoder.decode(data);\n }\n if (!zapEndpoint) {\n d2(\"No zap endpoint found %o\", { lud06, lud16 });\n throw new Error(\"No zap endpoint found\");\n }\n try {\n const _fetch = ndk.httpFetch || fetch;\n const response = await _fetch(zapEndpoint);\n if (response.status !== 200) {\n const text = await response.text();\n throw new Error(`Unable to fetch zap endpoint ${zapEndpoint}: ${text}`);\n }\n return await response.json();\n } catch (e) {\n throw new Error(`Unable to fetch zap endpoint ${zapEndpoint}: ${e}`);\n }\n}\n\n// src/zapper/nip57.ts\nimport { nip57 } from \"nostr-tools\";\nasync function generateZapRequest(target, ndk, data, pubkey, amount, relays, comment, tags, signer) {\n const zapEndpoint = data.callback;\n const zapRequest = nip57.makeZapRequest({\n profile: pubkey,\n // set the event to null since nostr-tools doesn't support nip-33 zaps\n event: null,\n amount,\n comment: comment || \"\",\n relays: relays.slice(0, 4)\n });\n if (target instanceof NDKEvent) {\n const tags2 = target.referenceTags();\n const nonPTags = tags2.filter((tag) => tag[0] !== \"p\");\n zapRequest.tags.push(...nonPTags);\n }\n zapRequest.tags.push([\"lnurl\", zapEndpoint]);\n const event = new NDKEvent(ndk, zapRequest);\n if (tags) {\n event.tags = event.tags.concat(tags);\n }\n const eTaggedEvents = /* @__PURE__ */ new Set();\n const aTaggedEvents = /* @__PURE__ */ new Set();\n for (const tag of event.tags) {\n if (tag[0] === \"e\") {\n eTaggedEvents.add(tag[1]);\n } else if (tag[0] === \"a\") {\n aTaggedEvents.add(tag[1]);\n }\n }\n if (eTaggedEvents.size > 1) throw new Error(\"Only one e-tag is allowed\");\n if (aTaggedEvents.size > 1) throw new Error(\"Only one a-tag is allowed\");\n event.tags = event.tags.filter((tag) => tag[0] !== \"p\");\n event.tags.push([\"p\", pubkey]);\n await event.sign(signer);\n return event;\n}\n\n// src/zapper/index.ts\nvar d3 = createDebug5(\"ndk:zapper\");\nvar NDKZapper = class extends EventEmitter9 {\n target;\n ndk;\n comment;\n amount;\n unit;\n tags;\n signer;\n zapMethod;\n nutzapAsFallback;\n lnPay;\n /**\n * Called when a cashu payment is to be made.\n * This function should swap/mint proofs for the required amount, in the required unit,\n * in any of the provided mints and return the proofs and mint used.\n */\n cashuPay;\n onComplete;\n maxRelays = 3;\n /**\n *\n * @param target The target of the zap\n * @param amount The amount to send indicated in the unit\n * @param unit The unit of the amount\n * @param opts Options for the zap\n */\n constructor(target, amount, unit = \"msat\", opts = {}) {\n super();\n this.target = target;\n this.ndk = opts.ndk || target.ndk;\n if (!this.ndk) {\n throw new Error(\"No NDK instance provided\");\n }\n this.amount = amount;\n this.comment = opts.comment;\n this.unit = unit;\n this.tags = opts.tags;\n this.signer = opts.signer;\n this.nutzapAsFallback = opts.nutzapAsFallback ?? false;\n this.lnPay = opts.lnPay || this.ndk.walletConfig?.lnPay;\n this.cashuPay = opts.cashuPay || this.ndk.walletConfig?.cashuPay;\n this.onComplete = opts.onComplete || this.ndk.walletConfig?.onPaymentComplete;\n }\n /**\n * Initiate zapping process\n *\n * This function will calculate the splits for this zap and initiate each zap split.\n */\n async zap(methods) {\n const splits = this.getZapSplits();\n const results = /* @__PURE__ */ new Map();\n await Promise.all(\n splits.map(async (split) => {\n let result;\n try {\n result = await this.zapSplit(split, methods);\n } catch (e) {\n result = new Error(e.message);\n }\n this.emit(\"split:complete\", split, result);\n results.set(split, result);\n })\n );\n this.emit(\"complete\", results);\n if (this.onComplete) this.onComplete(results);\n return results;\n }\n async zapNip57(split, data) {\n if (!this.lnPay) throw new Error(\"No lnPay function available\");\n const zapSpec = await getNip57ZapSpecFromLud(data, this.ndk);\n if (!zapSpec) throw new Error(\"No zap spec available for recipient\");\n const relays = await this.relays(split.pubkey);\n const zapRequest = await generateZapRequest(\n this.target,\n this.ndk,\n zapSpec,\n split.pubkey,\n split.amount,\n relays,\n this.comment,\n this.tags,\n this.signer\n );\n if (!zapRequest) {\n d3(\"Unable to generate zap request\");\n throw new Error(\"Unable to generate zap request\");\n }\n const pr = await this.getLnInvoice(zapRequest, split.amount, zapSpec);\n if (!pr) {\n d3(\"Unable to get payment request\");\n throw new Error(\"Unable to get payment request\");\n }\n this.emit(\"ln_invoice\", {\n amount: split.amount,\n recipientPubkey: split.pubkey,\n unit: this.unit,\n nip57ZapRequest: zapRequest,\n pr,\n type: \"nip57\"\n });\n const res = await this.lnPay({\n target: this.target,\n recipientPubkey: split.pubkey,\n paymentDescription: \"NIP-57 Zap\",\n pr,\n amount: split.amount,\n unit: this.unit,\n nip57ZapRequest: zapRequest\n });\n if (res?.preimage) {\n this.emit(\"ln_payment\", {\n preimage: res.preimage,\n amount: split.amount,\n recipientPubkey: split.pubkey,\n pr,\n unit: this.unit,\n nip57ZapRequest: zapRequest,\n type: \"nip57\"\n });\n }\n return res;\n }\n /**\n * Fetches information about a NIP-61 zap and asks the caller to create cashu proofs for the zap.\n *\n * (note that the cashuPay function can use any method to create the proofs, including using lightning\n * to mint proofs in the specified mint, the responsibility of minting the proofs is delegated to the caller (e.g. ndk-wallet))\n */\n async zapNip61(split, data) {\n if (!this.cashuPay) throw new Error(\"No cashuPay function available\");\n let ret;\n ret = await this.cashuPay(\n {\n target: this.target,\n recipientPubkey: split.pubkey,\n paymentDescription: \"NIP-61 Zap\",\n amount: split.amount,\n unit: this.unit,\n ...data ?? {}\n },\n (pr) => {\n this.emit(\"ln_invoice\", {\n pr,\n amount: split.amount,\n recipientPubkey: split.pubkey,\n unit: this.unit,\n type: \"nip61\"\n });\n }\n );\n d3(\"NIP-61 Zap result: %o\", ret);\n if (ret instanceof Error) {\n return ret;\n }\n if (ret) {\n const { proofs, mint } = ret;\n if (!proofs || !mint) throw new Error(`Invalid zap confirmation: missing proofs or mint: ${ret}`);\n const relays = await this.relays(split.pubkey);\n const relaySet = NDKRelaySet.fromRelayUrls(relays, this.ndk);\n const nutzap = new NDKNutzap(this.ndk);\n nutzap.tags = [...nutzap.tags, ...this.tags || []];\n nutzap.proofs = proofs;\n nutzap.mint = mint;\n nutzap.target = this.target;\n nutzap.comment = this.comment;\n nutzap.unit = \"sat\";\n nutzap.recipientPubkey = split.pubkey;\n await nutzap.sign(this.signer);\n nutzap.publish(relaySet);\n return nutzap;\n }\n }\n /**\n * Get the zap methods available for the recipient and initiates the zap\n * in the desired method.\n * @param split\n * @param methods - The methods to try, if not provided, all methods will be tried.\n * @returns\n */\n async zapSplit(split, methods) {\n const recipient = this.ndk.getUser({ pubkey: split.pubkey });\n const zapMethods = await recipient.getZapInfo(2500);\n let retVal;\n const canFallbackToNip61 = this.nutzapAsFallback && this.cashuPay;\n if (zapMethods.size === 0 && !canFallbackToNip61)\n throw new Error(\"No zap method available for recipient and NIP-61 fallback is disabled\");\n const nip61Fallback = async () => {\n if (!this.nutzapAsFallback) return;\n const relayLists = await getRelayListForUsers([split.pubkey], this.ndk);\n let relayUrls = relayLists.get(split.pubkey)?.readRelayUrls;\n relayUrls = this.ndk.pool.connectedRelays().map((r) => r.url);\n return await this.zapNip61(split, {\n // use the user's relay list\n relays: relayUrls,\n // lock to the user's actual pubkey\n p2pk: split.pubkey,\n // allow intramint fallback\n allowIntramintFallback: !!canFallbackToNip61\n });\n };\n const canUseNip61 = !methods || methods.includes(\"nip61\");\n const canUseNip57 = !methods || methods.includes(\"nip57\");\n const nip61Method = zapMethods.get(\"nip61\");\n if (nip61Method && canUseNip61) {\n try {\n retVal = await this.zapNip61(split, nip61Method);\n if (retVal instanceof NDKNutzap) return retVal;\n } catch (e) {\n this.emit(\"notice\", `NIP-61 attempt failed: ${e.message}`);\n }\n }\n const nip57Method = zapMethods.get(\"nip57\");\n if (nip57Method && canUseNip57) {\n try {\n retVal = await this.zapNip57(split, nip57Method);\n if (!(retVal instanceof Error)) return retVal;\n } catch (e) {\n this.emit(\"notice\", `NIP-57 attempt failed: ${e.message}`);\n }\n }\n if (canFallbackToNip61) {\n retVal = await nip61Fallback();\n if (retVal instanceof Error) throw retVal;\n return retVal;\n }\n this.emit(\"notice\", \"Zap methods exhausted and there was no fallback to NIP-61\");\n if (retVal instanceof Error) throw retVal;\n return retVal;\n }\n /**\n * Gets a bolt11 for a nip57 zap\n * @param event\n * @param amount\n * @param zapEndpoint\n * @returns\n */\n async getLnInvoice(zapRequest, amount, data) {\n const zapEndpoint = data.callback;\n const eventPayload = JSON.stringify(zapRequest.rawEvent());\n d3(\n `Fetching invoice from ${zapEndpoint}?${new URLSearchParams({\n amount: amount.toString(),\n nostr: eventPayload\n })}`\n );\n const url = new URL(zapEndpoint);\n url.searchParams.append(\"amount\", amount.toString());\n url.searchParams.append(\"nostr\", eventPayload);\n d3(`Fetching invoice from ${url.toString()}`);\n const response = await fetch(url.toString());\n d3(`Got response from zap endpoint: ${zapEndpoint}`, { status: response.status });\n if (response.status !== 200) {\n d3(`Received non-200 status from zap endpoint: ${zapEndpoint}`, {\n status: response.status,\n amount,\n nostr: eventPayload\n });\n const text = await response.text();\n throw new Error(`Unable to fetch zap endpoint ${zapEndpoint}: ${text}`);\n }\n const body = await response.json();\n return body.pr;\n }\n getZapSplits() {\n if (this.target instanceof NDKUser) {\n return [\n {\n pubkey: this.target.pubkey,\n amount: this.amount\n }\n ];\n }\n const zapTags = this.target.getMatchingTags(\"zap\");\n if (zapTags.length === 0) {\n return [\n {\n pubkey: this.target.pubkey,\n amount: this.amount\n }\n ];\n }\n const splits = [];\n const total = zapTags.reduce((acc, tag) => acc + Number.parseInt(tag[2]), 0);\n for (const tag of zapTags) {\n const pubkey = tag[1];\n const amount = Math.floor(Number.parseInt(tag[2]) / total * this.amount);\n splits.push({ pubkey, amount });\n }\n return splits;\n }\n /**\n * Gets the zap method that should be used to zap a pubbkey\n * @param ndk\n * @param pubkey\n * @returns\n */\n async getZapMethods(ndk, recipient, timeout = 2500) {\n const user = ndk.getUser({ pubkey: recipient });\n return await user.getZapInfo(timeout);\n }\n /**\n * @returns the relays to use for the zap request\n */\n async relays(pubkey) {\n let r = [];\n if (this.ndk?.activeUser) {\n const relayLists = await getRelayListForUsers([this.ndk.activeUser.pubkey, pubkey], this.ndk);\n const relayScores = /* @__PURE__ */ new Map();\n for (const relayList of relayLists.values()) {\n for (const url of relayList.readRelayUrls) {\n const score = relayScores.get(url) || 0;\n relayScores.set(url, score + 1);\n }\n }\n r = Array.from(relayScores.entries()).sort((a, b) => b[1] - a[1]).map(([url]) => url).slice(0, this.maxRelays);\n }\n if (this.ndk?.pool?.permanentAndConnectedRelays().length) {\n r = this.ndk.pool.permanentAndConnectedRelays().map((relay) => relay.url);\n }\n if (!r.length) {\n r = [];\n }\n return r;\n }\n};\n\n// src/utils/filter.ts\nfunction matchFilter(filter, event) {\n if (filter.ids && filter.ids.indexOf(event.id) === -1) {\n return false;\n }\n if (filter.kinds && filter.kinds.indexOf(event.kind) === -1) {\n return false;\n }\n if (filter.authors && filter.authors.indexOf(event.pubkey) === -1) {\n return false;\n }\n for (const f in filter) {\n if (f[0] === \"#\") {\n const tagName = f.slice(1);\n if (tagName === \"t\") {\n const values = filter[`#${tagName}`]?.map((v) => v.toLowerCase());\n if (values && !event.tags.find(([t, v]) => t === tagName && values?.indexOf(v.toLowerCase()) !== -1))\n return false;\n } else {\n const values = filter[`#${tagName}`];\n if (values && !event.tags.find(([t, v]) => t === tagName && values?.indexOf(v) !== -1)) return false;\n }\n }\n }\n if (filter.since && event.created_at < filter.since) return false;\n if (filter.until && event.created_at > filter.until) return false;\n return true;\n}\n\n// src/nip19/index.ts\nvar nip19_exports = {};\n__reExport(nip19_exports, nip19_star);\nimport * as nip19_star from \"nostr-tools/nip19\";\nexport {\n BECH32_REGEX,\n NDKAppHandlerEvent,\n NDKAppSettings,\n NDKArticle,\n NDKBlossomList,\n NDKCashuMint,\n NDKCashuMintList,\n NDKCashuToken,\n NDKCashuWalletTx,\n NDKClassified,\n NDKDVMJobFeedback,\n NDKDVMJobResult,\n NDKDVMRequest,\n NDKDraft,\n NDKDvmJobFeedbackStatus,\n NDKEvent,\n NDKFedimintMint,\n NDKFilterValidationMode,\n NDKFollowPack,\n NDKHighlight,\n NDKImage,\n NDKKind,\n NDKList,\n NDKListKinds,\n NDKMintRecommendation,\n NDKNip07Signer,\n NDKNip46Backend,\n NDKNip46Signer,\n NDKNostrRpc,\n NDKNutzap,\n NDKPool,\n NDKPrivateKeySigner,\n NDKProject,\n NDKProjectTemplate,\n NDKPublishError,\n NDKRelay,\n NDKRelayAuthPolicies,\n NDKRelayList,\n NDKRelaySet,\n NDKRelayStatus,\n NDKRepost,\n NDKSimpleGroup,\n NDKSimpleGroupMemberList,\n NDKSimpleGroupMetadata,\n NDKStory,\n NDKStorySticker,\n NDKStoryStickerType,\n NDKSubscription,\n NDKSubscriptionCacheUsage,\n NDKSubscriptionReceipt,\n NDKSubscriptionStart,\n NDKSubscriptionTier,\n NDKTask,\n NDKThread,\n NDKTranscriptionDVM,\n NDKUser,\n NDKVideo,\n NDKWiki,\n NDKWikiMergeRequest,\n NDKZapper,\n NIP33_A_REGEX,\n NdkNutzapStatus,\n SignatureVerificationStats,\n assertSignedEvent,\n calculateRelaySetFromEvent,\n calculateTermDurationInSeconds,\n cashuPubkeyToNostrPubkey,\n compareFilter,\n createSignedEvent,\n NDK as default,\n defaultOpts,\n deserialize,\n dvmSchedule,\n eventHasETagMarkers,\n eventIsPartOfThread,\n eventIsReply,\n eventReplies,\n eventThreadIds,\n eventThreads,\n eventsBySameAuthor,\n filterAndRelaySetFromBech32,\n filterFingerprint,\n filterForEventsTaggingId,\n filterFromId,\n generateContentTags,\n generateHashtags,\n generateSubId,\n generateZapRequest,\n getEventReplyId,\n getNip57ZapSpecFromLud,\n getRegisteredEventClasses,\n getRelayListForUser,\n getRelayListForUsers,\n getReplyTag,\n getRootEventId,\n getRootTag,\n giftUnwrap,\n giftWrap,\n imetaTagToTag,\n isEventOriginalPost,\n isNip33AValue,\n isSignedEvent,\n isUnsignedEvent,\n mapImetaTag,\n matchFilter,\n mergeFilters,\n mergeTags,\n ndkSignerFromPayload,\n newAmount,\n nip19_exports as nip19,\n normalize,\n normalizeRelayUrl,\n normalizeUrl,\n parseTagToSubscriptionAmount,\n pinEvent,\n possibleIntervalFrequencies,\n processFilters,\n profileFromEvent,\n proofP2pk,\n proofP2pkNostr,\n proofsTotalBalance,\n queryFullyFilled,\n registerEventClass,\n registerSigner,\n relayListFromKind3,\n relaysFromBech32,\n serialize,\n serializeProfile,\n startSignatureVerificationStats,\n strToDimension,\n strToPosition,\n tryNormalizeRelayUrl,\n uniqueTag,\n unregisterEventClass,\n wrapEvent,\n zapInvoiceFromEvent\n};\n","(function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).Dexie=t()})(this,function(){\"use strict\";var s=function(e,t){return(s=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};var _=function(){return(_=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function i(e,t,n){if(n||2===arguments.length)for(var r,i=0,o=t.length;i<o;i++)!r&&i in t||((r=r||Array.prototype.slice.call(t,0,i))[i]=t[i]);return e.concat(r||Array.prototype.slice.call(t))}var f=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:global,O=Object.keys,x=Array.isArray;function a(t,n){return\"object\"!=typeof n||O(n).forEach(function(e){t[e]=n[e]}),t}\"undefined\"==typeof Promise||f.Promise||(f.Promise=Promise);var c=Object.getPrototypeOf,n={}.hasOwnProperty;function m(e,t){return n.call(e,t)}function r(t,n){\"function\"==typeof n&&(n=n(c(t))),(\"undefined\"==typeof Reflect?O:Reflect.ownKeys)(n).forEach(function(e){l(t,e,n[e])})}var u=Object.defineProperty;function l(e,t,n,r){u(e,t,a(n&&m(n,\"get\")&&\"function\"==typeof n.get?{get:n.get,set:n.set,configurable:!0}:{value:n,configurable:!0,writable:!0},r))}function o(t){return{from:function(e){return t.prototype=Object.create(e.prototype),l(t.prototype,\"constructor\",t),{extend:r.bind(null,t.prototype)}}}}var h=Object.getOwnPropertyDescriptor;var d=[].slice;function b(e,t,n){return d.call(e,t,n)}function p(e,t){return t(e)}function y(e){if(!e)throw new Error(\"Assertion Failed\")}function v(e){f.setImmediate?setImmediate(e):setTimeout(e,0)}function g(e,t){if(\"string\"==typeof t&&m(e,t))return e[t];if(!t)return e;if(\"string\"!=typeof t){for(var n=[],r=0,i=t.length;r<i;++r){var o=g(e,t[r]);n.push(o)}return n}var a=t.indexOf(\".\");if(-1!==a){var u=e[t.substr(0,a)];return null==u?void 0:g(u,t.substr(a+1))}}function w(e,t,n){if(e&&void 0!==t&&!(\"isFrozen\"in Object&&Object.isFrozen(e)))if(\"string\"!=typeof t&&\"length\"in t){y(\"string\"!=typeof n&&\"length\"in n);for(var r=0,i=t.length;r<i;++r)w(e,t[r],n[r])}else{var o,a,u=t.indexOf(\".\");-1!==u?(o=t.substr(0,u),\"\"===(a=t.substr(u+1))?void 0===n?x(e)&&!isNaN(parseInt(o))?e.splice(o,1):delete e[o]:e[o]=n:w(u=!(u=e[o])||!m(e,o)?e[o]={}:u,a,n)):void 0===n?x(e)&&!isNaN(parseInt(t))?e.splice(t,1):delete e[t]:e[t]=n}}function k(e){var t,n={};for(t in e)m(e,t)&&(n[t]=e[t]);return n}var t=[].concat;function P(e){return t.apply([],e)}var e=\"BigUint64Array,BigInt64Array,Array,Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey\".split(\",\").concat(P([8,16,32,64].map(function(t){return[\"Int\",\"Uint\",\"Float\"].map(function(e){return e+t+\"Array\"})}))).filter(function(e){return f[e]}),K=new Set(e.map(function(e){return f[e]}));var E=null;function S(e){E=new WeakMap;e=function e(t){if(!t||\"object\"!=typeof t)return t;var n=E.get(t);if(n)return n;if(x(t)){n=[],E.set(t,n);for(var r=0,i=t.length;r<i;++r)n.push(e(t[r]))}else if(K.has(t.constructor))n=t;else{var o,a=c(t);for(o in n=a===Object.prototype?{}:Object.create(a),E.set(t,n),t)m(t,o)&&(n[o]=e(t[o]))}return n}(e);return E=null,e}var j={}.toString;function A(e){return j.call(e).slice(8,-1)}var C=\"undefined\"!=typeof Symbol?Symbol.iterator:\"@@iterator\",T=\"symbol\"==typeof C?function(e){var t;return null!=e&&(t=e[C])&&t.apply(e)}:function(){return null};function I(e,t){t=e.indexOf(t);return 0<=t&&e.splice(t,1),0<=t}var q={};function D(e){var t,n,r,i;if(1===arguments.length){if(x(e))return e.slice();if(this===q&&\"string\"==typeof e)return[e];if(i=T(e)){for(n=[];!(r=i.next()).done;)n.push(r.value);return n}if(null==e)return[e];if(\"number\"!=typeof(t=e.length))return[e];for(n=new Array(t);t--;)n[t]=e[t];return n}for(t=arguments.length,n=new Array(t);t--;)n[t]=arguments[t];return n}var B=\"undefined\"!=typeof Symbol?function(e){return\"AsyncFunction\"===e[Symbol.toStringTag]}:function(){return!1},R=[\"Unknown\",\"Constraint\",\"Data\",\"TransactionInactive\",\"ReadOnly\",\"Version\",\"NotFound\",\"InvalidState\",\"InvalidAccess\",\"Abort\",\"Timeout\",\"QuotaExceeded\",\"Syntax\",\"DataClone\"],F=[\"Modify\",\"Bulk\",\"OpenFailed\",\"VersionChange\",\"Schema\",\"Upgrade\",\"InvalidTable\",\"MissingAPI\",\"NoSuchDatabase\",\"InvalidArgument\",\"SubTransaction\",\"Unsupported\",\"Internal\",\"DatabaseClosed\",\"PrematureCommit\",\"ForeignAwait\"].concat(R),M={VersionChanged:\"Database version changed by other database connection\",DatabaseClosed:\"Database has been closed\",Abort:\"Transaction aborted\",TransactionInactive:\"Transaction has already completed or failed\",MissingAPI:\"IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb\"};function N(e,t){this.name=e,this.message=t}function L(e,t){return e+\". Errors: \"+Object.keys(t).map(function(e){return t[e].toString()}).filter(function(e,t,n){return n.indexOf(e)===t}).join(\"\\n\")}function U(e,t,n,r){this.failures=t,this.failedKeys=r,this.successCount=n,this.message=L(e,t)}function V(e,t){this.name=\"BulkError\",this.failures=Object.keys(t).map(function(e){return t[e]}),this.failuresByPos=t,this.message=L(e,this.failures)}o(N).from(Error).extend({toString:function(){return this.name+\": \"+this.message}}),o(U).from(N),o(V).from(N);var z=F.reduce(function(e,t){return e[t]=t+\"Error\",e},{}),W=N,Y=F.reduce(function(e,n){var r=n+\"Error\";function t(e,t){this.name=r,e?\"string\"==typeof e?(this.message=\"\".concat(e).concat(t?\"\\n \"+t:\"\"),this.inner=t||null):\"object\"==typeof e&&(this.message=\"\".concat(e.name,\" \").concat(e.message),this.inner=e):(this.message=M[n]||r,this.inner=null)}return o(t).from(W),e[n]=t,e},{});Y.Syntax=SyntaxError,Y.Type=TypeError,Y.Range=RangeError;var $=R.reduce(function(e,t){return e[t+\"Error\"]=Y[t],e},{});var Q=F.reduce(function(e,t){return-1===[\"Syntax\",\"Type\",\"Range\"].indexOf(t)&&(e[t+\"Error\"]=Y[t]),e},{});function G(){}function X(e){return e}function H(t,n){return null==t||t===X?n:function(e){return n(t(e))}}function J(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function Z(i,o){return i===G?o:function(){var e=i.apply(this,arguments);void 0!==e&&(arguments[0]=e);var t=this.onsuccess,n=this.onerror;this.onsuccess=null,this.onerror=null;var r=o.apply(this,arguments);return t&&(this.onsuccess=this.onsuccess?J(t,this.onsuccess):t),n&&(this.onerror=this.onerror?J(n,this.onerror):n),void 0!==r?r:e}}function ee(n,r){return n===G?r:function(){n.apply(this,arguments);var e=this.onsuccess,t=this.onerror;this.onsuccess=this.onerror=null,r.apply(this,arguments),e&&(this.onsuccess=this.onsuccess?J(e,this.onsuccess):e),t&&(this.onerror=this.onerror?J(t,this.onerror):t)}}function te(i,o){return i===G?o:function(e){var t=i.apply(this,arguments);a(e,t);var n=this.onsuccess,r=this.onerror;this.onsuccess=null,this.onerror=null;e=o.apply(this,arguments);return n&&(this.onsuccess=this.onsuccess?J(n,this.onsuccess):n),r&&(this.onerror=this.onerror?J(r,this.onerror):r),void 0===t?void 0===e?void 0:e:a(t,e)}}function ne(e,t){return e===G?t:function(){return!1!==t.apply(this,arguments)&&e.apply(this,arguments)}}function re(i,o){return i===G?o:function(){var e=i.apply(this,arguments);if(e&&\"function\"==typeof e.then){for(var t=this,n=arguments.length,r=new Array(n);n--;)r[n]=arguments[n];return e.then(function(){return o.apply(t,r)})}return o.apply(this,arguments)}}Q.ModifyError=U,Q.DexieError=N,Q.BulkError=V;var ie=\"undefined\"!=typeof location&&/^(http|https):\\/\\/(localhost|127\\.0\\.0\\.1)/.test(location.href);function oe(e){ie=e}var ae={},ue=100,e=\"undefined\"==typeof Promise?[]:function(){var e=Promise.resolve();if(\"undefined\"==typeof crypto||!crypto.subtle)return[e,c(e),e];var t=crypto.subtle.digest(\"SHA-512\",new Uint8Array([0]));return[t,c(t),e]}(),R=e[0],F=e[1],e=e[2],F=F&&F.then,se=R&&R.constructor,ce=!!e;var le=function(e,t){be.push([e,t]),he&&(queueMicrotask(Se),he=!1)},fe=!0,he=!0,de=[],pe=[],ye=X,ve={id:\"global\",global:!0,ref:0,unhandleds:[],onunhandled:G,pgp:!1,env:{},finalize:G},me=ve,be=[],ge=0,we=[];function _e(e){if(\"object\"!=typeof this)throw new TypeError(\"Promises must be constructed via new\");this._listeners=[],this._lib=!1;var t=this._PSD=me;if(\"function\"!=typeof e){if(e!==ae)throw new TypeError(\"Not a function\");return this._state=arguments[1],this._value=arguments[2],void(!1===this._state&&Oe(this,this._value))}this._state=null,this._value=null,++t.ref,function t(r,e){try{e(function(n){if(null===r._state){if(n===r)throw new TypeError(\"A promise cannot be resolved with itself.\");var e=r._lib&&je();n&&\"function\"==typeof n.then?t(r,function(e,t){n instanceof _e?n._then(e,t):n.then(e,t)}):(r._state=!0,r._value=n,Pe(r)),e&&Ae()}},Oe.bind(null,r))}catch(e){Oe(r,e)}}(this,e)}var xe={get:function(){var u=me,t=Fe;function e(n,r){var i=this,o=!u.global&&(u!==me||t!==Fe),a=o&&!Ue(),e=new _e(function(e,t){Ke(i,new ke(Qe(n,u,o,a),Qe(r,u,o,a),e,t,u))});return this._consoleTask&&(e._consoleTask=this._consoleTask),e}return e.prototype=ae,e},set:function(e){l(this,\"then\",e&&e.prototype===ae?xe:{get:function(){return e},set:xe.set})}};function ke(e,t,n,r,i){this.onFulfilled=\"function\"==typeof e?e:null,this.onRejected=\"function\"==typeof t?t:null,this.resolve=n,this.reject=r,this.psd=i}function Oe(e,t){var n,r;pe.push(t),null===e._state&&(n=e._lib&&je(),t=ye(t),e._state=!1,e._value=t,r=e,de.some(function(e){return e._value===r._value})||de.push(r),Pe(e),n&&Ae())}function Pe(e){var t=e._listeners;e._listeners=[];for(var n=0,r=t.length;n<r;++n)Ke(e,t[n]);var i=e._PSD;--i.ref||i.finalize(),0===ge&&(++ge,le(function(){0==--ge&&Ce()},[]))}function Ke(e,t){if(null!==e._state){var n=e._state?t.onFulfilled:t.onRejected;if(null===n)return(e._state?t.resolve:t.reject)(e._value);++t.psd.ref,++ge,le(Ee,[n,e,t])}else e._listeners.push(t)}function Ee(e,t,n){try{var r,i=t._value;!t._state&&pe.length&&(pe=[]),r=ie&&t._consoleTask?t._consoleTask.run(function(){return e(i)}):e(i),t._state||-1!==pe.indexOf(i)||function(e){var t=de.length;for(;t;)if(de[--t]._value===e._value)return de.splice(t,1)}(t),n.resolve(r)}catch(e){n.reject(e)}finally{0==--ge&&Ce(),--n.psd.ref||n.psd.finalize()}}function Se(){$e(ve,function(){je()&&Ae()})}function je(){var e=fe;return he=fe=!1,e}function Ae(){var e,t,n;do{for(;0<be.length;)for(e=be,be=[],n=e.length,t=0;t<n;++t){var r=e[t];r[0].apply(null,r[1])}}while(0<be.length);he=fe=!0}function Ce(){var e=de;de=[],e.forEach(function(e){e._PSD.onunhandled.call(null,e._value,e)});for(var t=we.slice(0),n=t.length;n;)t[--n]()}function Te(e){return new _e(ae,!1,e)}function Ie(n,r){var i=me;return function(){var e=je(),t=me;try{return We(i,!0),n.apply(this,arguments)}catch(e){r&&r(e)}finally{We(t,!1),e&&Ae()}}}r(_e.prototype,{then:xe,_then:function(e,t){Ke(this,new ke(null,null,e,t,me))},catch:function(e){if(1===arguments.length)return this.then(null,e);var t=e,n=arguments[1];return\"function\"==typeof t?this.then(null,function(e){return(e instanceof t?n:Te)(e)}):this.then(null,function(e){return(e&&e.name===t?n:Te)(e)})},finally:function(t){return this.then(function(e){return _e.resolve(t()).then(function(){return e})},function(e){return _e.resolve(t()).then(function(){return Te(e)})})},timeout:function(r,i){var o=this;return r<1/0?new _e(function(e,t){var n=setTimeout(function(){return t(new Y.Timeout(i))},r);o.then(e,t).finally(clearTimeout.bind(null,n))}):this}}),\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&l(_e.prototype,Symbol.toStringTag,\"Dexie.Promise\"),ve.env=Ye(),r(_e,{all:function(){var o=D.apply(null,arguments).map(Ve);return new _e(function(n,r){0===o.length&&n([]);var i=o.length;o.forEach(function(e,t){return _e.resolve(e).then(function(e){o[t]=e,--i||n(o)},r)})})},resolve:function(n){return n instanceof _e?n:n&&\"function\"==typeof n.then?new _e(function(e,t){n.then(e,t)}):new _e(ae,!0,n)},reject:Te,race:function(){var e=D.apply(null,arguments).map(Ve);return new _e(function(t,n){e.map(function(e){return _e.resolve(e).then(t,n)})})},PSD:{get:function(){return me},set:function(e){return me=e}},totalEchoes:{get:function(){return Fe}},newPSD:Ne,usePSD:$e,scheduler:{get:function(){return le},set:function(e){le=e}},rejectionMapper:{get:function(){return ye},set:function(e){ye=e}},follow:function(i,n){return new _e(function(e,t){return Ne(function(n,r){var e=me;e.unhandleds=[],e.onunhandled=r,e.finalize=J(function(){var t,e=this;t=function(){0===e.unhandleds.length?n():r(e.unhandleds[0])},we.push(function e(){t(),we.splice(we.indexOf(e),1)}),++ge,le(function(){0==--ge&&Ce()},[])},e.finalize),i()},n,e,t)})}}),se&&(se.allSettled&&l(_e,\"allSettled\",function(){var e=D.apply(null,arguments).map(Ve);return new _e(function(n){0===e.length&&n([]);var r=e.length,i=new Array(r);e.forEach(function(e,t){return _e.resolve(e).then(function(e){return i[t]={status:\"fulfilled\",value:e}},function(e){return i[t]={status:\"rejected\",reason:e}}).then(function(){return--r||n(i)})})})}),se.any&&\"undefined\"!=typeof AggregateError&&l(_e,\"any\",function(){var e=D.apply(null,arguments).map(Ve);return new _e(function(n,r){0===e.length&&r(new AggregateError([]));var i=e.length,o=new Array(i);e.forEach(function(e,t){return _e.resolve(e).then(function(e){return n(e)},function(e){o[t]=e,--i||r(new AggregateError(o))})})})}),se.withResolvers&&(_e.withResolvers=se.withResolvers));var qe={awaits:0,echoes:0,id:0},De=0,Be=[],Re=0,Fe=0,Me=0;function Ne(e,t,n,r){var i=me,o=Object.create(i);o.parent=i,o.ref=0,o.global=!1,o.id=++Me,ve.env,o.env=ce?{Promise:_e,PromiseProp:{value:_e,configurable:!0,writable:!0},all:_e.all,race:_e.race,allSettled:_e.allSettled,any:_e.any,resolve:_e.resolve,reject:_e.reject}:{},t&&a(o,t),++i.ref,o.finalize=function(){--this.parent.ref||this.parent.finalize()};r=$e(o,e,n,r);return 0===o.ref&&o.finalize(),r}function Le(){return qe.id||(qe.id=++De),++qe.awaits,qe.echoes+=ue,qe.id}function Ue(){return!!qe.awaits&&(0==--qe.awaits&&(qe.id=0),qe.echoes=qe.awaits*ue,!0)}function Ve(e){return qe.echoes&&e&&e.constructor===se?(Le(),e.then(function(e){return Ue(),e},function(e){return Ue(),Xe(e)})):e}function ze(){var e=Be[Be.length-1];Be.pop(),We(e,!1)}function We(e,t){var n,r=me;(t?!qe.echoes||Re++&&e===me:!Re||--Re&&e===me)||queueMicrotask(t?function(e){++Fe,qe.echoes&&0!=--qe.echoes||(qe.echoes=qe.awaits=qe.id=0),Be.push(me),We(e,!0)}.bind(null,e):ze),e!==me&&(me=e,r===ve&&(ve.env=Ye()),ce&&(n=ve.env.Promise,t=e.env,(r.global||e.global)&&(Object.defineProperty(f,\"Promise\",t.PromiseProp),n.all=t.all,n.race=t.race,n.resolve=t.resolve,n.reject=t.reject,t.allSettled&&(n.allSettled=t.allSettled),t.any&&(n.any=t.any))))}function Ye(){var e=f.Promise;return ce?{Promise:e,PromiseProp:Object.getOwnPropertyDescriptor(f,\"Promise\"),all:e.all,race:e.race,allSettled:e.allSettled,any:e.any,resolve:e.resolve,reject:e.reject}:{}}function $e(e,t,n,r,i){var o=me;try{return We(e,!0),t(n,r,i)}finally{We(o,!1)}}function Qe(t,n,r,i){return\"function\"!=typeof t?t:function(){var e=me;r&&Le(),We(n,!0);try{return t.apply(this,arguments)}finally{We(e,!1),i&&queueMicrotask(Ue)}}}function Ge(e){Promise===se&&0===qe.echoes?0===Re?e():enqueueNativeMicroTask(e):setTimeout(e,0)}-1===(\"\"+F).indexOf(\"[native code]\")&&(Le=Ue=G);var Xe=_e.reject;var He=String.fromCharCode(65535),Je=\"Invalid key provided. Keys must be of type string, number, Date or Array<string | number | Date>.\",Ze=\"String expected.\",et=[],tt=\"__dbnames\",nt=\"readonly\",rt=\"readwrite\";function it(e,t){return e?t?function(){return e.apply(this,arguments)&&t.apply(this,arguments)}:e:t}var ot={type:3,lower:-1/0,lowerOpen:!1,upper:[[]],upperOpen:!1};function at(t){return\"string\"!=typeof t||/\\./.test(t)?function(e){return e}:function(e){return void 0===e[t]&&t in e&&delete(e=S(e))[t],e}}function ut(){throw Y.Type(\"Entity instances must never be new:ed. Instances are generated by the framework bypassing the constructor.\")}function st(e,t){try{var n=ct(e),r=ct(t);if(n!==r)return\"Array\"===n?1:\"Array\"===r?-1:\"binary\"===n?1:\"binary\"===r?-1:\"string\"===n?1:\"string\"===r?-1:\"Date\"===n?1:\"Date\"!==r?NaN:-1;switch(n){case\"number\":case\"Date\":case\"string\":return t<e?1:e<t?-1:0;case\"binary\":return function(e,t){for(var n=e.length,r=t.length,i=n<r?n:r,o=0;o<i;++o)if(e[o]!==t[o])return e[o]<t[o]?-1:1;return n===r?0:n<r?-1:1}(lt(e),lt(t));case\"Array\":return function(e,t){for(var n=e.length,r=t.length,i=n<r?n:r,o=0;o<i;++o){var a=st(e[o],t[o]);if(0!==a)return a}return n===r?0:n<r?-1:1}(e,t)}}catch(e){}return NaN}function ct(e){var t=typeof e;if(\"object\"!=t)return t;if(ArrayBuffer.isView(e))return\"binary\";e=A(e);return\"ArrayBuffer\"===e?\"binary\":e}function lt(e){return e instanceof Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e)}function ft(t,n,r){var e=t.schema.yProps;return e?(n&&0<r.numFailures&&(n=n.filter(function(e,t){return!r.failures[t]})),Promise.all(e.map(function(e){e=e.updatesTable;return n?t.db.table(e).where(\"k\").anyOf(n).delete():t.db.table(e).clear()})).then(function(){return r})):r}var ht=(dt.prototype.execute=function(e){var t=this[\"@@propmod\"];if(void 0!==t.add){var n=t.add;if(x(n))return i(i([],x(e)?e:[],!0),n,!0).sort();if(\"number\"==typeof n)return(Number(e)||0)+n;if(\"bigint\"==typeof n)try{return BigInt(e)+n}catch(e){return BigInt(0)+n}throw new TypeError(\"Invalid term \".concat(n))}if(void 0!==t.remove){var r=t.remove;if(x(r))return x(e)?e.filter(function(e){return!r.includes(e)}).sort():[];if(\"number\"==typeof r)return Number(e)-r;if(\"bigint\"==typeof r)try{return BigInt(e)-r}catch(e){return BigInt(0)-r}throw new TypeError(\"Invalid subtrahend \".concat(r))}n=null===(n=t.replacePrefix)||void 0===n?void 0:n[0];return n&&\"string\"==typeof e&&e.startsWith(n)?t.replacePrefix[1]+e.substring(n.length):e},dt);function dt(e){this[\"@@propmod\"]=e}function pt(e,t){for(var n=O(t),r=n.length,i=!1,o=0;o<r;++o){var a=n[o],u=t[a],s=g(e,a);u instanceof ht?(w(e,a,u.execute(s)),i=!0):s!==u&&(w(e,a,u),i=!0)}return i}var yt=(vt.prototype._trans=function(e,r,t){var n=this._tx||me.trans,i=this.name,o=ie&&\"undefined\"!=typeof console&&console.createTask&&console.createTask(\"Dexie: \".concat(\"readonly\"===e?\"read\":\"write\",\" \").concat(this.name));function a(e,t,n){if(!n.schema[i])throw new Y.NotFound(\"Table \"+i+\" not part of transaction\");return r(n.idbtrans,n)}var u=je();try{var s=n&&n.db._novip===this.db._novip?n===me.trans?n._promise(e,a,t):Ne(function(){return n._promise(e,a,t)},{trans:n,transless:me.transless||me}):function t(n,r,i,o){if(n.idbdb&&(n._state.openComplete||me.letThrough||n._vip)){var a=n._createTransaction(r,i,n._dbSchema);try{a.create(),n._state.PR1398_maxLoop=3}catch(e){return e.name===z.InvalidState&&n.isOpen()&&0<--n._state.PR1398_maxLoop?(console.warn(\"Dexie: Need to reopen db\"),n.close({disableAutoOpen:!1}),n.open().then(function(){return t(n,r,i,o)})):Xe(e)}return a._promise(r,function(e,t){return Ne(function(){return me.trans=a,o(e,t,a)})}).then(function(e){if(\"readwrite\"===r)try{a.idbtrans.commit()}catch(e){}return\"readonly\"===r?e:a._completion.then(function(){return e})})}if(n._state.openComplete)return Xe(new Y.DatabaseClosed(n._state.dbOpenError));if(!n._state.isBeingOpened){if(!n._state.autoOpen)return Xe(new Y.DatabaseClosed);n.open().catch(G)}return n._state.dbReadyPromise.then(function(){return t(n,r,i,o)})}(this.db,e,[this.name],a);return o&&(s._consoleTask=o,s=s.catch(function(e){return console.trace(e),Xe(e)})),s}finally{u&&Ae()}},vt.prototype.get=function(t,e){var n=this;return t&&t.constructor===Object?this.where(t).first(e):null==t?Xe(new Y.Type(\"Invalid argument to Table.get()\")):this._trans(\"readonly\",function(e){return n.core.get({trans:e,key:t}).then(function(e){return n.hook.reading.fire(e)})}).then(e)},vt.prototype.where=function(o){if(\"string\"==typeof o)return new this.db.WhereClause(this,o);if(x(o))return new this.db.WhereClause(this,\"[\".concat(o.join(\"+\"),\"]\"));var n=O(o);if(1===n.length)return this.where(n[0]).equals(o[n[0]]);var e=this.schema.indexes.concat(this.schema.primKey).filter(function(t){if(t.compound&&n.every(function(e){return 0<=t.keyPath.indexOf(e)})){for(var e=0;e<n.length;++e)if(-1===n.indexOf(t.keyPath[e]))return!1;return!0}return!1}).sort(function(e,t){return e.keyPath.length-t.keyPath.length})[0];if(e&&this.db._maxKey!==He){var t=e.keyPath.slice(0,n.length);return this.where(t).equals(t.map(function(e){return o[e]}))}!e&&ie&&console.warn(\"The query \".concat(JSON.stringify(o),\" on \").concat(this.name,\" would benefit from a \")+\"compound index [\".concat(n.join(\"+\"),\"]\"));var a=this.schema.idxByName;function u(e,t){return 0===st(e,t)}var r=n.reduce(function(e,t){var n=e[0],r=e[1],e=a[t],i=o[t];return[n||e,n||!e?it(r,e&&e.multi?function(e){e=g(e,t);return x(e)&&e.some(function(e){return u(i,e)})}:function(e){return u(i,g(e,t))}):r]},[null,null]),t=r[0],r=r[1];return t?this.where(t.name).equals(o[t.keyPath]).filter(r):e?this.filter(r):this.where(n).equals(\"\")},vt.prototype.filter=function(e){return this.toCollection().and(e)},vt.prototype.count=function(e){return this.toCollection().count(e)},vt.prototype.offset=function(e){return this.toCollection().offset(e)},vt.prototype.limit=function(e){return this.toCollection().limit(e)},vt.prototype.each=function(e){return this.toCollection().each(e)},vt.prototype.toArray=function(e){return this.toCollection().toArray(e)},vt.prototype.toCollection=function(){return new this.db.Collection(new this.db.WhereClause(this))},vt.prototype.orderBy=function(e){return new this.db.Collection(new this.db.WhereClause(this,x(e)?\"[\".concat(e.join(\"+\"),\"]\"):e))},vt.prototype.reverse=function(){return this.toCollection().reverse()},vt.prototype.mapToClass=function(r){var e,t=this.db,n=this.name;function i(){return null!==e&&e.apply(this,arguments)||this}(this.schema.mappedClass=r).prototype instanceof ut&&(function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}s(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}(i,e=r),Object.defineProperty(i.prototype,\"db\",{get:function(){return t},enumerable:!1,configurable:!0}),i.prototype.table=function(){return n},r=i);for(var o=new Set,a=r.prototype;a;a=c(a))Object.getOwnPropertyNames(a).forEach(function(e){return o.add(e)});function u(e){if(!e)return e;var t,n=Object.create(r.prototype);for(t in e)if(!o.has(t))try{n[t]=e[t]}catch(e){}return n}return this.schema.readHook&&this.hook.reading.unsubscribe(this.schema.readHook),this.schema.readHook=u,this.hook(\"reading\",u),r},vt.prototype.defineClass=function(){return this.mapToClass(function(e){a(this,e)})},vt.prototype.add=function(t,n){var r=this,e=this.schema.primKey,i=e.auto,o=e.keyPath,a=t;return o&&i&&(a=at(o)(t)),this._trans(\"readwrite\",function(e){return r.core.mutate({trans:e,type:\"add\",keys:null!=n?[n]:null,values:[a]})}).then(function(e){return e.numFailures?_e.reject(e.failures[0]):e.lastResult}).then(function(e){if(o)try{w(t,o,e)}catch(e){}return e})},vt.prototype.upsert=function(r,i){var o=this,a=this.schema.primKey.keyPath;return this._trans(\"readwrite\",function(n){return o.core.get({trans:n,key:r}).then(function(t){var e=null!=t?t:{};return pt(e,i),a&&w(e,a,r),o.core.mutate({trans:n,type:\"put\",values:[e],keys:[r],upsert:!0,updates:{keys:[r],changeSpecs:[i]}}).then(function(e){return e.numFailures?_e.reject(e.failures[0]):!!t})})})},vt.prototype.update=function(e,t){if(\"object\"!=typeof e||x(e))return this.where(\":id\").equals(e).modify(t);e=g(e,this.schema.primKey.keyPath);return void 0===e?Xe(new Y.InvalidArgument(\"Given object does not contain its primary key\")):this.where(\":id\").equals(e).modify(t)},vt.prototype.put=function(t,n){var r=this,e=this.schema.primKey,i=e.auto,o=e.keyPath,a=t;return o&&i&&(a=at(o)(t)),this._trans(\"readwrite\",function(e){return r.core.mutate({trans:e,type:\"put\",values:[a],keys:null!=n?[n]:null})}).then(function(e){return e.numFailures?_e.reject(e.failures[0]):e.lastResult}).then(function(e){if(o)try{w(t,o,e)}catch(e){}return e})},vt.prototype.delete=function(t){var n=this;return this._trans(\"readwrite\",function(e){return n.core.mutate({trans:e,type:\"delete\",keys:[t]}).then(function(e){return ft(n,[t],e)}).then(function(e){return e.numFailures?_e.reject(e.failures[0]):void 0})})},vt.prototype.clear=function(){var t=this;return this._trans(\"readwrite\",function(e){return t.core.mutate({trans:e,type:\"deleteRange\",range:ot}).then(function(e){return ft(t,null,e)})}).then(function(e){return e.numFailures?_e.reject(e.failures[0]):void 0})},vt.prototype.bulkGet=function(t){var n=this;return this._trans(\"readonly\",function(e){return n.core.getMany({keys:t,trans:e}).then(function(e){return e.map(function(e){return n.hook.reading.fire(e)})})})},vt.prototype.bulkAdd=function(r,e,t){var o=this,a=Array.isArray(e)?e:void 0,u=(t=t||(a?void 0:e))?t.allKeys:void 0;return this._trans(\"readwrite\",function(e){var t=o.schema.primKey,n=t.auto,t=t.keyPath;if(t&&a)throw new Y.InvalidArgument(\"bulkAdd(): keys argument invalid on tables with inbound keys\");if(a&&a.length!==r.length)throw new Y.InvalidArgument(\"Arguments objects and keys must have the same length\");var i=r.length,t=t&&n?r.map(at(t)):r;return o.core.mutate({trans:e,type:\"add\",keys:a,values:t,wantResults:u}).then(function(e){var t=e.numFailures,n=e.results,r=e.lastResult,e=e.failures;if(0===t)return u?n:r;throw new V(\"\".concat(o.name,\".bulkAdd(): \").concat(t,\" of \").concat(i,\" operations failed\"),e)})})},vt.prototype.bulkPut=function(r,e,t){var o=this,a=Array.isArray(e)?e:void 0,u=(t=t||(a?void 0:e))?t.allKeys:void 0;return this._trans(\"readwrite\",function(e){var t=o.schema.primKey,n=t.auto,t=t.keyPath;if(t&&a)throw new Y.InvalidArgument(\"bulkPut(): keys argument invalid on tables with inbound keys\");if(a&&a.length!==r.length)throw new Y.InvalidArgument(\"Arguments objects and keys must have the same length\");var i=r.length,t=t&&n?r.map(at(t)):r;return o.core.mutate({trans:e,type:\"put\",keys:a,values:t,wantResults:u}).then(function(e){var t=e.numFailures,n=e.results,r=e.lastResult,e=e.failures;if(0===t)return u?n:r;throw new V(\"\".concat(o.name,\".bulkPut(): \").concat(t,\" of \").concat(i,\" operations failed\"),e)})})},vt.prototype.bulkUpdate=function(t){var h=this,n=this.core,r=t.map(function(e){return e.key}),i=t.map(function(e){return e.changes}),d=[];return this._trans(\"readwrite\",function(e){return n.getMany({trans:e,keys:r,cache:\"clone\"}).then(function(c){var l=[],f=[];t.forEach(function(e,t){var n=e.key,r=e.changes,i=c[t];if(i){for(var o=0,a=Object.keys(r);o<a.length;o++){var u=a[o],s=r[u];if(u===h.schema.primKey.keyPath){if(0!==st(s,n))throw new Y.Constraint(\"Cannot update primary key in bulkUpdate()\")}else w(i,u,s)}d.push(t),l.push(n),f.push(i)}});var s=l.length;return n.mutate({trans:e,type:\"put\",keys:l,values:f,updates:{keys:r,changeSpecs:i}}).then(function(e){var t=e.numFailures,n=e.failures;if(0===t)return s;for(var r=0,i=Object.keys(n);r<i.length;r++){var o,a=i[r],u=d[Number(a)];null!=u&&(o=n[a],delete n[a],n[u]=o)}throw new V(\"\".concat(h.name,\".bulkUpdate(): \").concat(t,\" of \").concat(s,\" operations failed\"),n)})})})},vt.prototype.bulkDelete=function(t){var r=this,i=t.length;return this._trans(\"readwrite\",function(e){return r.core.mutate({trans:e,type:\"delete\",keys:t}).then(function(e){return ft(r,t,e)})}).then(function(e){var t=e.numFailures,n=e.lastResult,e=e.failures;if(0===t)return n;throw new V(\"\".concat(r.name,\".bulkDelete(): \").concat(t,\" of \").concat(i,\" operations failed\"),e)})},vt);function vt(){}function mt(i){function t(e,t){if(t){for(var n=arguments.length,r=new Array(n-1);--n;)r[n-1]=arguments[n];return a[e].subscribe.apply(null,r),i}if(\"string\"==typeof e)return a[e]}var a={};t.addEventType=u;for(var e=1,n=arguments.length;e<n;++e)u(arguments[e]);return t;function u(e,n,r){if(\"object\"!=typeof e){var i;n=n||ne;var o={subscribers:[],fire:r=r||G,subscribe:function(e){-1===o.subscribers.indexOf(e)&&(o.subscribers.push(e),o.fire=n(o.fire,e))},unsubscribe:function(t){o.subscribers=o.subscribers.filter(function(e){return e!==t}),o.fire=o.subscribers.reduce(n,r)}};return a[e]=t[e]=o}O(i=e).forEach(function(e){var t=i[e];if(x(t))u(e,i[e][0],i[e][1]);else{if(\"asap\"!==t)throw new Y.InvalidArgument(\"Invalid event config\");var n=u(e,X,function(){for(var e=arguments.length,t=new Array(e);e--;)t[e]=arguments[e];n.subscribers.forEach(function(e){v(function(){e.apply(null,t)})})})}})}}function bt(e,t){return o(t).from({prototype:e}),t}function gt(e,t){return!(e.filter||e.algorithm||e.or)&&(t?e.justLimit:!e.replayFilter)}function wt(e,t){e.filter=it(e.filter,t)}function _t(e,t,n){var r=e.replayFilter;e.replayFilter=r?function(){return it(r(),t())}:t,e.justLimit=n&&!r}function xt(e,t){if(e.isPrimKey)return t.primaryKey;var n=t.getIndexByKeyPath(e.index);if(!n)throw new Y.Schema(\"KeyPath \"+e.index+\" on object store \"+t.name+\" is not indexed\");return n}function kt(e,t,n){var r=xt(e,t.schema);return t.openCursor({trans:n,values:!e.keysOnly,reverse:\"prev\"===e.dir,unique:!!e.unique,query:{index:r,range:e.range}})}function Ot(e,o,t,n){var a=e.replayFilter?it(e.filter,e.replayFilter()):e.filter;if(e.or){var u={},r=function(e,t,n){var r,i;a&&!a(t,n,function(e){return t.stop(e)},function(e){return t.fail(e)})||(\"[object ArrayBuffer]\"===(i=\"\"+(r=t.primaryKey))&&(i=\"\"+new Uint8Array(r)),m(u,i)||(u[i]=!0,o(e,t,n)))};return Promise.all([e.or._iterate(r,t),Pt(kt(e,n,t),e.algorithm,r,!e.keysOnly&&e.valueMapper)])}return Pt(kt(e,n,t),it(e.algorithm,a),o,!e.keysOnly&&e.valueMapper)}function Pt(e,r,i,o){var a=Ie(o?function(e,t,n){return i(o(e),t,n)}:i);return e.then(function(n){if(n)return n.start(function(){var t=function(){return n.continue()};r&&!r(n,function(e){return t=e},function(e){n.stop(e),t=G},function(e){n.fail(e),t=G})||a(n.value,n,function(e){return t=e}),t()})})}var Kt=(Et.prototype._read=function(e,t){var n=this._ctx;return n.error?n.table._trans(null,Xe.bind(null,n.error)):n.table._trans(\"readonly\",e).then(t)},Et.prototype._write=function(e){var t=this._ctx;return t.error?t.table._trans(null,Xe.bind(null,t.error)):t.table._trans(\"readwrite\",e,\"locked\")},Et.prototype._addAlgorithm=function(e){var t=this._ctx;t.algorithm=it(t.algorithm,e)},Et.prototype._iterate=function(e,t){return Ot(this._ctx,e,t,this._ctx.table.core)},Et.prototype.clone=function(e){var t=Object.create(this.constructor.prototype),n=Object.create(this._ctx);return e&&a(n,e),t._ctx=n,t},Et.prototype.raw=function(){return this._ctx.valueMapper=null,this},Et.prototype.each=function(t){var n=this._ctx;return this._read(function(e){return Ot(n,t,e,n.table.core)})},Et.prototype.count=function(e){var i=this;return this._read(function(e){var t=i._ctx,n=t.table.core;if(gt(t,!0))return n.count({trans:e,query:{index:xt(t,n.schema),range:t.range}}).then(function(e){return Math.min(e,t.limit)});var r=0;return Ot(t,function(){return++r,!1},e,n).then(function(){return r})}).then(e)},Et.prototype.sortBy=function(e,t){var n=e.split(\".\").reverse(),r=n[0],i=n.length-1;function o(e,t){return t?o(e[n[t]],t-1):e[r]}var a=\"next\"===this._ctx.dir?1:-1;function u(e,t){return st(o(e,i),o(t,i))*a}return this.toArray(function(e){return e.sort(u)}).then(t)},Et.prototype.toArray=function(e){var o=this;return this._read(function(e){var t=o._ctx;if(\"next\"===t.dir&>(t,!0)&&0<t.limit){var n=t.valueMapper,r=xt(t,t.table.core.schema);return t.table.core.query({trans:e,limit:t.limit,values:!0,query:{index:r,range:t.range}}).then(function(e){e=e.result;return n?e.map(n):e})}var i=[];return Ot(t,function(e){return i.push(e)},e,t.table.core).then(function(){return i})},e)},Et.prototype.offset=function(t){var e=this._ctx;return t<=0||(e.offset+=t,gt(e)?_t(e,function(){var n=t;return function(e,t){return 0===n||(1===n?--n:t(function(){e.advance(n),n=0}),!1)}}):_t(e,function(){var e=t;return function(){return--e<0}})),this},Et.prototype.limit=function(e){return this._ctx.limit=Math.min(this._ctx.limit,e),_t(this._ctx,function(){var r=e;return function(e,t,n){return--r<=0&&t(n),0<=r}},!0),this},Et.prototype.until=function(r,i){return wt(this._ctx,function(e,t,n){return!r(e.value)||(t(n),i)}),this},Et.prototype.first=function(e){return this.limit(1).toArray(function(e){return e[0]}).then(e)},Et.prototype.last=function(e){return this.reverse().first(e)},Et.prototype.filter=function(t){var e;return wt(this._ctx,function(e){return t(e.value)}),(e=this._ctx).isMatch=it(e.isMatch,t),this},Et.prototype.and=function(e){return this.filter(e)},Et.prototype.or=function(e){return new this.db.WhereClause(this._ctx.table,e,this)},Et.prototype.reverse=function(){return this._ctx.dir=\"prev\"===this._ctx.dir?\"next\":\"prev\",this._ondirectionchange&&this._ondirectionchange(this._ctx.dir),this},Et.prototype.desc=function(){return this.reverse()},Et.prototype.eachKey=function(n){var e=this._ctx;return e.keysOnly=!e.isMatch,this.each(function(e,t){n(t.key,t)})},Et.prototype.eachUniqueKey=function(e){return this._ctx.unique=\"unique\",this.eachKey(e)},Et.prototype.eachPrimaryKey=function(n){var e=this._ctx;return e.keysOnly=!e.isMatch,this.each(function(e,t){n(t.primaryKey,t)})},Et.prototype.keys=function(e){var t=this._ctx;t.keysOnly=!t.isMatch;var n=[];return this.each(function(e,t){n.push(t.key)}).then(function(){return n}).then(e)},Et.prototype.primaryKeys=function(e){var n=this._ctx;if(\"next\"===n.dir&>(n,!0)&&0<n.limit)return this._read(function(e){var t=xt(n,n.table.core.schema);return n.table.core.query({trans:e,values:!1,limit:n.limit,query:{index:t,range:n.range}})}).then(function(e){return e.result}).then(e);n.keysOnly=!n.isMatch;var r=[];return this.each(function(e,t){r.push(t.primaryKey)}).then(function(){return r}).then(e)},Et.prototype.uniqueKeys=function(e){return this._ctx.unique=\"unique\",this.keys(e)},Et.prototype.firstKey=function(e){return this.limit(1).keys(function(e){return e[0]}).then(e)},Et.prototype.lastKey=function(e){return this.reverse().firstKey(e)},Et.prototype.distinct=function(){var e=this._ctx,e=e.index&&e.table.schema.idxByName[e.index];if(!e||!e.multi)return this;var n={};return wt(this._ctx,function(e){var t=e.primaryKey.toString(),e=m(n,t);return n[t]=!0,!e}),this},Et.prototype.modify=function(x){var n=this,k=this._ctx;return this._write(function(p){var y=\"function\"==typeof x?x:function(e){return pt(e,x)},v=k.table.core,e=v.schema.primaryKey,m=e.outbound,b=e.extractKey,g=200,e=n.db._options.modifyChunkSize;e&&(g=\"object\"==typeof e?e[v.name]||e[\"*\"]||200:e);function w(e,t){var n=t.failures,t=t.numFailures;u+=e-t;for(var r=0,i=O(n);r<i.length;r++){var o=i[r];a.push(n[o])}}var a=[],u=0,t=[],_=x===St;return n.clone().primaryKeys().then(function(f){function h(s){var c=Math.min(g,f.length-s),l=f.slice(s,s+c);return(_?Promise.resolve([]):v.getMany({trans:p,keys:l,cache:\"immutable\"})).then(function(e){var n=[],t=[],r=m?[]:null,i=_?l:[];if(!_)for(var o=0;o<c;++o){var a=e[o],u={value:S(a),primKey:f[s+o]};!1!==y.call(u,u.value,u)&&(null==u.value?i.push(f[s+o]):m||0===st(b(a),b(u.value))?(t.push(u.value),m&&r.push(f[s+o])):(i.push(f[s+o]),n.push(u.value)))}return Promise.resolve(0<n.length&&v.mutate({trans:p,type:\"add\",values:n}).then(function(e){for(var t in e.failures)i.splice(parseInt(t),1);w(n.length,e)})).then(function(){return(0<t.length||d&&\"object\"==typeof x)&&v.mutate({trans:p,type:\"put\",keys:r,values:t,criteria:d,changeSpec:\"function\"!=typeof x&&x,isAdditionalChunk:0<s}).then(function(e){return w(t.length,e)})}).then(function(){return(0<i.length||d&&_)&&v.mutate({trans:p,type:\"delete\",keys:i,criteria:d,isAdditionalChunk:0<s}).then(function(e){return ft(k.table,i,e)}).then(function(e){return w(i.length,e)})}).then(function(){return f.length>s+c&&h(s+g)})})}var d=gt(k)&&k.limit===1/0&&(\"function\"!=typeof x||_)&&{index:k.index,range:k.range};return h(0).then(function(){if(0<a.length)throw new U(\"Error modifying one or more objects\",a,u,t);return f.length})})})},Et.prototype.delete=function(){var i=this._ctx,n=i.range;return!gt(i)||i.table.schema.yProps||!i.isPrimKey&&3!==n.type?this.modify(St):this._write(function(e){var t=i.table.core.schema.primaryKey,r=n;return i.table.core.count({trans:e,query:{index:t,range:r}}).then(function(n){return i.table.core.mutate({trans:e,type:\"deleteRange\",range:r}).then(function(e){var t=e.failures,e=e.numFailures;if(e)throw new U(\"Could not delete some values\",Object.keys(t).map(function(e){return t[e]}),n-e);return n-e})})})},Et);function Et(){}var St=function(e,t){return t.value=null};function jt(e,t){return e<t?-1:e===t?0:1}function At(e,t){return t<e?-1:e===t?0:1}function Ct(e,t,n){e=e instanceof Bt?new e.Collection(e):e;return e._ctx.error=new(n||TypeError)(t),e}function Tt(e){return new e.Collection(e,function(){return Dt(\"\")}).limit(0)}function It(e,s,n,r){var i,c,l,f,h,d,p,y=n.length;if(!n.every(function(e){return\"string\"==typeof e}))return Ct(e,Ze);function t(e){i=\"next\"===e?function(e){return e.toUpperCase()}:function(e){return e.toLowerCase()},c=\"next\"===e?function(e){return e.toLowerCase()}:function(e){return e.toUpperCase()},l=\"next\"===e?jt:At;var t=n.map(function(e){return{lower:c(e),upper:i(e)}}).sort(function(e,t){return l(e.lower,t.lower)});f=t.map(function(e){return e.upper}),h=t.map(function(e){return e.lower}),p=\"next\"===(d=e)?\"\":r}t(\"next\");e=new e.Collection(e,function(){return qt(f[0],h[y-1]+r)});e._ondirectionchange=function(e){t(e)};var v=0;return e._addAlgorithm(function(e,t,n){var r=e.key;if(\"string\"!=typeof r)return!1;var i=c(r);if(s(i,h,v))return!0;for(var o=null,a=v;a<y;++a){var u=function(e,t,n,r,i,o){for(var a=Math.min(e.length,r.length),u=-1,s=0;s<a;++s){var c=t[s];if(c!==r[s])return i(e[s],n[s])<0?e.substr(0,s)+n[s]+n.substr(s+1):i(e[s],r[s])<0?e.substr(0,s)+r[s]+n.substr(s+1):0<=u?e.substr(0,u)+t[u]+n.substr(u+1):null;i(e[s],c)<0&&(u=s)}return a<r.length&&\"next\"===o?e+n.substr(e.length):a<e.length&&\"prev\"===o?e.substr(0,n.length):u<0?null:e.substr(0,u)+r[u]+n.substr(u+1)}(r,i,f[a],h[a],l,d);null===u&&null===o?v=a+1:(null===o||0<l(o,u))&&(o=u)}return t(null!==o?function(){e.continue(o+p)}:n),!1}),e}function qt(e,t,n,r){return{type:2,lower:e,upper:t,lowerOpen:n,upperOpen:r}}function Dt(e){return{type:1,lower:e,upper:e}}var Bt=(Object.defineProperty(Rt.prototype,\"Collection\",{get:function(){return this._ctx.table.db.Collection},enumerable:!1,configurable:!0}),Rt.prototype.between=function(e,t,n,r){n=!1!==n,r=!0===r;try{return 0<this._cmp(e,t)||0===this._cmp(e,t)&&(n||r)&&(!n||!r)?Tt(this):new this.Collection(this,function(){return qt(e,t,!n,!r)})}catch(e){return Ct(this,Je)}},Rt.prototype.equals=function(e){return null==e?Ct(this,Je):new this.Collection(this,function(){return Dt(e)})},Rt.prototype.above=function(e){return null==e?Ct(this,Je):new this.Collection(this,function(){return qt(e,void 0,!0)})},Rt.prototype.aboveOrEqual=function(e){return null==e?Ct(this,Je):new this.Collection(this,function(){return qt(e,void 0,!1)})},Rt.prototype.below=function(e){return null==e?Ct(this,Je):new this.Collection(this,function(){return qt(void 0,e,!1,!0)})},Rt.prototype.belowOrEqual=function(e){return null==e?Ct(this,Je):new this.Collection(this,function(){return qt(void 0,e)})},Rt.prototype.startsWith=function(e){return\"string\"!=typeof e?Ct(this,Ze):this.between(e,e+He,!0,!0)},Rt.prototype.startsWithIgnoreCase=function(e){return\"\"===e?this.startsWith(e):It(this,function(e,t){return 0===e.indexOf(t[0])},[e],He)},Rt.prototype.equalsIgnoreCase=function(e){return It(this,function(e,t){return e===t[0]},[e],\"\")},Rt.prototype.anyOfIgnoreCase=function(){var e=D.apply(q,arguments);return 0===e.length?Tt(this):It(this,function(e,t){return-1!==t.indexOf(e)},e,\"\")},Rt.prototype.startsWithAnyOfIgnoreCase=function(){var e=D.apply(q,arguments);return 0===e.length?Tt(this):It(this,function(t,e){return e.some(function(e){return 0===t.indexOf(e)})},e,He)},Rt.prototype.anyOf=function(){var t=this,i=D.apply(q,arguments),o=this._cmp;try{i.sort(o)}catch(e){return Ct(this,Je)}if(0===i.length)return Tt(this);var e=new this.Collection(this,function(){return qt(i[0],i[i.length-1])});e._ondirectionchange=function(e){o=\"next\"===e?t._ascending:t._descending,i.sort(o)};var a=0;return e._addAlgorithm(function(e,t,n){for(var r=e.key;0<o(r,i[a]);)if(++a===i.length)return t(n),!1;return 0===o(r,i[a])||(t(function(){e.continue(i[a])}),!1)}),e},Rt.prototype.notEqual=function(e){return this.inAnyRange([[-1/0,e],[e,this.db._maxKey]],{includeLowers:!1,includeUppers:!1})},Rt.prototype.noneOf=function(){var e=D.apply(q,arguments);if(0===e.length)return new this.Collection(this);try{e.sort(this._ascending)}catch(e){return Ct(this,Je)}var t=e.reduce(function(e,t){return e?e.concat([[e[e.length-1][1],t]]):[[-1/0,t]]},null);return t.push([e[e.length-1],this.db._maxKey]),this.inAnyRange(t,{includeLowers:!1,includeUppers:!1})},Rt.prototype.inAnyRange=function(e,t){var o=this,a=this._cmp,u=this._ascending,n=this._descending,s=this._min,c=this._max;if(0===e.length)return Tt(this);if(!e.every(function(e){return void 0!==e[0]&&void 0!==e[1]&&u(e[0],e[1])<=0}))return Ct(this,\"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower\",Y.InvalidArgument);var r=!t||!1!==t.includeLowers,i=t&&!0===t.includeUppers;var l,f=u;function h(e,t){return f(e[0],t[0])}try{(l=e.reduce(function(e,t){for(var n=0,r=e.length;n<r;++n){var i=e[n];if(a(t[0],i[1])<0&&0<a(t[1],i[0])){i[0]=s(i[0],t[0]),i[1]=c(i[1],t[1]);break}}return n===r&&e.push(t),e},[])).sort(h)}catch(e){return Ct(this,Je)}var d=0,p=i?function(e){return 0<u(e,l[d][1])}:function(e){return 0<=u(e,l[d][1])},y=r?function(e){return 0<n(e,l[d][0])}:function(e){return 0<=n(e,l[d][0])};var v=p,e=new this.Collection(this,function(){return qt(l[0][0],l[l.length-1][1],!r,!i)});return e._ondirectionchange=function(e){f=\"next\"===e?(v=p,u):(v=y,n),l.sort(h)},e._addAlgorithm(function(e,t,n){for(var r,i=e.key;v(i);)if(++d===l.length)return t(n),!1;return!p(r=i)&&!y(r)||(0===o._cmp(i,l[d][1])||0===o._cmp(i,l[d][0])||t(function(){f===u?e.continue(l[d][0]):e.continue(l[d][1])}),!1)}),e},Rt.prototype.startsWithAnyOf=function(){var e=D.apply(q,arguments);return e.every(function(e){return\"string\"==typeof e})?0===e.length?Tt(this):this.inAnyRange(e.map(function(e){return[e,e+He]})):Ct(this,\"startsWithAnyOf() only works with strings\")},Rt);function Rt(){}function Ft(t){return Ie(function(e){return Mt(e),t(e.target.error),!1})}function Mt(e){e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault()}var Nt=\"storagemutated\",Lt=\"x-storagemutated-1\",Ut=mt(null,Nt),Vt=(zt.prototype._lock=function(){return y(!me.global),++this._reculock,1!==this._reculock||me.global||(me.lockOwnerFor=this),this},zt.prototype._unlock=function(){if(y(!me.global),0==--this._reculock)for(me.global||(me.lockOwnerFor=null);0<this._blockedFuncs.length&&!this._locked();){var e=this._blockedFuncs.shift();try{$e(e[1],e[0])}catch(e){}}return this},zt.prototype._locked=function(){return this._reculock&&me.lockOwnerFor!==this},zt.prototype.create=function(t){var n=this;if(!this.mode)return this;var e=this.db.idbdb,r=this.db._state.dbOpenError;if(y(!this.idbtrans),!t&&!e)switch(r&&r.name){case\"DatabaseClosedError\":throw new Y.DatabaseClosed(r);case\"MissingAPIError\":throw new Y.MissingAPI(r.message,r);default:throw new Y.OpenFailed(r)}if(!this.active)throw new Y.TransactionInactive;return y(null===this._completion._state),(t=this.idbtrans=t||(this.db.core||e).transaction(this.storeNames,this.mode,{durability:this.chromeTransactionDurability})).onerror=Ie(function(e){Mt(e),n._reject(t.error)}),t.onabort=Ie(function(e){Mt(e),n.active&&n._reject(new Y.Abort(t.error)),n.active=!1,n.on(\"abort\").fire(e)}),t.oncomplete=Ie(function(){n.active=!1,n._resolve(),\"mutatedParts\"in t&&Ut.storagemutated.fire(t.mutatedParts)}),this},zt.prototype._promise=function(n,r,i){var o=this;if(\"readwrite\"===n&&\"readwrite\"!==this.mode)return Xe(new Y.ReadOnly(\"Transaction is readonly\"));if(!this.active)return Xe(new Y.TransactionInactive);if(this._locked())return new _e(function(e,t){o._blockedFuncs.push([function(){o._promise(n,r,i).then(e,t)},me])});if(i)return Ne(function(){var e=new _e(function(e,t){o._lock();var n=r(e,t,o);n&&n.then&&n.then(e,t)});return e.finally(function(){return o._unlock()}),e._lib=!0,e});var e=new _e(function(e,t){var n=r(e,t,o);n&&n.then&&n.then(e,t)});return e._lib=!0,e},zt.prototype._root=function(){return this.parent?this.parent._root():this},zt.prototype.waitFor=function(e){var t,r=this._root(),i=_e.resolve(e);r._waitingFor?r._waitingFor=r._waitingFor.then(function(){return i}):(r._waitingFor=i,r._waitingQueue=[],t=r.idbtrans.objectStore(r.storeNames[0]),function e(){for(++r._spinCount;r._waitingQueue.length;)r._waitingQueue.shift()();r._waitingFor&&(t.get(-1/0).onsuccess=e)}());var o=r._waitingFor;return new _e(function(t,n){i.then(function(e){return r._waitingQueue.push(Ie(t.bind(null,e)))},function(e){return r._waitingQueue.push(Ie(n.bind(null,e)))}).finally(function(){r._waitingFor===o&&(r._waitingFor=null)})})},zt.prototype.abort=function(){this.active&&(this.active=!1,this.idbtrans&&this.idbtrans.abort(),this._reject(new Y.Abort))},zt.prototype.table=function(e){var t=this._memoizedTables||(this._memoizedTables={});if(m(t,e))return t[e];var n=this.schema[e];if(!n)throw new Y.NotFound(\"Table \"+e+\" not part of transaction\");n=new this.db.Table(e,n,this);return n.core=this.db.core.table(e),t[e]=n},zt);function zt(){}function Wt(e,t,n,r,i,o,a,u){return{name:e,keyPath:t,unique:n,multi:r,auto:i,compound:o,src:(n&&!a?\"&\":\"\")+(r?\"*\":\"\")+(i?\"++\":\"\")+Yt(t),type:u}}function Yt(e){return\"string\"==typeof e?e:e?\"[\"+[].join.call(e,\"+\")+\"]\":\"\"}function $t(e,t,n){return{name:e,primKey:t,indexes:n,mappedClass:null,idxByName:(r=function(e){return[e.name,e]},n.reduce(function(e,t,n){n=r(t,n);return n&&(e[n[0]]=n[1]),e},{}))};var r}var Qt=function(e){try{return e.only([[]]),Qt=function(){return[[]]},[[]]}catch(e){return Qt=function(){return He},He}};function Gt(t){return null==t?function(){}:\"string\"==typeof t?1===(n=t).split(\".\").length?function(e){return e[n]}:function(e){return g(e,n)}:function(e){return g(e,t)};var n}function Xt(e){return[].slice.call(e)}var Ht=0;function Jt(e){return null==e?\":id\":\"string\"==typeof e?e:\"[\".concat(e.join(\"+\"),\"]\")}function Zt(e,i,t){function _(e){if(3===e.type)return null;if(4===e.type)throw new Error(\"Cannot convert never type to IDBKeyRange\");var t=e.lower,n=e.upper,r=e.lowerOpen,e=e.upperOpen;return void 0===t?void 0===n?null:i.upperBound(n,!!e):void 0===n?i.lowerBound(t,!!r):i.bound(t,n,!!r,!!e)}function n(e){var h,w=e.name;return{name:w,schema:e,mutate:function(e){var y=e.trans,v=e.type,m=e.keys,b=e.values,g=e.range;return new Promise(function(t,e){t=Ie(t);var n=y.objectStore(w),r=null==n.keyPath,i=\"put\"===v||\"add\"===v;if(!i&&\"delete\"!==v&&\"deleteRange\"!==v)throw new Error(\"Invalid operation type: \"+v);var o,a=(m||b||{length:1}).length;if(m&&b&&m.length!==b.length)throw new Error(\"Given keys array must have same length as given values array.\");if(0===a)return t({numFailures:0,failures:{},results:[],lastResult:void 0});function u(e){++l,Mt(e)}var s=[],c=[],l=0;if(\"deleteRange\"===v){if(4===g.type)return t({numFailures:l,failures:c,results:[],lastResult:void 0});3===g.type?s.push(o=n.clear()):s.push(o=n.delete(_(g)))}else{var r=i?r?[b,m]:[b,null]:[m,null],f=r[0],h=r[1];if(i)for(var d=0;d<a;++d)s.push(o=h&&void 0!==h[d]?n[v](f[d],h[d]):n[v](f[d])),o.onerror=u;else for(d=0;d<a;++d)s.push(o=n[v](f[d])),o.onerror=u}function p(e){e=e.target.result,s.forEach(function(e,t){return null!=e.error&&(c[t]=e.error)}),t({numFailures:l,failures:c,results:\"delete\"===v?m:s.map(function(e){return e.result}),lastResult:e})}o.onerror=function(e){u(e),p(e)},o.onsuccess=p})},getMany:function(e){var f=e.trans,h=e.keys;return new Promise(function(t,e){t=Ie(t);for(var n,r=f.objectStore(w),i=h.length,o=new Array(i),a=0,u=0,s=function(e){e=e.target;o[e._pos]=e.result,++u===a&&t(o)},c=Ft(e),l=0;l<i;++l)null!=h[l]&&((n=r.get(h[l]))._pos=l,n.onsuccess=s,n.onerror=c,++a);0===a&&t(o)})},get:function(e){var r=e.trans,i=e.key;return new Promise(function(t,e){t=Ie(t);var n=r.objectStore(w).get(i);n.onsuccess=function(e){return t(e.target.result)},n.onerror=Ft(e)})},query:(h=s,function(f){return new Promise(function(n,e){n=Ie(n);var r,i,o,t=f.trans,a=f.values,u=f.limit,s=f.query,c=u===1/0?void 0:u,l=s.index,s=s.range,t=t.objectStore(w),l=l.isPrimaryKey?t:t.index(l.name),s=_(s);if(0===u)return n({result:[]});h?((c=a?l.getAll(s,c):l.getAllKeys(s,c)).onsuccess=function(e){return n({result:e.target.result})},c.onerror=Ft(e)):(r=0,i=!a&&\"openKeyCursor\"in l?l.openKeyCursor(s):l.openCursor(s),o=[],i.onsuccess=function(e){var t=i.result;return t?(o.push(a?t.value:t.primaryKey),++r===u?n({result:o}):void t.continue()):n({result:o})},i.onerror=Ft(e))})}),openCursor:function(e){var c=e.trans,o=e.values,a=e.query,u=e.reverse,l=e.unique;return new Promise(function(t,n){t=Ie(t);var e=a.index,r=a.range,i=c.objectStore(w),i=e.isPrimaryKey?i:i.index(e.name),e=u?l?\"prevunique\":\"prev\":l?\"nextunique\":\"next\",s=!o&&\"openKeyCursor\"in i?i.openKeyCursor(_(r),e):i.openCursor(_(r),e);s.onerror=Ft(n),s.onsuccess=Ie(function(e){var r,i,o,a,u=s.result;u?(u.___id=++Ht,u.done=!1,r=u.continue.bind(u),i=(i=u.continuePrimaryKey)&&i.bind(u),o=u.advance.bind(u),a=function(){throw new Error(\"Cursor not stopped\")},u.trans=c,u.stop=u.continue=u.continuePrimaryKey=u.advance=function(){throw new Error(\"Cursor not started\")},u.fail=Ie(n),u.next=function(){var e=this,t=1;return this.start(function(){return t--?e.continue():e.stop()}).then(function(){return e})},u.start=function(e){function t(){if(s.result)try{e()}catch(e){u.fail(e)}else u.done=!0,u.start=function(){throw new Error(\"Cursor behind last entry\")},u.stop()}var n=new Promise(function(t,e){t=Ie(t),s.onerror=Ft(e),u.fail=e,u.stop=function(e){u.stop=u.continue=u.continuePrimaryKey=u.advance=a,t(e)}});return s.onsuccess=Ie(function(e){s.onsuccess=t,t()}),u.continue=r,u.continuePrimaryKey=i,u.advance=o,t(),n},t(u)):t(null)},n)})},count:function(e){var t=e.query,i=e.trans,o=t.index,a=t.range;return new Promise(function(t,e){var n=i.objectStore(w),r=o.isPrimaryKey?n:n.index(o.name),n=_(a),r=n?r.count(n):r.count();r.onsuccess=Ie(function(e){return t(e.target.result)}),r.onerror=Ft(e)})}}}var r,o,a,u=(o=t,a=Xt((r=e).objectStoreNames),{schema:{name:r.name,tables:a.map(function(e){return o.objectStore(e)}).map(function(t){var e=t.keyPath,n=t.autoIncrement,r=x(e),i={},n={name:t.name,primaryKey:{name:null,isPrimaryKey:!0,outbound:null==e,compound:r,keyPath:e,autoIncrement:n,unique:!0,extractKey:Gt(e)},indexes:Xt(t.indexNames).map(function(e){return t.index(e)}).map(function(e){var t=e.name,n=e.unique,r=e.multiEntry,e=e.keyPath,r={name:t,compound:x(e),keyPath:e,unique:n,multiEntry:r,extractKey:Gt(e)};return i[Jt(e)]=r}),getIndexByKeyPath:function(e){return i[Jt(e)]}};return i[\":id\"]=n.primaryKey,null!=e&&(i[Jt(e)]=n.primaryKey),n})},hasGetAll:0<a.length&&\"getAll\"in o.objectStore(a[0])&&!(\"undefined\"!=typeof navigator&&/Safari/.test(navigator.userAgent)&&!/(Chrome\\/|Edge\\/)/.test(navigator.userAgent)&&[].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1]<604)}),t=u.schema,s=u.hasGetAll,u=t.tables.map(n),c={};return u.forEach(function(e){return c[e.name]=e}),{stack:\"dbcore\",transaction:e.transaction.bind(e),table:function(e){if(!c[e])throw new Error(\"Table '\".concat(e,\"' not found\"));return c[e]},MIN_KEY:-1/0,MAX_KEY:Qt(i),schema:t}}function en(e,t,n,r){var i=n.IDBKeyRange;return n.indexedDB,{dbcore:(r=Zt(t,i,r),e.dbcore.reduce(function(e,t){t=t.create;return _(_({},e),t(e))},r))}}function tn(n,e){var t=e.db,e=en(n._middlewares,t,n._deps,e);n.core=e.dbcore,n.tables.forEach(function(e){var t=e.name;n.core.schema.tables.some(function(e){return e.name===t})&&(e.core=n.core.table(t),n[t]instanceof n.Table&&(n[t].core=e.core))})}function nn(i,e,t,o){t.forEach(function(n){var r=o[n];e.forEach(function(e){var t=function e(t,n){return h(t,n)||(t=c(t))&&e(t,n)}(e,n);(!t||\"value\"in t&&void 0===t.value)&&(e===i.Transaction.prototype||e instanceof i.Transaction?l(e,n,{get:function(){return this.table(n)},set:function(e){u(this,n,{value:e,writable:!0,configurable:!0,enumerable:!0})}}):e[n]=new i.Table(n,r))})})}function rn(n,e){e.forEach(function(e){for(var t in e)e[t]instanceof n.Table&&delete e[t]})}function on(e,t){return e._cfg.version-t._cfg.version}function an(n,r,i,e){var o=n._dbSchema;i.objectStoreNames.contains(\"$meta\")&&!o.$meta&&(o.$meta=$t(\"$meta\",pn(\"\")[0],[]),n._storeNames.push(\"$meta\"));var a=n._createTransaction(\"readwrite\",n._storeNames,o);a.create(i),a._completion.catch(e);var u=a._reject.bind(a),s=me.transless||me;Ne(function(){return me.trans=a,me.transless=s,0!==r?(tn(n,i),t=r,((e=a).storeNames.includes(\"$meta\")?e.table(\"$meta\").get(\"version\").then(function(e){return null!=e?e:t}):_e.resolve(t)).then(function(e){return c=e,l=a,f=i,t=[],e=(s=n)._versions,h=s._dbSchema=hn(0,s.idbdb,f),0!==(e=e.filter(function(e){return e._cfg.version>=c})).length?(e.forEach(function(u){t.push(function(){var t=h,e=u._cfg.dbschema;dn(s,t,f),dn(s,e,f),h=s._dbSchema=e;var n=sn(t,e);n.add.forEach(function(e){cn(f,e[0],e[1].primKey,e[1].indexes)}),n.change.forEach(function(e){if(e.recreate)throw new Y.Upgrade(\"Not yet support for changing primary key\");var t=f.objectStore(e.name);e.add.forEach(function(e){return fn(t,e)}),e.change.forEach(function(e){t.deleteIndex(e.name),fn(t,e)}),e.del.forEach(function(e){return t.deleteIndex(e)})});var r=u._cfg.contentUpgrade;if(r&&u._cfg.version>c){tn(s,f),l._memoizedTables={};var i=k(e);n.del.forEach(function(e){i[e]=t[e]}),rn(s,[s.Transaction.prototype]),nn(s,[s.Transaction.prototype],O(i),i),l.schema=i;var o,a=B(r);a&&Le();n=_e.follow(function(){var e;(o=r(l))&&a&&(e=Ue.bind(null,null),o.then(e,e))});return o&&\"function\"==typeof o.then?_e.resolve(o):n.then(function(){return o})}}),t.push(function(e){var t,n,r=u._cfg.dbschema;t=r,n=e,[].slice.call(n.db.objectStoreNames).forEach(function(e){return null==t[e]&&n.db.deleteObjectStore(e)}),rn(s,[s.Transaction.prototype]),nn(s,[s.Transaction.prototype],s._storeNames,s._dbSchema),l.schema=s._dbSchema}),t.push(function(e){s.idbdb.objectStoreNames.contains(\"$meta\")&&(Math.ceil(s.idbdb.version/10)===u._cfg.version?(s.idbdb.deleteObjectStore(\"$meta\"),delete s._dbSchema.$meta,s._storeNames=s._storeNames.filter(function(e){return\"$meta\"!==e})):e.objectStore(\"$meta\").put(u._cfg.version,\"version\"))})}),function e(){return t.length?_e.resolve(t.shift()(l.idbtrans)).then(e):_e.resolve()}().then(function(){ln(h,f)})):_e.resolve();var s,c,l,f,t,h}).catch(u)):(O(o).forEach(function(e){cn(i,e,o[e].primKey,o[e].indexes)}),tn(n,i),void _e.follow(function(){return n.on.populate.fire(a)}).catch(u));var e,t})}function un(e,r){ln(e._dbSchema,r),r.db.version%10!=0||r.objectStoreNames.contains(\"$meta\")||r.db.createObjectStore(\"$meta\").add(Math.ceil(r.db.version/10-1),\"version\");var t=hn(0,e.idbdb,r);dn(e,e._dbSchema,r);for(var n=0,i=sn(t,e._dbSchema).change;n<i.length;n++){var o=function(t){if(t.change.length||t.recreate)return console.warn(\"Unable to patch indexes of table \".concat(t.name,\" because it has changes on the type of index or primary key.\")),{value:void 0};var n=r.objectStore(t.name);t.add.forEach(function(e){ie&&console.debug(\"Dexie upgrade patch: Creating missing index \".concat(t.name,\".\").concat(e.src)),fn(n,e)})}(i[n]);if(\"object\"==typeof o)return o.value}}function sn(e,t){var n,r={del:[],add:[],change:[]};for(n in e)t[n]||r.del.push(n);for(n in t){var i=e[n],o=t[n];if(i){var a={name:n,def:o,recreate:!1,del:[],add:[],change:[]};if(\"\"+(i.primKey.keyPath||\"\")!=\"\"+(o.primKey.keyPath||\"\")||i.primKey.auto!==o.primKey.auto)a.recreate=!0,r.change.push(a);else{var u=i.idxByName,s=o.idxByName,c=void 0;for(c in u)s[c]||a.del.push(c);for(c in s){var l=u[c],f=s[c];l?l.src!==f.src&&a.change.push(f):a.add.push(f)}(0<a.del.length||0<a.add.length||0<a.change.length)&&r.change.push(a)}}else r.add.push([n,o])}return r}function cn(e,t,n,r){var i=e.db.createObjectStore(t,n.keyPath?{keyPath:n.keyPath,autoIncrement:n.auto}:{autoIncrement:n.auto});return r.forEach(function(e){return fn(i,e)}),i}function ln(t,n){O(t).forEach(function(e){n.db.objectStoreNames.contains(e)||(ie&&console.debug(\"Dexie: Creating missing table\",e),cn(n,e,t[e].primKey,t[e].indexes))})}function fn(e,t){e.createIndex(t.name,t.keyPath,{unique:t.unique,multiEntry:t.multi})}function hn(e,t,u){var s={};return b(t.objectStoreNames,0).forEach(function(e){for(var t=u.objectStore(e),n=Wt(Yt(a=t.keyPath),a||\"\",!0,!1,!!t.autoIncrement,a&&\"string\"!=typeof a,!0),r=[],i=0;i<t.indexNames.length;++i){var o=t.index(t.indexNames[i]),a=o.keyPath,o=Wt(o.name,a,!!o.unique,!!o.multiEntry,!1,a&&\"string\"!=typeof a,!1);r.push(o)}s[e]=$t(e,n,r)}),s}function dn(e,t,n){for(var r=n.db.objectStoreNames,i=0;i<r.length;++i){var o=r[i],a=n.objectStore(o);e._hasGetAll=\"getAll\"in a;for(var u=0;u<a.indexNames.length;++u){var s=a.indexNames[u],c=a.index(s).keyPath,l=\"string\"==typeof c?c:\"[\"+b(c).join(\"+\")+\"]\";!t[o]||(c=t[o].idxByName[l])&&(c.name=s,delete t[o].idxByName[l],t[o].idxByName[s]=c)}}\"undefined\"!=typeof navigator&&/Safari/.test(navigator.userAgent)&&!/(Chrome\\/|Edge\\/)/.test(navigator.userAgent)&&f.WorkerGlobalScope&&f instanceof f.WorkerGlobalScope&&[].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1]<604&&(e._hasGetAll=!1)}function pn(e){return e.split(\",\").map(function(e,t){var n=e.split(\":\"),r=null===(i=n[1])||void 0===i?void 0:i.trim(),i=(e=n[0].trim()).replace(/([&*]|\\+\\+)/g,\"\"),n=/^\\[/.test(i)?i.match(/^\\[(.*)\\]$/)[1].split(\"+\"):i;return Wt(i,n||null,/\\&/.test(e),/\\*/.test(e),/\\+\\+/.test(e),x(n),0===t,r)})}var yn=(vn.prototype._createTableSchema=$t,vn.prototype._parseIndexSyntax=pn,vn.prototype._parseStoresSpec=function(r,i){var o=this;O(r).forEach(function(e){if(null!==r[e]){var t=o._parseIndexSyntax(r[e]),n=t.shift();if(!n)throw new Y.Schema(\"Invalid schema for table \"+e+\": \"+r[e]);if(n.unique=!0,n.multi)throw new Y.Schema(\"Primary key cannot be multiEntry*\");t.forEach(function(e){if(e.auto)throw new Y.Schema(\"Only primary key can be marked as autoIncrement (++)\");if(!e.keyPath)throw new Y.Schema(\"Index must have a name and cannot be an empty string\")});t=o._createTableSchema(e,n,t);i[e]=t}})},vn.prototype.stores=function(e){var t=this.db;this._cfg.storesSource=this._cfg.storesSource?a(this._cfg.storesSource,e):e;var e=t._versions,n={},r={};return e.forEach(function(e){a(n,e._cfg.storesSource),r=e._cfg.dbschema={},e._parseStoresSpec(n,r)}),t._dbSchema=r,rn(t,[t._allTables,t,t.Transaction.prototype]),nn(t,[t._allTables,t,t.Transaction.prototype,this._cfg.tables],O(r),r),t._storeNames=O(r),this},vn.prototype.upgrade=function(e){return this._cfg.contentUpgrade=re(this._cfg.contentUpgrade||G,e),this},vn);function vn(){}function mn(e,t){var n=e._dbNamesDB;return n||(n=e._dbNamesDB=new nr(tt,{addons:[],indexedDB:e,IDBKeyRange:t})).version(1).stores({dbnames:\"name\"}),n.table(\"dbnames\")}function bn(e){return e&&\"function\"==typeof e.databases}function gn(e){return Ne(function(){return me.letThrough=!0,e()})}function wn(e){return!(\"from\"in e)}var _n=function(e,t){if(!this){var n=new _n;return e&&\"d\"in e&&a(n,e),n}a(this,arguments.length?{d:1,from:e,to:1<arguments.length?t:e}:{d:0})};function xn(e,t,n){var r=st(t,n);if(!isNaN(r)){if(0<r)throw RangeError();if(wn(e))return a(e,{from:t,to:n,d:1});var i=e.l,r=e.r;if(st(n,e.from)<0)return i?xn(i,t,n):e.l={from:t,to:n,d:1,l:null,r:null},Kn(e);if(0<st(t,e.to))return r?xn(r,t,n):e.r={from:t,to:n,d:1,l:null,r:null},Kn(e);st(t,e.from)<0&&(e.from=t,e.l=null,e.d=r?r.d+1:1),0<st(n,e.to)&&(e.to=n,e.r=null,e.d=e.l?e.l.d+1:1);n=!e.r;i&&!e.l&&kn(e,i),r&&n&&kn(e,r)}}function kn(e,t){wn(t)||function e(t,n){var r=n.from,i=n.to,o=n.l,n=n.r;xn(t,r,i),o&&e(t,o),n&&e(t,n)}(e,t)}function On(e,t){var n=Pn(t),r=n.next();if(r.done)return!1;for(var i=r.value,o=Pn(e),a=o.next(i.from),u=a.value;!r.done&&!a.done;){if(st(u.from,i.to)<=0&&0<=st(u.to,i.from))return!0;st(i.from,u.from)<0?i=(r=n.next(u.from)).value:u=(a=o.next(i.from)).value}return!1}function Pn(e){var n=wn(e)?null:{s:0,n:e};return{next:function(e){for(var t=0<arguments.length;n;)switch(n.s){case 0:if(n.s=1,t)for(;n.n.l&&st(e,n.n.from)<0;)n={up:n,n:n.n.l,s:1};else for(;n.n.l;)n={up:n,n:n.n.l,s:1};case 1:if(n.s=2,!t||st(e,n.n.to)<=0)return{value:n.n,done:!1};case 2:if(n.n.r){n.s=3,n={up:n,n:n.n.r,s:0};continue}case 3:n=n.up}return{done:!0}}}}function Kn(e){var t,n,r=((null===(t=e.r)||void 0===t?void 0:t.d)||0)-((null===(n=e.l)||void 0===n?void 0:n.d)||0),i=1<r?\"r\":r<-1?\"l\":\"\";i&&(t=\"r\"==i?\"l\":\"r\",n=_({},e),r=e[i],e.from=r.from,e.to=r.to,e[i]=r[i],n[i]=r[t],(e[t]=n).d=En(n)),e.d=En(e)}function En(e){var t=e.r,e=e.l;return(t?e?Math.max(t.d,e.d):t.d:e?e.d:0)+1}function Sn(t,n){return O(n).forEach(function(e){t[e]?kn(t[e],n[e]):t[e]=function e(t){var n,r,i={};for(n in t)m(t,n)&&(r=t[n],i[n]=!r||\"object\"!=typeof r||K.has(r.constructor)?r:e(r));return i}(n[e])}),t}function jn(t,n){return t.all||n.all||Object.keys(t).some(function(e){return n[e]&&On(n[e],t[e])})}r(_n.prototype,((F={add:function(e){return kn(this,e),this},addKey:function(e){return xn(this,e,e),this},addKeys:function(e){var t=this;return e.forEach(function(e){return xn(t,e,e)}),this},hasKey:function(e){var t=Pn(this).next(e).value;return t&&st(t.from,e)<=0&&0<=st(t.to,e)}})[C]=function(){return Pn(this)},F));var An={},Cn={},Tn=!1;function In(e){Sn(Cn,e),Tn||(Tn=!0,setTimeout(function(){Tn=!1,qn(Cn,!(Cn={}))},0))}function qn(e,t){void 0===t&&(t=!1);var n=new Set;if(e.all)for(var r=0,i=Object.values(An);r<i.length;r++)Dn(a=i[r],e,n,t);else for(var o in e){var a,u=/^idb\\:\\/\\/(.*)\\/(.*)\\//.exec(o);u&&(o=u[1],u=u[2],(a=An[\"idb://\".concat(o,\"/\").concat(u)])&&Dn(a,e,n,t))}n.forEach(function(e){return e()})}function Dn(e,t,n,r){for(var i=[],o=0,a=Object.entries(e.queries.query);o<a.length;o++){for(var u=a[o],s=u[0],c=[],l=0,f=u[1];l<f.length;l++){var h=f[l];jn(t,h.obsSet)?h.subscribers.forEach(function(e){return n.add(e)}):r&&c.push(h)}r&&i.push([s,c])}if(r)for(var d=0,p=i;d<p.length;d++){var y=p[d],s=y[0],c=y[1];e.queries.query[s]=c}}function Bn(f){var h=f._state,r=f._deps.indexedDB;if(h.isBeingOpened||f.idbdb)return h.dbReadyPromise.then(function(){return h.dbOpenError?Xe(h.dbOpenError):f});h.isBeingOpened=!0,h.dbOpenError=null,h.openComplete=!1;var t=h.openCanceller,d=Math.round(10*f.verno),p=!1;function e(){if(h.openCanceller!==t)throw new Y.DatabaseClosed(\"db.open() was cancelled\")}function y(){return new _e(function(s,n){if(e(),!r)throw new Y.MissingAPI;var c=f.name,l=h.autoSchema||!d?r.open(c):r.open(c,d);if(!l)throw new Y.MissingAPI;l.onerror=Ft(n),l.onblocked=Ie(f._fireOnBlocked),l.onupgradeneeded=Ie(function(e){var t;v=l.transaction,h.autoSchema&&!f._options.allowEmptyDB?(l.onerror=Mt,v.abort(),l.result.close(),(t=r.deleteDatabase(c)).onsuccess=t.onerror=Ie(function(){n(new Y.NoSuchDatabase(\"Database \".concat(c,\" doesnt exist\")))})):(v.onerror=Ft(n),e=e.oldVersion>Math.pow(2,62)?0:e.oldVersion,m=e<1,f.idbdb=l.result,p&&un(f,v),an(f,e/10,v,n))},n),l.onsuccess=Ie(function(){v=null;var e,t,n,r,i,o=f.idbdb=l.result,a=b(o.objectStoreNames);if(0<a.length)try{var u=o.transaction(1===(r=a).length?r[0]:r,\"readonly\");if(h.autoSchema)t=o,n=u,(e=f).verno=t.version/10,n=e._dbSchema=hn(0,t,n),e._storeNames=b(t.objectStoreNames,0),nn(e,[e._allTables],O(n),n);else if(dn(f,f._dbSchema,u),((i=sn(hn(0,(i=f).idbdb,u),i._dbSchema)).add.length||i.change.some(function(e){return e.add.length||e.change.length}))&&!p)return console.warn(\"Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this.\"),o.close(),d=o.version+1,p=!0,s(y());tn(f,u)}catch(e){}et.push(f),o.onversionchange=Ie(function(e){h.vcFired=!0,f.on(\"versionchange\").fire(e)}),o.onclose=Ie(function(){f.close({disableAutoOpen:!1})}),m&&(i=f._deps,u=c,o=i.indexedDB,i=i.IDBKeyRange,bn(o)||u===tt||mn(o,i).put({name:u}).catch(G)),s()},n)}).catch(function(e){switch(null==e?void 0:e.name){case\"UnknownError\":if(0<h.PR1398_maxLoop)return h.PR1398_maxLoop--,console.warn(\"Dexie: Workaround for Chrome UnknownError on open()\"),y();break;case\"VersionError\":if(0<d)return d=0,y()}return _e.reject(e)})}var n,i=h.dbReadyResolve,v=null,m=!1;return _e.race([t,(\"undefined\"==typeof navigator?_e.resolve():!navigator.userAgentData&&/Safari\\//.test(navigator.userAgent)&&!/Chrom(e|ium)\\//.test(navigator.userAgent)&&indexedDB.databases?new Promise(function(e){function t(){return indexedDB.databases().finally(e)}n=setInterval(t,100),t()}).finally(function(){return clearInterval(n)}):Promise.resolve()).then(y)]).then(function(){return e(),h.onReadyBeingFired=[],_e.resolve(gn(function(){return f.on.ready.fire(f.vip)})).then(function e(){if(0<h.onReadyBeingFired.length){var t=h.onReadyBeingFired.reduce(re,G);return h.onReadyBeingFired=[],_e.resolve(gn(function(){return t(f.vip)})).then(e)}})}).finally(function(){h.openCanceller===t&&(h.onReadyBeingFired=null,h.isBeingOpened=!1)}).catch(function(e){h.dbOpenError=e;try{v&&v.abort()}catch(e){}return t===h.openCanceller&&f._close(),Xe(e)}).finally(function(){h.openComplete=!0,i()}).then(function(){var n;return m&&(n={},f.tables.forEach(function(t){t.schema.indexes.forEach(function(e){e.name&&(n[\"idb://\".concat(f.name,\"/\").concat(t.name,\"/\").concat(e.name)]=new _n(-1/0,[[[]]]))}),n[\"idb://\".concat(f.name,\"/\").concat(t.name,\"/\")]=n[\"idb://\".concat(f.name,\"/\").concat(t.name,\"/:dels\")]=new _n(-1/0,[[[]]])}),Ut(Nt).fire(n),qn(n,!0)),f})}function Rn(t){function e(e){return t.next(e)}var r=n(e),i=n(function(e){return t.throw(e)});function n(n){return function(e){var t=n(e),e=t.value;return t.done?e:e&&\"function\"==typeof e.then?e.then(r,i):x(e)?Promise.all(e).then(r,i):r(e)}}return n(e)()}function Fn(e,t,n){for(var r=x(e)?e.slice():[e],i=0;i<n;++i)r.push(t);return r}var Mn={stack:\"dbcore\",name:\"VirtualIndexMiddleware\",level:1,create:function(f){return _(_({},f),{table:function(e){var a=f.table(e),t=a.schema,u={},s=[];function c(e,t,n){var r=Jt(e),i=u[r]=u[r]||[],o=null==e?0:\"string\"==typeof e?1:e.length,a=0<t,a=_(_({},n),{name:a?\"\".concat(r,\"(virtual-from:\").concat(n.name,\")\"):n.name,lowLevelIndex:n,isVirtual:a,keyTail:t,keyLength:o,extractKey:Gt(e),unique:!a&&n.unique});return i.push(a),a.isPrimaryKey||s.push(a),1<o&&c(2===o?e[0]:e.slice(0,o-1),t+1,n),i.sort(function(e,t){return e.keyTail-t.keyTail}),a}e=c(t.primaryKey.keyPath,0,t.primaryKey);u[\":id\"]=[e];for(var n=0,r=t.indexes;n<r.length;n++){var i=r[n];c(i.keyPath,0,i)}function l(e){var t,n=e.query.index;return n.isVirtual?_(_({},e),{query:{index:n.lowLevelIndex,range:(t=e.query.range,n=n.keyTail,{type:1===t.type?2:t.type,lower:Fn(t.lower,t.lowerOpen?f.MAX_KEY:f.MIN_KEY,n),lowerOpen:!0,upper:Fn(t.upper,t.upperOpen?f.MIN_KEY:f.MAX_KEY,n),upperOpen:!0})}}):e}return _(_({},a),{schema:_(_({},t),{primaryKey:e,indexes:s,getIndexByKeyPath:function(e){return(e=u[Jt(e)])&&e[0]}}),count:function(e){return a.count(l(e))},query:function(e){return a.query(l(e))},openCursor:function(t){var e=t.query.index,r=e.keyTail,n=e.isVirtual,i=e.keyLength;return n?a.openCursor(l(t)).then(function(e){return e&&o(e)}):a.openCursor(t);function o(n){return Object.create(n,{continue:{value:function(e){null!=e?n.continue(Fn(e,t.reverse?f.MAX_KEY:f.MIN_KEY,r)):t.unique?n.continue(n.key.slice(0,i).concat(t.reverse?f.MIN_KEY:f.MAX_KEY,r)):n.continue()}},continuePrimaryKey:{value:function(e,t){n.continuePrimaryKey(Fn(e,f.MAX_KEY,r),t)}},primaryKey:{get:function(){return n.primaryKey}},key:{get:function(){var e=n.key;return 1===i?e[0]:e.slice(0,i)}},value:{get:function(){return n.value}}})}}})}})}};function Nn(i,o,a,u){return a=a||{},u=u||\"\",O(i).forEach(function(e){var t,n,r;m(o,e)?(t=i[e],n=o[e],\"object\"==typeof t&&\"object\"==typeof n&&t&&n?(r=A(t))!==A(n)?a[u+e]=o[e]:\"Object\"===r?Nn(t,n,a,u+e+\".\"):t!==n&&(a[u+e]=o[e]):t!==n&&(a[u+e]=o[e])):a[u+e]=void 0}),O(o).forEach(function(e){m(i,e)||(a[u+e]=o[e])}),a}function Ln(e,t){return\"delete\"===t.type?t.keys:t.keys||t.values.map(e.extractKey)}var Un={stack:\"dbcore\",name:\"HooksMiddleware\",level:2,create:function(e){return _(_({},e),{table:function(r){var y=e.table(r),v=y.schema.primaryKey;return _(_({},y),{mutate:function(e){var t=me.trans,n=t.table(r).hook,h=n.deleting,d=n.creating,p=n.updating;switch(e.type){case\"add\":if(d.fire===G)break;return t._promise(\"readwrite\",function(){return a(e)},!0);case\"put\":if(d.fire===G&&p.fire===G)break;return t._promise(\"readwrite\",function(){return a(e)},!0);case\"delete\":if(h.fire===G)break;return t._promise(\"readwrite\",function(){return a(e)},!0);case\"deleteRange\":if(h.fire===G)break;return t._promise(\"readwrite\",function(){return function n(r,i,o){return y.query({trans:r,values:!1,query:{index:v,range:i},limit:o}).then(function(e){var t=e.result;return a({type:\"delete\",keys:t,trans:r}).then(function(e){return 0<e.numFailures?Promise.reject(e.failures[0]):t.length<o?{failures:[],numFailures:0,lastResult:void 0}:n(r,_(_({},i),{lower:t[t.length-1],lowerOpen:!0}),o)})})}(e.trans,e.range,1e4)},!0)}return y.mutate(e);function a(c){var e,t,n,l=me.trans,f=c.keys||Ln(v,c);if(!f)throw new Error(\"Keys missing\");return\"delete\"!==(c=\"add\"===c.type||\"put\"===c.type?_(_({},c),{keys:f}):_({},c)).type&&(c.values=i([],c.values,!0)),c.keys&&(c.keys=i([],c.keys,!0)),e=y,n=f,(\"add\"===(t=c).type?Promise.resolve([]):e.getMany({trans:t.trans,keys:n,cache:\"immutable\"})).then(function(u){var s=f.map(function(e,t){var n,r,i,o=u[t],a={onerror:null,onsuccess:null};return\"delete\"===c.type?h.fire.call(a,e,o,l):\"add\"===c.type||void 0===o?(n=d.fire.call(a,e,c.values[t],l),null==e&&null!=n&&(c.keys[t]=e=n,v.outbound||w(c.values[t],v.keyPath,e))):(n=Nn(o,c.values[t]),(r=p.fire.call(a,n,e,o,l))&&(i=c.values[t],Object.keys(r).forEach(function(e){m(i,e)?i[e]=r[e]:w(i,e,r[e])}))),a});return y.mutate(c).then(function(e){for(var t=e.failures,n=e.results,r=e.numFailures,e=e.lastResult,i=0;i<f.length;++i){var o=(n||f)[i],a=s[i];null==o?a.onerror&&a.onerror(t[i]):a.onsuccess&&a.onsuccess(\"put\"===c.type&&u[i]?c.values[i]:o)}return{failures:t,results:n,numFailures:r,lastResult:e}}).catch(function(t){return s.forEach(function(e){return e.onerror&&e.onerror(t)}),Promise.reject(t)})})}}})}})}};function Vn(e,t,n){try{if(!t)return null;if(t.keys.length<e.length)return null;for(var r=[],i=0,o=0;i<t.keys.length&&o<e.length;++i)0===st(t.keys[i],e[o])&&(r.push(n?S(t.values[i]):t.values[i]),++o);return r.length===e.length?r:null}catch(e){return null}}var zn={stack:\"dbcore\",level:-1,create:function(t){return{table:function(e){var n=t.table(e);return _(_({},n),{getMany:function(t){if(!t.cache)return n.getMany(t);var e=Vn(t.keys,t.trans._cache,\"clone\"===t.cache);return e?_e.resolve(e):n.getMany(t).then(function(e){return t.trans._cache={keys:t.keys,values:\"clone\"===t.cache?S(e):e},e})},mutate:function(e){return\"add\"!==e.type&&(e.trans._cache=null),n.mutate(e)}})}}}};function Wn(e,t){return\"readonly\"===e.trans.mode&&!!e.subscr&&!e.trans.explicit&&\"disabled\"!==e.trans.db._options.cache&&!t.schema.primaryKey.outbound}function Yn(e,t){switch(e){case\"query\":return t.values&&!t.unique;case\"get\":case\"getMany\":case\"count\":case\"openCursor\":return!1}}var $n={stack:\"dbcore\",level:0,name:\"Observability\",create:function(b){var g=b.schema.name,w=new _n(b.MIN_KEY,b.MAX_KEY);return _(_({},b),{transaction:function(e,t,n){if(me.subscr&&\"readonly\"!==t)throw new Y.ReadOnly(\"Readwrite transaction in liveQuery context. Querier source: \".concat(me.querier));return b.transaction(e,t,n)},table:function(d){var p=b.table(d),y=p.schema,v=y.primaryKey,e=y.indexes,c=v.extractKey,l=v.outbound,m=v.autoIncrement&&e.filter(function(e){return e.compound&&e.keyPath.includes(v.keyPath)}),t=_(_({},p),{mutate:function(a){function u(e){return e=\"idb://\".concat(g,\"/\").concat(d,\"/\").concat(e),n[e]||(n[e]=new _n)}var e,o,s,t=a.trans,n=a.mutatedParts||(a.mutatedParts={}),r=u(\"\"),i=u(\":dels\"),c=a.type,l=\"deleteRange\"===a.type?[a.range]:\"delete\"===a.type?[a.keys]:a.values.length<50?[Ln(v,a).filter(function(e){return e}),a.values]:[],f=l[0],h=l[1],l=a.trans._cache;return x(f)?(r.addKeys(f),(l=\"delete\"===c||f.length===h.length?Vn(f,l):null)||i.addKeys(f),(l||h)&&(e=u,o=l,s=h,y.indexes.forEach(function(t){var n=e(t.name||\"\");function r(e){return null!=e?t.extractKey(e):null}function i(e){return t.multiEntry&&x(e)?e.forEach(function(e){return n.addKey(e)}):n.addKey(e)}(o||s).forEach(function(e,t){var n=o&&r(o[t]),t=s&&r(s[t]);0!==st(n,t)&&(null!=n&&i(n),null!=t&&i(t))})}))):f?(h={from:null!==(h=f.lower)&&void 0!==h?h:b.MIN_KEY,to:null!==(h=f.upper)&&void 0!==h?h:b.MAX_KEY},i.add(h),r.add(h)):(r.add(w),i.add(w),y.indexes.forEach(function(e){return u(e.name).add(w)})),p.mutate(a).then(function(o){return!f||\"add\"!==a.type&&\"put\"!==a.type||(r.addKeys(o.results),m&&m.forEach(function(t){for(var e=a.values.map(function(e){return t.extractKey(e)}),n=t.keyPath.findIndex(function(e){return e===v.keyPath}),r=0,i=o.results.length;r<i;++r)e[r][n]=o.results[r];u(t.name).addKeys(e)})),t.mutatedParts=Sn(t.mutatedParts||{},n),o})}}),e=function(e){var t=e.query,e=t.index,t=t.range;return[e,new _n(null!==(e=t.lower)&&void 0!==e?e:b.MIN_KEY,null!==(t=t.upper)&&void 0!==t?t:b.MAX_KEY)]},f={get:function(e){return[v,new _n(e.key)]},getMany:function(e){return[v,(new _n).addKeys(e.keys)]},count:e,query:e,openCursor:e};return O(f).forEach(function(s){t[s]=function(i){var e=me.subscr,t=!!e,n=Wn(me,p)&&Yn(s,i)?i.obsSet={}:e;if(t){var r=function(e){e=\"idb://\".concat(g,\"/\").concat(d,\"/\").concat(e);return n[e]||(n[e]=new _n)},o=r(\"\"),a=r(\":dels\"),e=f[s](i),t=e[0],e=e[1];if((\"query\"===s&&t.isPrimaryKey&&!i.values?a:r(t.name||\"\")).add(e),!t.isPrimaryKey){if(\"count\"!==s){var u=\"query\"===s&&l&&i.values&&p.query(_(_({},i),{values:!1}));return p[s].apply(this,arguments).then(function(t){if(\"query\"===s){if(l&&i.values)return u.then(function(e){e=e.result;return o.addKeys(e),t});var e=i.values?t.result.map(c):t.result;(i.values?o:a).addKeys(e)}else if(\"openCursor\"===s){var n=t,r=i.values;return n&&Object.create(n,{key:{get:function(){return a.addKey(n.primaryKey),n.key}},primaryKey:{get:function(){var e=n.primaryKey;return a.addKey(e),e}},value:{get:function(){return r&&o.addKey(n.primaryKey),n.value}}})}return t})}a.add(w)}}return p[s].apply(this,arguments)}}),t}})}};function Qn(e,t,n){if(0===n.numFailures)return t;if(\"deleteRange\"===t.type)return null;var r=t.keys?t.keys.length:\"values\"in t&&t.values?t.values.length:1;if(n.numFailures===r)return null;t=_({},t);return x(t.keys)&&(t.keys=t.keys.filter(function(e,t){return!(t in n.failures)})),\"values\"in t&&x(t.values)&&(t.values=t.values.filter(function(e,t){return!(t in n.failures)})),t}function Gn(e,t){return n=e,(void 0===(r=t).lower||(r.lowerOpen?0<st(n,r.lower):0<=st(n,r.lower)))&&(e=e,void 0===(t=t).upper||(t.upperOpen?st(e,t.upper)<0:st(e,t.upper)<=0));var n,r}function Xn(e,d,t,n,r,i){if(!t||0===t.length)return e;var o=d.query.index,p=o.multiEntry,y=d.query.range,v=n.schema.primaryKey.extractKey,m=o.extractKey,a=(o.lowLevelIndex||o).extractKey,t=t.reduce(function(e,t){var n=e,r=[];if(\"add\"===t.type||\"put\"===t.type)for(var i=new _n,o=t.values.length-1;0<=o;--o){var a,u=t.values[o],s=v(u);i.hasKey(s)||(a=m(u),(p&&x(a)?a.some(function(e){return Gn(e,y)}):Gn(a,y))&&(i.addKey(s),r.push(u)))}switch(t.type){case\"add\":var c=(new _n).addKeys(d.values?e.map(function(e){return v(e)}):e),n=e.concat(d.values?r.filter(function(e){e=v(e);return!c.hasKey(e)&&(c.addKey(e),!0)}):r.map(function(e){return v(e)}).filter(function(e){return!c.hasKey(e)&&(c.addKey(e),!0)}));break;case\"put\":var l=(new _n).addKeys(t.values.map(function(e){return v(e)}));n=e.filter(function(e){return!l.hasKey(d.values?v(e):e)}).concat(d.values?r:r.map(function(e){return v(e)}));break;case\"delete\":var f=(new _n).addKeys(t.keys);n=e.filter(function(e){return!f.hasKey(d.values?v(e):e)});break;case\"deleteRange\":var h=t.range;n=e.filter(function(e){return!Gn(v(e),h)})}return n},e);return t===e?e:(t.sort(function(e,t){return st(a(e),a(t))||st(v(e),v(t))}),d.limit&&d.limit<1/0&&(t.length>d.limit?t.length=d.limit:e.length===d.limit&&t.length<d.limit&&(r.dirty=!0)),i?Object.freeze(t):t)}function Hn(e,t){return 0===st(e.lower,t.lower)&&0===st(e.upper,t.upper)&&!!e.lowerOpen==!!t.lowerOpen&&!!e.upperOpen==!!t.upperOpen}function Jn(e,t){return function(e,t,n,r){if(void 0===e)return void 0!==t?-1:0;if(void 0===t)return 1;if(0===(t=st(e,t))){if(n&&r)return 0;if(n)return 1;if(r)return-1}return t}(e.lower,t.lower,e.lowerOpen,t.lowerOpen)<=0&&0<=function(e,t,n,r){if(void 0===e)return void 0!==t?1:0;if(void 0===t)return-1;if(0===(t=st(e,t))){if(n&&r)return 0;if(n)return-1;if(r)return 1}return t}(e.upper,t.upper,e.upperOpen,t.upperOpen)}function Zn(n,r,i,e){n.subscribers.add(i),e.addEventListener(\"abort\",function(){var e,t;n.subscribers.delete(i),0===n.subscribers.size&&(e=n,t=r,setTimeout(function(){0===e.subscribers.size&&I(t,e)},3e3))})}var er={stack:\"dbcore\",level:0,name:\"Cache\",create:function(k){var O=k.schema.name;return _(_({},k),{transaction:function(g,w,e){var _,t,x=k.transaction(g,w,e);return\"readwrite\"===w&&(t=(_=new AbortController).signal,e=function(b){return function(){if(_.abort(),\"readwrite\"===w){for(var t=new Set,e=0,n=g;e<n.length;e++){var r=n[e],i=An[\"idb://\".concat(O,\"/\").concat(r)];if(i){var o=k.table(r),a=i.optimisticOps.filter(function(e){return e.trans===x});if(x._explicit&&b&&x.mutatedParts)for(var u=0,s=Object.values(i.queries.query);u<s.length;u++)for(var c=0,l=(d=s[u]).slice();c<l.length;c++)jn((p=l[c]).obsSet,x.mutatedParts)&&(I(d,p),p.subscribers.forEach(function(e){return t.add(e)}));else if(0<a.length){i.optimisticOps=i.optimisticOps.filter(function(e){return e.trans!==x});for(var f=0,h=Object.values(i.queries.query);f<h.length;f++)for(var d,p,y,v=0,m=(d=h[f]).slice();v<m.length;v++)null!=(p=m[v]).res&&x.mutatedParts&&(b&&!p.dirty?(y=Object.isFrozen(p.res),y=Xn(p.res,p.req,a,o,p,y),p.dirty?(I(d,p),p.subscribers.forEach(function(e){return t.add(e)})):y!==p.res&&(p.res=y,p.promise=_e.resolve({result:y}))):(p.dirty&&I(d,p),p.subscribers.forEach(function(e){return t.add(e)})))}}}t.forEach(function(e){return e()})}}},x.addEventListener(\"abort\",e(!1),{signal:t}),x.addEventListener(\"error\",e(!1),{signal:t}),x.addEventListener(\"complete\",e(!0),{signal:t})),x},table:function(c){var l=k.table(c),i=l.schema.primaryKey;return _(_({},l),{mutate:function(t){var e=me.trans;if(i.outbound||\"disabled\"===e.db._options.cache||e.explicit||\"readwrite\"!==e.idbtrans.mode)return l.mutate(t);var n=An[\"idb://\".concat(O,\"/\").concat(c)];if(!n)return l.mutate(t);e=l.mutate(t);return\"add\"!==t.type&&\"put\"!==t.type||!(50<=t.values.length||Ln(i,t).some(function(e){return null==e}))?(n.optimisticOps.push(t),t.mutatedParts&&In(t.mutatedParts),e.then(function(e){0<e.numFailures&&(I(n.optimisticOps,t),(e=Qn(0,t,e))&&n.optimisticOps.push(e),t.mutatedParts&&In(t.mutatedParts))}),e.catch(function(){I(n.optimisticOps,t),t.mutatedParts&&In(t.mutatedParts)})):e.then(function(r){var e=Qn(0,_(_({},t),{values:t.values.map(function(e,t){var n;if(r.failures[t])return e;e=null!==(n=i.keyPath)&&void 0!==n&&n.includes(\".\")?S(e):_({},e);return w(e,i.keyPath,r.results[t]),e})}),r);n.optimisticOps.push(e),queueMicrotask(function(){return t.mutatedParts&&In(t.mutatedParts)})}),e},query:function(t){if(!Wn(me,l)||!Yn(\"query\",t))return l.query(t);var i=\"immutable\"===(null===(o=me.trans)||void 0===o?void 0:o.db._options.cache),e=me,n=e.requery,r=e.signal,o=function(e,t,n,r){var i=An[\"idb://\".concat(e,\"/\").concat(t)];if(!i)return[];if(!(t=i.queries[n]))return[null,!1,i,null];var o=t[(r.query?r.query.index.name:null)||\"\"];if(!o)return[null,!1,i,null];switch(n){case\"query\":var a=o.find(function(e){return e.req.limit===r.limit&&e.req.values===r.values&&Hn(e.req.query.range,r.query.range)});return a?[a,!0,i,o]:[o.find(function(e){return(\"limit\"in e.req?e.req.limit:1/0)>=r.limit&&(!r.values||e.req.values)&&Jn(e.req.query.range,r.query.range)}),!1,i,o];case\"count\":a=o.find(function(e){return Hn(e.req.query.range,r.query.range)});return[a,!!a,i,o]}}(O,c,\"query\",t),a=o[0],e=o[1],u=o[2],s=o[3];return a&&e?a.obsSet=t.obsSet:(e=l.query(t).then(function(e){var t=e.result;if(a&&(a.res=t),i){for(var n=0,r=t.length;n<r;++n)Object.freeze(t[n]);Object.freeze(t)}else e.result=S(t);return e}).catch(function(e){return s&&a&&I(s,a),Promise.reject(e)}),a={obsSet:t.obsSet,promise:e,subscribers:new Set,type:\"query\",req:t,dirty:!1},s?s.push(a):(s=[a],(u=u||(An[\"idb://\".concat(O,\"/\").concat(c)]={queries:{query:{},count:{}},objs:new Map,optimisticOps:[],unsignaledParts:{}})).queries.query[t.query.index.name||\"\"]=s)),Zn(a,s,n,r),a.promise.then(function(e){return{result:Xn(e.result,t,null==u?void 0:u.optimisticOps,l,a,i)}})}})}})}};function tr(e,r){return new Proxy(e,{get:function(e,t,n){return\"db\"===t?r:Reflect.get(e,t,n)}})}var nr=(rr.prototype.version=function(t){if(isNaN(t)||t<.1)throw new Y.Type(\"Given version is not a positive number\");if(t=Math.round(10*t)/10,this.idbdb||this._state.isBeingOpened)throw new Y.Schema(\"Cannot add version when database is open\");this.verno=Math.max(this.verno,t);var e=this._versions,n=e.filter(function(e){return e._cfg.version===t})[0];return n||(n=new this.Version(t),e.push(n),e.sort(on),n.stores({}),this._state.autoSchema=!1,n)},rr.prototype._whenReady=function(e){var n=this;return this.idbdb&&(this._state.openComplete||me.letThrough||this._vip)?e():new _e(function(e,t){if(n._state.openComplete)return t(new Y.DatabaseClosed(n._state.dbOpenError));if(!n._state.isBeingOpened){if(!n._state.autoOpen)return void t(new Y.DatabaseClosed);n.open().catch(G)}n._state.dbReadyPromise.then(e,t)}).then(e)},rr.prototype.use=function(e){var t=e.stack,n=e.create,r=e.level,i=e.name;i&&this.unuse({stack:t,name:i});e=this._middlewares[t]||(this._middlewares[t]=[]);return e.push({stack:t,create:n,level:null==r?10:r,name:i}),e.sort(function(e,t){return e.level-t.level}),this},rr.prototype.unuse=function(e){var t=e.stack,n=e.name,r=e.create;return t&&this._middlewares[t]&&(this._middlewares[t]=this._middlewares[t].filter(function(e){return r?e.create!==r:!!n&&e.name!==n})),this},rr.prototype.open=function(){var e=this;return $e(ve,function(){return Bn(e)})},rr.prototype._close=function(){this.on.close.fire(new CustomEvent(\"close\"));var n=this._state,e=et.indexOf(this);if(0<=e&&et.splice(e,1),this.idbdb){try{this.idbdb.close()}catch(e){}this.idbdb=null}n.isBeingOpened||(n.dbReadyPromise=new _e(function(e){n.dbReadyResolve=e}),n.openCanceller=new _e(function(e,t){n.cancelOpen=t}))},rr.prototype.close=function(e){var t=(void 0===e?{disableAutoOpen:!0}:e).disableAutoOpen,e=this._state;t?(e.isBeingOpened&&e.cancelOpen(new Y.DatabaseClosed),this._close(),e.autoOpen=!1,e.dbOpenError=new Y.DatabaseClosed):(this._close(),e.autoOpen=this._options.autoOpen||e.isBeingOpened,e.openComplete=!1,e.dbOpenError=null)},rr.prototype.delete=function(n){var i=this;void 0===n&&(n={disableAutoOpen:!0});var o=0<arguments.length&&\"object\"!=typeof arguments[0],a=this._state;return new _e(function(r,t){function e(){i.close(n);var e=i._deps.indexedDB.deleteDatabase(i.name);e.onsuccess=Ie(function(){var e,t,n;e=i._deps,t=i.name,n=e.indexedDB,e=e.IDBKeyRange,bn(n)||t===tt||mn(n,e).delete(t).catch(G),r()}),e.onerror=Ft(t),e.onblocked=i._fireOnBlocked}if(o)throw new Y.InvalidArgument(\"Invalid closeOptions argument to db.delete()\");a.isBeingOpened?a.dbReadyPromise.then(e):e()})},rr.prototype.backendDB=function(){return this.idbdb},rr.prototype.isOpen=function(){return null!==this.idbdb},rr.prototype.hasBeenClosed=function(){var e=this._state.dbOpenError;return e&&\"DatabaseClosed\"===e.name},rr.prototype.hasFailed=function(){return null!==this._state.dbOpenError},rr.prototype.dynamicallyOpened=function(){return this._state.autoSchema},Object.defineProperty(rr.prototype,\"tables\",{get:function(){var t=this;return O(this._allTables).map(function(e){return t._allTables[e]})},enumerable:!1,configurable:!0}),rr.prototype.transaction=function(){var e=function(e,t,n){var r=arguments.length;if(r<2)throw new Y.InvalidArgument(\"Too few arguments\");for(var i=new Array(r-1);--r;)i[r-1]=arguments[r];return n=i.pop(),[e,P(i),n]}.apply(this,arguments);return this._transaction.apply(this,e)},rr.prototype._transaction=function(e,t,n){var r=this,i=me.trans;i&&i.db===this&&-1===e.indexOf(\"!\")||(i=null);var o,a,u=-1!==e.indexOf(\"?\");e=e.replace(\"!\",\"\").replace(\"?\",\"\");try{if(a=t.map(function(e){e=e instanceof r.Table?e.name:e;if(\"string\"!=typeof e)throw new TypeError(\"Invalid table argument to Dexie.transaction(). Only Table or String are allowed\");return e}),\"r\"==e||e===nt)o=nt;else{if(\"rw\"!=e&&e!=rt)throw new Y.InvalidArgument(\"Invalid transaction mode: \"+e);o=rt}if(i){if(i.mode===nt&&o===rt){if(!u)throw new Y.SubTransaction(\"Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY\");i=null}i&&a.forEach(function(e){if(i&&-1===i.storeNames.indexOf(e)){if(!u)throw new Y.SubTransaction(\"Table \"+e+\" not included in parent transaction.\");i=null}}),u&&i&&!i.active&&(i=null)}}catch(n){return i?i._promise(null,function(e,t){t(n)}):Xe(n)}var s=function i(o,a,u,s,c){return _e.resolve().then(function(){var e=me.transless||me,t=o._createTransaction(a,u,o._dbSchema,s);if(t.explicit=!0,e={trans:t,transless:e},s)t.idbtrans=s.idbtrans;else try{t.create(),t.idbtrans._explicit=!0,o._state.PR1398_maxLoop=3}catch(e){return e.name===z.InvalidState&&o.isOpen()&&0<--o._state.PR1398_maxLoop?(console.warn(\"Dexie: Need to reopen db\"),o.close({disableAutoOpen:!1}),o.open().then(function(){return i(o,a,u,null,c)})):Xe(e)}var n,r=B(c);return r&&Le(),e=_e.follow(function(){var e;(n=c.call(t,t))&&(r?(e=Ue.bind(null,null),n.then(e,e)):\"function\"==typeof n.next&&\"function\"==typeof n.throw&&(n=Rn(n)))},e),(n&&\"function\"==typeof n.then?_e.resolve(n).then(function(e){return t.active?e:Xe(new Y.PrematureCommit(\"Transaction committed too early. See http://bit.ly/2kdckMn\"))}):e.then(function(){return n})).then(function(e){return s&&t._resolve(),t._completion.then(function(){return e})}).catch(function(e){return t._reject(e),Xe(e)})})}.bind(null,this,o,a,i,n);return i?i._promise(o,s,\"lock\"):me.trans?$e(me.transless,function(){return r._whenReady(s)}):this._whenReady(s)},rr.prototype.table=function(e){if(!m(this._allTables,e))throw new Y.InvalidTable(\"Table \".concat(e,\" does not exist\"));return this._allTables[e]},rr);function rr(e,t){var o=this;this._middlewares={},this.verno=0;var n=rr.dependencies;this._options=t=_({addons:rr.addons,autoOpen:!0,indexedDB:n.indexedDB,IDBKeyRange:n.IDBKeyRange,cache:\"cloned\"},t),this._deps={indexedDB:t.indexedDB,IDBKeyRange:t.IDBKeyRange};n=t.addons;this._dbSchema={},this._versions=[],this._storeNames=[],this._allTables={},this.idbdb=null,this._novip=this;var a,r,u,i,s,c={dbOpenError:null,isBeingOpened:!1,onReadyBeingFired:null,openComplete:!1,dbReadyResolve:G,dbReadyPromise:null,cancelOpen:G,openCanceller:null,autoSchema:!0,PR1398_maxLoop:3,autoOpen:t.autoOpen};c.dbReadyPromise=new _e(function(e){c.dbReadyResolve=e}),c.openCanceller=new _e(function(e,t){c.cancelOpen=t}),this._state=c,this.name=e,this.on=mt(this,\"populate\",\"blocked\",\"versionchange\",\"close\",{ready:[re,G]}),this.once=function(n,r){var i=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];o.on(n).unsubscribe(i),r.apply(o,e)};return o.on(n,i)},this.on.ready.subscribe=p(this.on.ready.subscribe,function(i){return function(n,r){rr.vip(function(){var t,e=o._state;e.openComplete?(e.dbOpenError||_e.resolve().then(n),r&&i(n)):e.onReadyBeingFired?(e.onReadyBeingFired.push(n),r&&i(n)):(i(n),t=o,r||i(function e(){t.on.ready.unsubscribe(n),t.on.ready.unsubscribe(e)}))})}}),this.Collection=(a=this,bt(Kt.prototype,function(e,t){this.db=a;var n=ot,r=null;if(t)try{n=t()}catch(e){r=e}var i=e._ctx,t=i.table,e=t.hook.reading.fire;this._ctx={table:t,index:i.index,isPrimKey:!i.index||t.schema.primKey.keyPath&&i.index===t.schema.primKey.name,range:n,keysOnly:!1,dir:\"next\",unique:\"\",algorithm:null,filter:null,replayFilter:null,justLimit:!0,isMatch:null,offset:0,limit:1/0,error:r,or:i.or,valueMapper:e!==X?e:null}})),this.Table=(r=this,bt(yt.prototype,function(e,t,n){this.db=r,this._tx=n,this.name=e,this.schema=t,this.hook=r._allTables[e]?r._allTables[e].hook:mt(null,{creating:[Z,G],reading:[H,X],updating:[te,G],deleting:[ee,G]})})),this.Transaction=(u=this,bt(Vt.prototype,function(e,t,n,r,i){var o=this;\"readonly\"!==e&&t.forEach(function(e){e=null===(e=n[e])||void 0===e?void 0:e.yProps;e&&(t=t.concat(e.map(function(e){return e.updatesTable})))}),this.db=u,this.mode=e,this.storeNames=t,this.schema=n,this.chromeTransactionDurability=r,this.idbtrans=null,this.on=mt(this,\"complete\",\"error\",\"abort\"),this.parent=i||null,this.active=!0,this._reculock=0,this._blockedFuncs=[],this._resolve=null,this._reject=null,this._waitingFor=null,this._waitingQueue=null,this._spinCount=0,this._completion=new _e(function(e,t){o._resolve=e,o._reject=t}),this._completion.then(function(){o.active=!1,o.on.complete.fire()},function(e){var t=o.active;return o.active=!1,o.on.error.fire(e),o.parent?o.parent._reject(e):t&&o.idbtrans&&o.idbtrans.abort(),Xe(e)})})),this.Version=(i=this,bt(yn.prototype,function(e){this.db=i,this._cfg={version:e,storesSource:null,dbschema:{},tables:{},contentUpgrade:null}})),this.WhereClause=(s=this,bt(Bt.prototype,function(e,t,n){if(this.db=s,this._ctx={table:e,index:\":id\"===t?null:t,or:n},this._cmp=this._ascending=st,this._descending=function(e,t){return st(t,e)},this._max=function(e,t){return 0<st(e,t)?e:t},this._min=function(e,t){return st(e,t)<0?e:t},this._IDBKeyRange=s._deps.IDBKeyRange,!this._IDBKeyRange)throw new Y.MissingAPI})),this.on(\"versionchange\",function(e){0<e.newVersion?console.warn(\"Another connection wants to upgrade database '\".concat(o.name,\"'. Closing db now to resume the upgrade.\")):console.warn(\"Another connection wants to delete database '\".concat(o.name,\"'. Closing db now to resume the delete request.\")),o.close({disableAutoOpen:!1})}),this.on(\"blocked\",function(e){!e.newVersion||e.newVersion<e.oldVersion?console.warn(\"Dexie.delete('\".concat(o.name,\"') was blocked\")):console.warn(\"Upgrade '\".concat(o.name,\"' blocked by other connection holding version \").concat(e.oldVersion/10))}),this._maxKey=Qt(t.IDBKeyRange),this._createTransaction=function(e,t,n,r){return new o.Transaction(e,t,n,o._options.chromeTransactionDurability,r)},this._fireOnBlocked=function(t){o.on(\"blocked\").fire(t),et.filter(function(e){return e.name===o.name&&e!==o&&!e._state.vcFired}).map(function(e){return e.on(\"versionchange\").fire(t)})},this.use(zn),this.use(er),this.use($n),this.use(Mn),this.use(Un);var l=new Proxy(this,{get:function(e,t,n){if(\"_vip\"===t)return!0;if(\"table\"===t)return function(e){return tr(o.table(e),l)};var r=Reflect.get(e,t,n);return r instanceof yt?tr(r,l):\"tables\"===t?r.map(function(e){return tr(e,l)}):\"_createTransaction\"===t?function(){return tr(r.apply(this,arguments),l)}:r}});this.vip=l,n.forEach(function(e){return e(o)})}var ir,F=\"undefined\"!=typeof Symbol&&\"observable\"in Symbol?Symbol.observable:\"@@observable\",or=(ar.prototype.subscribe=function(e,t,n){return this._subscribe(e&&\"function\"!=typeof e?e:{next:e,error:t,complete:n})},ar.prototype[F]=function(){return this},ar);function ar(e){this._subscribe=e}try{ir={indexedDB:f.indexedDB||f.mozIndexedDB||f.webkitIndexedDB||f.msIndexedDB,IDBKeyRange:f.IDBKeyRange||f.webkitIDBKeyRange}}catch(e){ir={indexedDB:null,IDBKeyRange:null}}function ur(h){var d,p=!1,e=new or(function(r){var i=B(h);var o,a=!1,u={},s={},e={get closed(){return a},unsubscribe:function(){a||(a=!0,o&&o.abort(),c&&Ut.storagemutated.unsubscribe(f))}};r.start&&r.start(e);var c=!1,l=function(){return Ge(t)};var f=function(e){Sn(u,e),jn(s,u)&&l()},t=function(){var t,n,e;!a&&ir.indexedDB&&(u={},t={},o&&o.abort(),o=new AbortController,e=function(e){var t=je();try{i&&Le();var n=Ne(h,e);return n=i?n.finally(Ue):n}finally{t&&Ae()}}(n={subscr:t,signal:o.signal,requery:l,querier:h,trans:null}),Promise.resolve(e).then(function(e){p=!0,d=e,a||n.signal.aborted||(u={},function(e){for(var t in e)if(m(e,t))return;return 1}(s=t)||c||(Ut(Nt,f),c=!0),Ge(function(){return!a&&r.next&&r.next(e)}))},function(e){p=!1,[\"DatabaseClosedError\",\"AbortError\"].includes(null==e?void 0:e.name)||a||Ge(function(){a||r.error&&r.error(e)})}))};return setTimeout(l,0),e});return e.hasValue=function(){return p},e.getValue=function(){return d},e}var sr=nr;function cr(e){var t=fr;try{fr=!0,Ut.storagemutated.fire(e),qn(e,!0)}finally{fr=t}}r(sr,_(_({},Q),{delete:function(e){return new sr(e,{addons:[]}).delete()},exists:function(e){return new sr(e,{addons:[]}).open().then(function(e){return e.close(),!0}).catch(\"NoSuchDatabaseError\",function(){return!1})},getDatabaseNames:function(e){try{return t=sr.dependencies,n=t.indexedDB,t=t.IDBKeyRange,(bn(n)?Promise.resolve(n.databases()).then(function(e){return e.map(function(e){return e.name}).filter(function(e){return e!==tt})}):mn(n,t).toCollection().primaryKeys()).then(e)}catch(e){return Xe(new Y.MissingAPI)}var t,n},defineClass:function(){return function(e){a(this,e)}},ignoreTransaction:function(e){return me.trans?$e(me.transless,e):e()},vip:gn,async:function(t){return function(){try{var e=Rn(t.apply(this,arguments));return e&&\"function\"==typeof e.then?e:_e.resolve(e)}catch(e){return Xe(e)}}},spawn:function(e,t,n){try{var r=Rn(e.apply(n,t||[]));return r&&\"function\"==typeof r.then?r:_e.resolve(r)}catch(e){return Xe(e)}},currentTransaction:{get:function(){return me.trans||null}},waitFor:function(e,t){t=_e.resolve(\"function\"==typeof e?sr.ignoreTransaction(e):e).timeout(t||6e4);return me.trans?me.trans.waitFor(t):t},Promise:_e,debug:{get:function(){return ie},set:function(e){oe(e)}},derive:o,extend:a,props:r,override:p,Events:mt,on:Ut,liveQuery:ur,extendObservabilitySet:Sn,getByKeyPath:g,setByKeyPath:w,delByKeyPath:function(t,e){\"string\"==typeof e?w(t,e,void 0):\"length\"in e&&[].map.call(e,function(e){w(t,e,void 0)})},shallowClone:k,deepClone:S,getObjectDiff:Nn,cmp:st,asap:v,minKey:-1/0,addons:[],connections:et,errnames:z,dependencies:ir,cache:An,semVer:\"4.2.1\",version:\"4.2.1\".split(\".\").map(function(e){return parseInt(e)}).reduce(function(e,t,n){return e+t/Math.pow(10,2*n)})})),sr.maxKey=Qt(sr.dependencies.IDBKeyRange),\"undefined\"!=typeof dispatchEvent&&\"undefined\"!=typeof addEventListener&&(Ut(Nt,function(e){fr||(e=new CustomEvent(Lt,{detail:e}),fr=!0,dispatchEvent(e),fr=!1)}),addEventListener(Lt,function(e){e=e.detail;fr||cr(e)}));var lr,fr=!1,hr=function(){};return\"undefined\"!=typeof BroadcastChannel&&((hr=function(){(lr=new BroadcastChannel(Lt)).onmessage=function(e){return e.data&&cr(e.data)}})(),\"function\"==typeof lr.unref&&lr.unref(),Ut(Nt,function(e){fr||lr.postMessage(e)})),\"undefined\"!=typeof addEventListener&&(addEventListener(\"pagehide\",function(e){if(!nr.disableBfCache&&e.persisted){ie&&console.debug(\"Dexie: handling persisted pagehide\"),null!=lr&&lr.close();for(var t=0,n=et;t<n.length;t++)n[t].close({disableAutoOpen:!1})}}),addEventListener(\"pageshow\",function(e){!nr.disableBfCache&&e.persisted&&(ie&&console.debug(\"Dexie: handling persisted pageshow\"),hr(),cr({all:new _n(-1/0,[[]])}))})),_e.rejectionMapper=function(e,t){return!e||e instanceof N||e instanceof TypeError||e instanceof SyntaxError||!e.name||!$[e.name]?e:(t=new $[e.name](t||e.message,e),\"stack\"in e&&l(t,\"stack\",{get:function(){return this.inner.stack}}),t)},oe(ie),_(nr,Object.freeze({__proto__:null,Dexie:nr,liveQuery:ur,Entity:ut,cmp:st,PropModification:ht,replacePrefix:function(e,t){return new ht({replacePrefix:[e,t]})},add:function(e){return new ht({add:e})},remove:function(e){return new ht({remove:e})},default:nr,RangeSet:_n,mergeRanges:kn,rangesOverlap:On}),{default:nr}),nr});\n//# sourceMappingURL=dexie.min.js.map","// Making the module version consumable via require - to prohibit\n// multiple occurrancies of the same module in the same app\n// (dual package hazard, https://nodejs.org/api/packages.html#dual-package-hazard)\nimport _Dexie from \"./dist/dexie.min.js\";\nconst DexieSymbol = Symbol.for(\"Dexie\");\nconst Dexie = globalThis[DexieSymbol] || (globalThis[DexieSymbol] = _Dexie);\nif (_Dexie.semVer !== Dexie.semVer) {\n throw new Error(`Two different versions of Dexie loaded in the same app: ${_Dexie.semVer} and ${Dexie.semVer}`);\n}\nconst {\n liveQuery, mergeRanges, rangesOverlap, RangeSet, cmp, Entity,\n PropModification, replacePrefix, add, remove,\n DexieYProvider } = Dexie;\nexport { liveQuery, mergeRanges, rangesOverlap, RangeSet, cmp, Dexie, Entity,\n PropModification, replacePrefix, add, remove,\n DexieYProvider};\nexport default Dexie;\n","// src/index.ts\nimport { NDKEvent as NDKEvent2, deserialize, profileFromEvent } from \"@nostr-dev-kit/ndk\";\nimport createDebug2 from \"debug\";\nimport { matchFilter } from \"nostr-tools\";\n\n// src/caches/event-tags.ts\nasync function eventTagsWarmUp(cacheHandler, eventTags) {\n const array = await eventTags.limit(cacheHandler.maxSize).toArray();\n for (const event of array) {\n cacheHandler.add(event.tagValue, event.eventId, false);\n }\n}\nvar eventTagsDump = (eventTags, debug) => {\n return async (dirtyKeys, cache) => {\n const entries = [];\n for (const tagValue of dirtyKeys) {\n const eventIds = cache.get(tagValue);\n if (eventIds) {\n for (const eventId of eventIds) entries.push({ tagValue, eventId });\n }\n }\n if (entries.length > 0) {\n debug(`Saving ${entries.length} events cache entries to database`);\n await eventTags.bulkPut(entries);\n }\n dirtyKeys.clear();\n };\n};\n\n// src/caches/events.ts\nasync function eventsWarmUp(cacheHandler, events) {\n const array = await events.limit(cacheHandler.maxSize).toArray();\n for (const event of array) {\n cacheHandler.set(event.id, event, false);\n }\n}\nvar eventsDump = (events, debug) => {\n return async (dirtyKeys, cache) => {\n const entries = [];\n for (const event of dirtyKeys) {\n const entry = cache.get(event);\n if (entry) entries.push(entry);\n }\n if (entries.length > 0) {\n debug(`Saving ${entries.length} events cache entries to database`);\n await events.bulkPut(entries);\n }\n dirtyKeys.clear();\n };\n};\n\n// src/caches/nip05.ts\nasync function nip05WarmUp(cacheHandler, nip05s) {\n const array = await nip05s.limit(cacheHandler.maxSize).toArray();\n for (const nip05 of array) {\n cacheHandler.set(nip05.nip05, nip05, false);\n }\n}\nvar nip05Dump = (nip05s, debug) => {\n return async (dirtyKeys, cache) => {\n const entries = [];\n for (const nip05 of dirtyKeys) {\n const entry = cache.get(nip05);\n if (entry) {\n entries.push({\n nip05,\n ...entry\n });\n }\n }\n if (entries.length) {\n debug(`Saving ${entries.length} NIP-05 cache entries to database`);\n await nip05s.bulkPut(entries);\n }\n dirtyKeys.clear();\n };\n};\n\n// src/db.ts\nimport Dexie from \"dexie\";\nvar Database = class extends Dexie {\n profiles;\n events;\n eventTags;\n nip05;\n lnurl;\n relayStatus;\n unpublishedEvents;\n constructor(name) {\n super(name);\n this.version(15).stores({\n profiles: \"&pubkey\",\n events: \"&id, kind\",\n eventTags: \"&tagValue\",\n nip05: \"&nip05\",\n lnurl: \"&pubkey\",\n relayStatus: \"&url\",\n unpublishedEvents: \"&id\"\n });\n }\n};\nvar db;\nfunction createDatabase(name) {\n db = new Database(name);\n}\n\n// src/caches/profiles.ts\nimport createDebug from \"debug\";\nvar d = createDebug(\"ndk:dexie-adapter:profiles\");\nasync function profilesWarmUp(cacheHandler, profiles) {\n const array = await profiles.limit(cacheHandler.maxSize).toArray();\n for (const user of array) {\n const obj = user;\n cacheHandler.set(user.pubkey, obj, false);\n }\n d(\"Loaded %d profiles from database\", cacheHandler.size());\n}\nvar profilesDump = (profiles, debug) => {\n return async (dirtyKeys, cache) => {\n const entries = [];\n for (const pubkey of dirtyKeys) {\n const entry = cache.get(pubkey);\n if (entry) {\n entries.push(entry);\n }\n }\n if (entries.length) {\n debug(`Saving ${entries.length} users to database`);\n await profiles.bulkPut(entries);\n }\n dirtyKeys.clear();\n };\n};\n\n// src/caches/relay-info.ts\nasync function relayInfoWarmUp(cacheHandler, relayStatus) {\n const array = await relayStatus.limit(cacheHandler.maxSize).toArray();\n for (const entry of array) {\n cacheHandler.set(\n entry.url,\n {\n url: entry.url,\n updatedAt: entry.updatedAt,\n lastConnectedAt: entry.lastConnectedAt,\n dontConnectBefore: entry.dontConnectBefore\n },\n false\n );\n }\n}\nvar relayInfoDump = (relayStatus, debug) => {\n return async (dirtyKeys, cache) => {\n const entries = [];\n for (const url of dirtyKeys) {\n const info = cache.get(url);\n if (info) {\n entries.push({\n url,\n updatedAt: info.updatedAt,\n lastConnectedAt: info.lastConnectedAt,\n dontConnectBefore: info.dontConnectBefore\n });\n }\n }\n if (entries.length > 0) {\n debug(`Saving ${entries.length} relay status cache entries to database`);\n await relayStatus.bulkPut(entries);\n }\n dirtyKeys.clear();\n };\n};\n\n// src/caches/unpublished-events.ts\nimport { NDKEvent } from \"@nostr-dev-kit/ndk\";\nvar WRITE_STATUS_THRESHOLD = 3;\nasync function unpublishedEventsWarmUp(cacheHandler, unpublishedEvents) {\n await unpublishedEvents.each((unpublishedEvent) => {\n cacheHandler.set(unpublishedEvent.event.id, unpublishedEvent, false);\n });\n}\nfunction unpublishedEventsDump(unpublishedEvents, debug) {\n return async (dirtyKeys, cache) => {\n const entries = [];\n for (const eventId of dirtyKeys) {\n const entry = cache.get(eventId);\n if (entry) {\n entries.push(entry);\n }\n }\n if (entries.length > 0) {\n debug(`Saving ${entries.length} unpublished events cache entries to database`);\n await unpublishedEvents.bulkPut(entries);\n }\n dirtyKeys.clear();\n };\n}\nasync function discardUnpublishedEvent(unpublishedEvents, eventId) {\n await unpublishedEvents.delete(eventId);\n}\nasync function getUnpublishedEvents(unpublishedEvents) {\n const events = [];\n await unpublishedEvents.each((unpublishedEvent) => {\n events.push({\n event: new NDKEvent(void 0, unpublishedEvent.event),\n relays: Object.keys(unpublishedEvent.relays),\n lastTryAt: unpublishedEvent.lastTryAt\n });\n });\n return events;\n}\nfunction addUnpublishedEvent(event, relays) {\n const r = {};\n relays.forEach((url) => r[url] = false);\n this.unpublishedEvents.set(event.id, { id: event.id, event: event.rawEvent(), relays: r });\n const onPublished = (relay) => {\n const url = relay.url;\n const existingEntry = this.unpublishedEvents.get(event.id);\n if (!existingEntry) {\n event.off(\"publushed\", onPublished);\n return;\n }\n existingEntry.relays[url] = true;\n this.unpublishedEvents.set(event.id, existingEntry);\n const successWrites = Object.values(existingEntry.relays).filter((v) => v).length;\n const unsuccessWrites = Object.values(existingEntry.relays).length - successWrites;\n if (successWrites >= WRITE_STATUS_THRESHOLD || unsuccessWrites === 0) {\n this.unpublishedEvents.delete(event.id);\n event.off(\"published\", onPublished);\n }\n };\n event.on(\"published\", onPublished);\n}\n\n// src/caches/zapper.ts\nasync function zapperWarmUp(cacheHandler, lnurls) {\n const array = await lnurls.limit(cacheHandler.maxSize).toArray();\n for (const lnurl of array) {\n cacheHandler.set(lnurl.pubkey, { document: lnurl.document, fetchedAt: lnurl.fetchedAt }, false);\n }\n}\nvar zapperDump = (lnurls, debug) => {\n return async (dirtyKeys, cache) => {\n const entries = [];\n for (const pubkey of dirtyKeys) {\n const entry = cache.get(pubkey);\n if (entry) {\n entries.push({\n pubkey,\n ...entry\n });\n }\n }\n if (entries.length) {\n debug(`Saving ${entries.length} zapper cache entries to database`);\n await lnurls.bulkPut(entries);\n }\n dirtyKeys.clear();\n };\n};\n\n// src/lru-cache.ts\nimport { LRUCache } from \"typescript-lru-cache\";\nvar CacheHandler = class {\n cache;\n dirtyKeys = /* @__PURE__ */ new Set();\n options;\n debug;\n indexes;\n isSet = false;\n maxSize = 0;\n constructor(options) {\n this.debug = options.debug;\n this.options = options;\n this.maxSize = options.maxSize;\n if (options.maxSize > 0) {\n this.cache = new LRUCache({ maxSize: options.maxSize });\n setInterval(() => this.dump().catch(console.error), 1e3 * 10);\n }\n this.indexes = /* @__PURE__ */ new Map();\n }\n getSet(key) {\n return this.cache?.get(key);\n }\n /**\n * Get all entries that match the filter.\n */\n getAllWithFilter(filter) {\n const ret = /* @__PURE__ */ new Map();\n this.cache?.forEach((val, key) => {\n if (filter(key, val)) {\n ret.set(key, val);\n }\n });\n return ret;\n }\n get(key) {\n return this.cache?.get(key);\n }\n async getWithFallback(key, table) {\n let entry = this.get(key);\n if (!entry) {\n entry = await table.get(key);\n if (entry) {\n this.set(key, entry);\n }\n }\n return entry;\n }\n async getManyWithFallback(keys, table) {\n const entries = [];\n const missingKeys = [];\n for (const key of keys) {\n const entry = this.get(key);\n if (entry) entries.push(entry);\n else missingKeys.push(key);\n }\n if (entries.length > 0) {\n this.debug(`Cache hit for keys ${entries.length} and miss for ${missingKeys.length} keys`);\n }\n if (missingKeys.length > 0) {\n const startTime = Date.now();\n const missingEntries = await table.bulkGet(missingKeys);\n const endTime = Date.now();\n let foundKeys = 0;\n for (const entry of missingEntries) {\n if (entry) {\n this.set(entry.id, entry);\n entries.push(entry);\n foundKeys++;\n }\n }\n this.debug(\n `Time spent querying database: ${endTime - startTime}ms for ${missingKeys.length} keys, which added ${foundKeys} entries to the cache`\n );\n }\n return entries;\n }\n add(key, value, dirty = true) {\n const existing = this.get(key) ?? /* @__PURE__ */ new Set();\n existing.add(value);\n this.cache?.set(key, existing);\n if (dirty) this.dirtyKeys.add(key);\n }\n set(key, value, dirty = true) {\n this.cache?.set(key, value);\n if (dirty) this.dirtyKeys.add(key);\n for (const [attribute, index] of this.indexes.entries()) {\n const indexKey = value[attribute];\n if (indexKey) {\n const indexValue = index.get(indexKey) || /* @__PURE__ */ new Set();\n indexValue.add(key);\n index.set(indexKey, indexValue);\n }\n }\n }\n size() {\n return this.cache?.size || 0;\n }\n delete(key) {\n this.cache?.delete(key);\n this.dirtyKeys.add(key);\n }\n async dump() {\n if (this.dirtyKeys.size > 0 && this.cache) {\n await this.options.dump(this.dirtyKeys, this.cache);\n this.dirtyKeys.clear();\n }\n }\n addIndex(attribute) {\n this.indexes.set(attribute, new LRUCache({ maxSize: this.options.maxSize }));\n }\n getFromIndex(index, key) {\n const ret = /* @__PURE__ */ new Set();\n const indexValues = this.indexes.get(index);\n if (indexValues) {\n const values = indexValues.get(key);\n if (values) {\n for (const key2 of values.values()) {\n const entry = this.get(key2);\n if (entry) ret.add(entry);\n }\n }\n }\n return ret;\n }\n};\n\n// src/index.ts\nvar INDEXABLE_TAGS_LIMIT = 10;\nvar NDKCacheAdapterDexie = class {\n debug;\n locking = false;\n ready = false;\n profiles;\n zappers;\n nip05s;\n events;\n eventTags;\n relayInfo;\n unpublishedEvents;\n warmedUp = false;\n warmUpPromise;\n devMode = false;\n saveSig;\n _onReady;\n constructor(opts = {}) {\n createDatabase(opts.dbName || \"ndk\");\n this.debug = opts.debug || createDebug2(\"ndk:dexie-adapter\");\n this.saveSig = opts.saveSig || false;\n this.profiles = new CacheHandler({\n maxSize: opts.profileCacheSize || 1e5,\n dump: profilesDump(db.profiles, this.debug),\n debug: this.debug\n });\n this.zappers = new CacheHandler({\n maxSize: opts.zapperCacheSize || 200,\n dump: zapperDump(db.lnurl, this.debug),\n debug: this.debug\n });\n this.nip05s = new CacheHandler({\n maxSize: opts.nip05CacheSize || 1e3,\n dump: nip05Dump(db.nip05, this.debug),\n debug: this.debug\n });\n this.events = new CacheHandler({\n maxSize: opts.eventCacheSize || 5e4,\n dump: eventsDump(db.events, this.debug),\n debug: this.debug\n });\n this.events.addIndex(\"pubkey\");\n this.events.addIndex(\"kind\");\n this.eventTags = new CacheHandler({\n maxSize: opts.eventTagsCacheSize || 1e5,\n dump: eventTagsDump(db.eventTags, this.debug),\n debug: this.debug\n });\n this.relayInfo = new CacheHandler({\n maxSize: 500,\n debug: this.debug,\n dump: relayInfoDump(db.relayStatus, this.debug)\n });\n this.unpublishedEvents = new CacheHandler({\n maxSize: 5e3,\n debug: this.debug,\n dump: unpublishedEventsDump(db.unpublishedEvents, this.debug)\n });\n const profile = (label, fn) => {\n const start = Date.now();\n return fn().then(() => {\n const end = Date.now();\n this.debug(label, \"took\", end - start, \"ms\");\n });\n };\n const startTime = Date.now();\n this.warmUpPromise = Promise.allSettled([\n profile(\"profilesWarmUp\", () => profilesWarmUp(this.profiles, db.profiles)),\n profile(\"zapperWarmUp\", () => zapperWarmUp(this.zappers, db.lnurl)),\n profile(\"nip05WarmUp\", () => nip05WarmUp(this.nip05s, db.nip05)),\n profile(\"relayInfoWarmUp\", () => relayInfoWarmUp(this.relayInfo, db.relayStatus)),\n profile(\n \"unpublishedEventsWarmUp\",\n () => unpublishedEventsWarmUp(this.unpublishedEvents, db.unpublishedEvents)\n ),\n profile(\"eventsWarmUp\", () => eventsWarmUp(this.events, db.events)),\n profile(\"eventTagsWarmUp\", () => eventTagsWarmUp(this.eventTags, db.eventTags))\n ]);\n this.warmUpPromise.then(() => {\n const endTime = Date.now();\n this.warmedUp = true;\n this.ready = true;\n this.locking = true;\n this.debug(\"Warm up completed, time\", endTime - startTime, \"ms\");\n if (this._onReady) this._onReady();\n });\n }\n onReady(callback) {\n this._onReady = callback;\n }\n async query(subscription) {\n if (!this.warmedUp) {\n const startTime2 = Date.now();\n await this.warmUpPromise;\n this.debug(\"froze query for\", Date.now() - startTime2, \"ms\", subscription.filters);\n }\n const startTime = Date.now();\n subscription.filters.map((filter) => this.processFilter(filter, subscription));\n const dur = Date.now() - startTime;\n if (dur > 100) this.debug(\"query took\", dur, \"ms\", subscription.filter);\n return [];\n }\n async fetchProfile(pubkey) {\n if (!this.profiles) return null;\n const user = await this.profiles.getWithFallback(pubkey, db.profiles);\n return user;\n }\n fetchProfileSync(pubkey) {\n if (!this.profiles) return null;\n const user = this.profiles.get(pubkey);\n return user;\n }\n async getProfiles(fn) {\n if (!this.profiles) return;\n return this.profiles.getAllWithFilter(fn);\n }\n saveProfile(pubkey, profile) {\n const existingValue = this.profiles.get(pubkey);\n if (existingValue?.created_at && profile.created_at && existingValue.created_at >= profile.created_at) {\n return;\n }\n const cachedAt = Math.floor(Date.now() / 1e3);\n this.profiles.set(pubkey, { pubkey, ...profile, cachedAt });\n this.debug(\"Saved profile for pubkey\", pubkey, profile);\n }\n async loadNip05(nip05, maxAgeForMissing = 3600) {\n const cache = this.nip05s?.get(nip05);\n if (cache) {\n if (cache.profile === null) {\n if (cache.fetchedAt + maxAgeForMissing * 1e3 < Date.now()) return \"missing\";\n return null;\n }\n try {\n return JSON.parse(cache.profile);\n } catch (_e) {\n return \"missing\";\n }\n }\n const nip = await db.nip05.get({ nip05 });\n if (!nip) return \"missing\";\n const now = Date.now();\n if (nip.profile === null) {\n if (nip.fetchedAt + maxAgeForMissing * 1e3 < now) return \"missing\";\n return null;\n }\n try {\n return JSON.parse(nip.profile);\n } catch (_e) {\n return \"missing\";\n }\n }\n async saveNip05(nip05, profile) {\n try {\n const document = profile ? JSON.stringify(profile) : null;\n this.nip05s.set(nip05, { profile: document, fetchedAt: Date.now() });\n } catch (error) {\n console.error(\"Failed to save NIP-05 profile for nip05:\", nip05, error);\n }\n }\n async loadUsersLNURLDoc(pubkey, maxAgeInSecs = 86400, maxAgeForMissing = 3600) {\n const cache = this.zappers?.get(pubkey);\n if (cache) {\n if (cache.document === null) {\n if (cache.fetchedAt + maxAgeForMissing * 1e3 < Date.now()) return \"missing\";\n return null;\n }\n try {\n return JSON.parse(cache.document);\n } catch (_e) {\n return \"missing\";\n }\n }\n const lnurl = await db.lnurl.get({ pubkey });\n if (!lnurl) return \"missing\";\n const now = Date.now();\n if (lnurl.fetchedAt + maxAgeInSecs * 1e3 < now) return \"missing\";\n if (lnurl.document === null) {\n if (lnurl.fetchedAt + maxAgeForMissing * 1e3 < now) return \"missing\";\n return null;\n }\n try {\n return JSON.parse(lnurl.document);\n } catch (_e) {\n return \"missing\";\n }\n }\n async saveUsersLNURLDoc(pubkey, doc) {\n try {\n const document = doc ? JSON.stringify(doc) : null;\n this.zappers?.set(pubkey, { document, fetchedAt: Date.now() });\n } catch (error) {\n console.error(\"Failed to save LNURL document for pubkey:\", pubkey, error);\n }\n }\n processFilter(filter, subscription) {\n const _filter = { ...filter };\n _filter.limit = void 0;\n const filterKeys = new Set(Object.keys(_filter || {}));\n filterKeys.delete(\"since\");\n filterKeys.delete(\"limit\");\n filterKeys.delete(\"until\");\n try {\n if (this.byNip33Query(filterKeys, filter, subscription)) return;\n if (this.byAuthors(filter, subscription)) return;\n if (this.byIdsQuery(filter, subscription)) return;\n if (this.byTags(filter, subscription)) return;\n if (this.byKinds(filterKeys, filter, subscription)) return;\n } catch (error) {\n console.error(error);\n }\n }\n async deleteEventIds(eventIds) {\n eventIds.forEach((id) => this.events.delete(id));\n await db.events.where({ id: eventIds }).delete();\n }\n addUnpublishedEvent = addUnpublishedEvent.bind(this);\n getUnpublishedEvents = () => getUnpublishedEvents(db.unpublishedEvents);\n discardUnpublishedEvent = (id) => discardUnpublishedEvent(db.unpublishedEvents, id);\n async setEvent(event, _filters, relay) {\n if (event.kind === 0) {\n if (!this.profiles) return;\n try {\n const profile = profileFromEvent(event);\n this.saveProfile(event.pubkey, profile);\n } catch {\n this.debug(`Failed to save profile for pubkey: ${event.pubkey}`);\n }\n }\n let addEvent = true;\n if (event.isParamReplaceable()) {\n const existingEvent = this.events.get(event.tagId());\n if (existingEvent && event.created_at && existingEvent.createdAt > event.created_at) {\n addEvent = false;\n }\n }\n if (addEvent) {\n const eventData = {\n id: event.tagId(),\n pubkey: event.pubkey,\n kind: event.kind,\n createdAt: event.created_at ?? Date.now(),\n relay: relay?.url,\n event: event.serialize(this.saveSig, true)\n };\n if (this.saveSig && event.sig) {\n eventData.sig = event.sig;\n }\n this.events.set(event.tagId(), eventData);\n const indexableTags = getIndexableTags(event);\n for (const tag of indexableTags) {\n this.eventTags.add(tag[0] + tag[1], event.tagId());\n }\n }\n }\n updateRelayStatus(url, info) {\n const val = { url, updatedAt: Date.now(), ...info };\n this.relayInfo.set(url, val);\n }\n getRelayStatus(url) {\n const a = this.relayInfo.get(url);\n if (a) {\n return {\n lastConnectedAt: a.lastConnectedAt,\n dontConnectBefore: a.dontConnectBefore\n };\n }\n }\n /**\n * Searches by authors\n */\n byAuthors(filter, subscription) {\n if (!filter.authors) return false;\n let _total = 0;\n for (const pubkey of filter.authors) {\n let events = Array.from(this.events.getFromIndex(\"pubkey\", pubkey));\n if (filter.kinds) events = events.filter((e) => filter.kinds?.includes(e.kind));\n foundEvents(subscription, events, filter);\n _total += events.length;\n }\n return true;\n }\n /**\n * Searches by ids\n */\n byIdsQuery(filter, subscription) {\n if (filter.ids) {\n for (const id of filter.ids) {\n const event = this.events.get(id);\n if (event) foundEvent(subscription, event, event.relay, filter);\n }\n return true;\n }\n return false;\n }\n /**\n * Searches by NIP-33\n */\n byNip33Query(filterKeys, filter, subscription) {\n const f = [\"#d\", \"authors\", \"kinds\"];\n const hasAllKeys = filterKeys.size === f.length && f.every((k) => filterKeys.has(k));\n if (hasAllKeys && filter.kinds && filter.authors) {\n for (const kind of filter.kinds) {\n const replaceableKind = kind >= 3e4 && kind < 4e4;\n if (!replaceableKind) continue;\n for (const author of filter.authors) {\n for (const dTag of filter[\"#d\"]) {\n const replaceableId = `${kind}:${author}:${dTag}`;\n const event = this.events.get(replaceableId);\n if (event) foundEvent(subscription, event, event.relay, filter);\n }\n }\n }\n return true;\n }\n return false;\n }\n /**\n * Searches by tags and optionally filters by tags\n */\n byTags(filter, subscription) {\n const tagFilters = Object.entries(filter).filter(([filter2]) => filter2.startsWith(\"#\") && filter2.length === 2).map(([filter2, values]) => [filter2[1], values]);\n if (tagFilters.length === 0) return false;\n for (const [tag, values] of tagFilters) {\n for (const value of values) {\n const tagValue = tag + value;\n const eventIds = this.eventTags.getSet(tagValue);\n if (!eventIds) continue;\n eventIds.forEach((id) => {\n const event = this.events.get(id);\n if (!event) return;\n if (!filter.kinds || filter.kinds.includes(event.kind)) {\n foundEvent(subscription, event, event.relay, filter);\n }\n });\n }\n }\n return true;\n }\n byKinds(filterKeys, filter, subscription) {\n if (!filter.kinds || filterKeys.size !== 1 || !filterKeys.has(\"kinds\")) return false;\n const limit = filter.limit || 500;\n let totalEvents = 0;\n const processedEventIds = /* @__PURE__ */ new Set();\n const sortedKinds = [...filter.kinds].sort(\n (a, b) => (this.events.indexes.get(\"kind\")?.get(a)?.size || 0) - (this.events.indexes.get(\"kind\")?.get(b)?.size || 0)\n );\n for (const kind of sortedKinds) {\n const events = this.events.getFromIndex(\"kind\", kind);\n for (const event of events) {\n if (processedEventIds.has(event.id)) continue;\n processedEventIds.add(event.id);\n foundEvent(subscription, event, event.relay, filter);\n totalEvents++;\n if (totalEvents >= limit) break;\n }\n if (totalEvents >= limit) break;\n }\n return true;\n }\n};\nfunction foundEvents(subscription, events, filter) {\n if (filter?.limit && events.length > filter.limit) {\n events = events.sort((a, b) => b.createdAt - a.createdAt).slice(0, filter.limit);\n }\n for (const event of events) {\n foundEvent(subscription, event, event.relay, filter);\n }\n}\nfunction foundEvent(subscription, event, relayUrl, filter) {\n try {\n const deserializedEvent = deserialize(event.event);\n if (filter && !matchFilter(filter, deserializedEvent)) return;\n const ndkEvent = new NDKEvent2(void 0, deserializedEvent);\n const relay = relayUrl ? subscription.pool.getRelay(relayUrl, false) : void 0;\n ndkEvent.relay = relay;\n subscription.eventReceived(ndkEvent, relay, true);\n } catch (e) {\n console.error(\"failed to deserialize event\", e);\n }\n}\nfunction getIndexableTags(event) {\n const indexableTags = [];\n if (event.kind === 3) return [];\n for (const tag of event.tags) {\n if (tag[0].length !== 1) continue;\n indexableTags.push(tag);\n if (indexableTags.length >= INDEXABLE_TAGS_LIMIT) return [];\n }\n return indexableTags;\n}\nexport {\n db,\n NDKCacheAdapterDexie as default,\n foundEvent,\n foundEvents\n};\n"],"names":["crypto","sha256","_0n","_1n","isBytes_","num","bytesToHex_","abytes_","hexToBytes_","concatBytes_","_2n","_3n","_4n","d","window","wbits","abool","pointToBytes","abytes","endo","randomBytesWeb","getPublicKey","randomBytes","hmac","nobleHmac","r","s","sha256n","bech32","bytesToHex2","hexToBytes2","concatBytes","mod","challenge","EventEmitter","debug2","createDebug","nip192","LRUCache","EventEmitter2","EventEmitter3","debug3","nip194","nip196","debug6","EventEmitter5","EventEmitter6","createDebug3","createDebug4","createDebug5","this","e","t","n","i","o","global","a","u","h","c","l","f","x","k","p","y","v","m","b","g","w","_","O","NDKEvent2"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]}
|