ns-auth-sdk 1.14.0 → 1.14.2

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.
Files changed (153) hide show
  1. package/dist/{cjs-CSUAVztq.cjs → browser-index.cjs} +5476 -296
  2. package/dist/browser-index.cjs.map +1 -0
  3. package/dist/browser-index.d.cts +1998 -0
  4. package/dist/browser-index.d.cts.map +1 -0
  5. package/dist/browser-index.d.mts +1998 -0
  6. package/dist/browser-index.d.mts.map +1 -0
  7. package/dist/{cjs-sm5h7qxv.mjs → browser-index.mjs} +5169 -69
  8. package/dist/browser-index.mjs.map +1 -0
  9. package/dist/{group-coordination-BlFpBVpn.mjs → group-coordination-BV6PKlKp.mjs} +1 -1
  10. package/dist/{group-coordination-BlFpBVpn.mjs.map → group-coordination-BV6PKlKp.mjs.map} +1 -1
  11. package/dist/{group-coordination-ImuoJEoy.mjs → group-coordination-BytkmY9j.mjs} +1 -1
  12. package/dist/{group-coordination-LGIyipaX.cjs → group-coordination-DL39hJ3R.cjs} +1 -1
  13. package/dist/{group-coordination-LGIyipaX.cjs.map → group-coordination-DL39hJ3R.cjs.map} +1 -1
  14. package/dist/{group-coordination-Cf18OjZt.cjs → group-coordination-DLban6a7.cjs} +1 -1
  15. package/dist/index.cjs +8899 -41
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts.map +1 -1
  18. package/dist/index.mjs +9072 -213
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/{prf-handler-D3EqUNWe.cjs → prf-handler-BNd7gmXJ.cjs} +1 -1
  21. package/dist/{prf-handler-D3EqUNWe.cjs.map → prf-handler-BNd7gmXJ.cjs.map} +1 -1
  22. package/dist/prf-handler-CRMgzJG2.cjs +3 -0
  23. package/dist/{prf-handler-Dly_WZGn.mjs → prf-handler-DG99ZkS2.mjs} +1 -1
  24. package/dist/{prf-handler-Db8CsoIP.mjs → prf-handler-Dj2WTO9i.mjs} +1 -1
  25. package/dist/{prf-handler-Db8CsoIP.mjs.map → prf-handler-Dj2WTO9i.mjs.map} +1 -1
  26. package/dist/zkm.service-Bv88tVS5.mjs +3 -0
  27. package/dist/zkm.service-D2BZ_aqA.cjs +3 -0
  28. package/dist/{zkm.service-DfSPbuOl.cjs → zkm.service-DX06sSfB.cjs} +1 -1
  29. package/dist/{zkm.service-DfSPbuOl.cjs.map → zkm.service-DX06sSfB.cjs.map} +1 -1
  30. package/dist/{zkm.service-B24N_0FB.mjs → zkm.service-j0HlN7Oq.mjs} +1 -1
  31. package/dist/{zkm.service-B24N_0FB.mjs.map → zkm.service-j0HlN7Oq.mjs.map} +1 -1
  32. package/package.json +19 -6
  33. package/dist/_esm-C7FRLTj2.cjs +0 -9030
  34. package/dist/_esm-C7FRLTj2.cjs.map +0 -1
  35. package/dist/_esm-D_oMW5T5.mjs +0 -9028
  36. package/dist/_esm-D_oMW5T5.mjs.map +0 -1
  37. package/dist/base64-js-B8y7dH5k.mjs +0 -93
  38. package/dist/base64-js-B8y7dH5k.mjs.map +0 -1
  39. package/dist/base64-js-Tm-kCeud.cjs +0 -98
  40. package/dist/base64-js-Tm-kCeud.cjs.map +0 -1
  41. package/dist/ccip-157tdxqP.cjs +0 -7947
  42. package/dist/ccip-157tdxqP.cjs.map +0 -1
  43. package/dist/ccip-BEMMdVyd.cjs +0 -4
  44. package/dist/ccip-BSmCdJ3K.mjs +0 -3
  45. package/dist/ccip-okqXkslP.mjs +0 -6567
  46. package/dist/ccip-okqXkslP.mjs.map +0 -1
  47. package/dist/chains-CTeD2UcS.mjs +0 -33
  48. package/dist/chains-CTeD2UcS.mjs.map +0 -1
  49. package/dist/chains-Du-lv_5i.cjs +0 -33
  50. package/dist/chains-Du-lv_5i.cjs.map +0 -1
  51. package/dist/chunk-Bnu9O96Y.cjs +0 -60
  52. package/dist/chunk-CVYhg9ik.mjs +0 -45
  53. package/dist/cjs-CSUAVztq.cjs.map +0 -1
  54. package/dist/cjs-sm5h7qxv.mjs.map +0 -1
  55. package/dist/defineChain-7QG67hYU.cjs +0 -30
  56. package/dist/defineChain-7QG67hYU.cjs.map +0 -1
  57. package/dist/defineChain-DBem8ZQY.mjs +0 -24
  58. package/dist/defineChain-DBem8ZQY.mjs.map +0 -1
  59. package/dist/dist-BPmSxkxc.cjs +0 -10676
  60. package/dist/dist-BPmSxkxc.cjs.map +0 -1
  61. package/dist/dist-BSjH4t6s.cjs +0 -12932
  62. package/dist/dist-BSjH4t6s.cjs.map +0 -1
  63. package/dist/dist-C-KjTK4Q.cjs +0 -447
  64. package/dist/dist-C-KjTK4Q.cjs.map +0 -1
  65. package/dist/dist-C2h97xM-.mjs +0 -355
  66. package/dist/dist-C2h97xM-.mjs.map +0 -1
  67. package/dist/dist-CT7grDWb.mjs +0 -12920
  68. package/dist/dist-CT7grDWb.mjs.map +0 -1
  69. package/dist/dist-D7fRmK6G.mjs +0 -10632
  70. package/dist/dist-D7fRmK6G.mjs.map +0 -1
  71. package/dist/dist-DlmcyFmM.mjs +0 -16951
  72. package/dist/dist-DlmcyFmM.mjs.map +0 -1
  73. package/dist/dist-O0uZr5OF.cjs +0 -17122
  74. package/dist/dist-O0uZr5OF.cjs.map +0 -1
  75. package/dist/echo-BB-JgAYZ.cjs +0 -339
  76. package/dist/echo-BB-JgAYZ.cjs.map +0 -1
  77. package/dist/echo-Bwy4_Cvh.mjs +0 -316
  78. package/dist/echo-Bwy4_Cvh.mjs.map +0 -1
  79. package/dist/echo-D6X2IuNW.cjs +0 -9
  80. package/dist/echo-DvfG_heb.mjs +0 -8
  81. package/dist/esm-BcHKCX5i.mjs +0 -569
  82. package/dist/esm-BcHKCX5i.mjs.map +0 -1
  83. package/dist/esm-Bh_YwFIz.cjs +0 -599
  84. package/dist/esm-Bh_YwFIz.cjs.map +0 -1
  85. package/dist/esm-C0XO9TQm.cjs +0 -30449
  86. package/dist/esm-C0XO9TQm.cjs.map +0 -1
  87. package/dist/esm-vMUVj9k4.mjs +0 -30440
  88. package/dist/esm-vMUVj9k4.mjs.map +0 -1
  89. package/dist/keyset-CKMQXvsb.mjs +0 -172
  90. package/dist/keyset-CKMQXvsb.mjs.map +0 -1
  91. package/dist/keyset-Cxdgu110.cjs +0 -237
  92. package/dist/keyset-Cxdgu110.cjs.map +0 -1
  93. package/dist/keyset-DLxpGhdu.cjs +0 -6
  94. package/dist/keyset-IKjlhvqF.mjs +0 -4
  95. package/dist/node-3EUJ4ga9.cjs +0 -9
  96. package/dist/node-C2UpE11T.cjs +0 -444
  97. package/dist/node-C2UpE11T.cjs.map +0 -1
  98. package/dist/node-CHdpTQdN.mjs +0 -8679
  99. package/dist/node-CHdpTQdN.mjs.map +0 -1
  100. package/dist/node-DQt1CVGl.mjs +0 -6
  101. package/dist/node-Dy8ww1LG.cjs +0 -8680
  102. package/dist/node-Dy8ww1LG.cjs.map +0 -1
  103. package/dist/node-IX55IH6z.mjs +0 -397
  104. package/dist/node-IX55IH6z.mjs.map +0 -1
  105. package/dist/nostr-BTOpBN_5.cjs +0 -11
  106. package/dist/nostr-D4E52XRU.mjs +0 -224
  107. package/dist/nostr-D4E52XRU.mjs.map +0 -1
  108. package/dist/nostr-Hv2tsnuI.cjs +0 -272
  109. package/dist/nostr-Hv2tsnuI.cjs.map +0 -1
  110. package/dist/nostr-ZwJe_DlZ.mjs +0 -4
  111. package/dist/pako.esm-DTVnlCJh.cjs +0 -3856
  112. package/dist/pako.esm-DTVnlCJh.cjs.map +0 -1
  113. package/dist/pako.esm-ORhkEHM2.mjs +0 -3838
  114. package/dist/pako.esm-ORhkEHM2.mjs.map +0 -1
  115. package/dist/peer-B9g3OQ5D.cjs +0 -18
  116. package/dist/peer-CptDj7zu.mjs +0 -745
  117. package/dist/peer-CptDj7zu.mjs.map +0 -1
  118. package/dist/peer-CtqL0yiE.mjs +0 -9
  119. package/dist/peer-XrPL0O6z.cjs +0 -822
  120. package/dist/peer-XrPL0O6z.cjs.map +0 -1
  121. package/dist/ping-BXKREIdI.mjs +0 -7
  122. package/dist/ping-BtVhKocl.cjs +0 -379
  123. package/dist/ping-BtVhKocl.cjs.map +0 -1
  124. package/dist/ping-D5fpMhGC.cjs +0 -11
  125. package/dist/ping-DOD50kW_.mjs +0 -332
  126. package/dist/ping-DOD50kW_.mjs.map +0 -1
  127. package/dist/policy-8HcjulLD.cjs +0 -293
  128. package/dist/policy-8HcjulLD.cjs.map +0 -1
  129. package/dist/policy-BA6MEOBY.mjs +0 -5
  130. package/dist/policy-BFNdXvmM.cjs +0 -11
  131. package/dist/policy-D_nFHHjo.mjs +0 -228
  132. package/dist/policy-D_nFHHjo.mjs.map +0 -1
  133. package/dist/prf-handler-BNiyCQMt.cjs +0 -3
  134. package/dist/src-CVfTUJQl.mjs +0 -822
  135. package/dist/src-CVfTUJQl.mjs.map +0 -1
  136. package/dist/src-D5S86Xpf.cjs +0 -827
  137. package/dist/src-D5S86Xpf.cjs.map +0 -1
  138. package/dist/types-B-TLIS13.cjs +0 -212
  139. package/dist/types-B-TLIS13.cjs.map +0 -1
  140. package/dist/types-CTm_FHYD.mjs +0 -111
  141. package/dist/types-CTm_FHYD.mjs.map +0 -1
  142. package/dist/validation-1xwWVXqE.mjs +0 -3
  143. package/dist/validation-DnpurN79.cjs +0 -405
  144. package/dist/validation-DnpurN79.cjs.map +0 -1
  145. package/dist/validation-IsAUvsvy.mjs +0 -334
  146. package/dist/validation-IsAUvsvy.mjs.map +0 -1
  147. package/dist/validation-yCvZCqIs.cjs +0 -6
  148. package/dist/wrapper-C5NpyacC.cjs +0 -3552
  149. package/dist/wrapper-C5NpyacC.cjs.map +0 -1
  150. package/dist/wrapper-CHq_CV4J.mjs +0 -3552
  151. package/dist/wrapper-CHq_CV4J.mjs.map +0 -1
  152. package/dist/zkm.service-BrXyI4BS.mjs +0 -3
  153. package/dist/zkm.service-BvQ01wSH.cjs +0 -3
@@ -1 +0,0 @@
1
- {"version":3,"file":"dist-BSjH4t6s.cjs","names":["decode","decoder","enc","base64","enc","decode","toTbs","defaultCapabilities","defaultCapabilities","generateKeyPackage","toLeafIndex","nodeToLeafIndex","nodeWidth","leafWidth","nodeIndex","nodeToLeafIndex","toLeafIndex","leafWidth","nodeToLeafIndex","enc","resolution","level","s","leafWidth","toLeafIndex","consumed","toLeafIndex","nodeToLeafIndex","toLeafIndex","treeHash","proposals","zeroes","createGroup","decoder","toLeafIndex","toLeafIndex","toLeafIndex","resolution","result","toLeafIndex","nodeToLeafIndex","dntShim.dntGlobalThis","base64","enc","enc","__classPrivateFieldGet","__classPrivateFieldSet","__classPrivateFieldGet","__classPrivateFieldSet","enc","enc","chacha20poly1305","mlsDefaultCapabilities","padding","alphabet","encode","decode","EventMemory","kinds","PRESERVE_EVENT_SYMBOLS","kinds","nip44","EncryptedContentSymbol","getTagValue","unixNow","isHexKey","unixNow","decode","logger","decode","MLSCreateGroup","MLSGenerateKeyPackage","sha256","secp256k1","decode","decode","unixNow","unixNow","decode","getTagValue","alphabet","padding","sha256","encode","decode","_words","log","logger","sha256","EventEmitter","#state","#groupData","logger","#sentEventIds","unixNow","log","#decryptingMedia","log","logger","EventEmitter","#groups","#getCiphersuiteImpl","#getSerializedState","#clearGroupInstance","#groupListeners","#loadGroup","#hydrateState","#groupLoadPromises","#setGroupInstance","hex","kinds","EventEmitter","logger","#log","EventEmitter","logger","#log","#getCiphersuiteImpl","#buildSnapshot","logger"],"sources":["../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/codec/number.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/mlsError.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/codec/tlsDecoder.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/codec/tlsEncoder.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/util/byteArray.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/codec/variableLength.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/defaultExtensionType.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/defaultCredentialType.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/credential.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/externalSender.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/requiredCapabilities.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/util/constantTimeCompare.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/extension.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/hash.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/signature.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/protocolVersion.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/capabilities.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/leafNodeSource.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/lifetime.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/leafNode.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/ciphersuite.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/grease.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/defaultCapabilities.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/keyPackage.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/kdf.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/util/enumHelpers.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/presharedkey.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/defaultProposalType.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/proposal.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/codec/optional.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/proposalOrRefType.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/hpke.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/groupContext.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/nodeType.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/parentNode.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/treemath.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/ratchetTree.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/treeHash.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/parentHash.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/hpkeCiphertext.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/updatePath.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/commit.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/contentType.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/wireformat.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/sender.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/framedContent.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/authenticatedContent.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/groupInfo.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/keySchedule.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/secretTree.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/transcriptHash.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/pathSecrets.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/privateKeyPath.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/unappliedProposals.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/pskIndex.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/util/addToMap.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/groupSecrets.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/welcome.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/keyPackageEqualityConfig.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/keyRetentionConfig.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/lifetimeConfig.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/paddingConfig.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/clientConfig.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/util/array.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/codec/string.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/groupActiveState.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/epochReceiverData.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/clientState.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/privateMessage.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/messageProtection.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/publicMessage.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/messageProtectionPublic.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/createCommit.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/createMessage.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/incomingMessageAction.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/processMessages.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/implementation/default/makeHashImpl.js","../node_modules/@hpke/common/esm/src/errors.js","../node_modules/@hpke/common/esm/_dnt.shims.js","../node_modules/@hpke/common/esm/src/algorithm.js","../node_modules/@hpke/common/esm/src/identifiers.js","../node_modules/@hpke/common/esm/src/consts.js","../node_modules/@hpke/common/esm/src/interfaces/kemInterface.js","../node_modules/@hpke/common/esm/src/kdfs/hkdf.js","../node_modules/@hpke/common/esm/src/utils/misc.js","../node_modules/@hpke/common/esm/src/kems/dhkem.js","../node_modules/@hpke/common/esm/src/interfaces/dhkemPrimitives.js","../node_modules/@hpke/common/esm/src/utils/bignum.js","../node_modules/@hpke/common/esm/src/kems/dhkemPrimitives/ec.js","../node_modules/@hpke/common/esm/src/interfaces/aeadEncryptionContext.js","../node_modules/@hpke/core/esm/src/aeads/aesGcm.js","../node_modules/@hpke/core/esm/src/utils/emitNotSupported.js","../node_modules/@hpke/core/esm/src/exporterContext.js","../node_modules/@hpke/core/esm/src/encryptionContext.js","../node_modules/@hpke/core/esm/src/mutex.js","../node_modules/@hpke/core/esm/src/recipientContext.js","../node_modules/@hpke/core/esm/src/senderContext.js","../node_modules/@hpke/core/esm/src/cipherSuiteNative.js","../node_modules/@hpke/core/esm/src/kems/dhkemNative.js","../node_modules/@hpke/core/esm/src/native.js","../node_modules/@hpke/core/esm/src/kems/dhkemPrimitives/x25519.js","../node_modules/@hpke/core/esm/src/kems/dhkemX25519.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/implementation/hpke.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/implementation/default/makeAead.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/implementation/default/makeKdfImpl.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/implementation/default/makeDhKem.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/implementation/default/makeHpke.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/implementation/default/rng.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/implementation/default/makeNobleSignatureImpl.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/crypto/implementation/default/provider.js","../node_modules/@internet-privacy/marmot-ts/node_modules/ts-mls/dist/src/message.js","../node_modules/@internet-privacy/marmot-ts/dist/core/auth-service.js","../node_modules/@internet-privacy/marmot-ts/dist/core/protocol.js","../node_modules/@internet-privacy/marmot-ts/dist/core/capabilities.js","../node_modules/@internet-privacy/marmot-ts/dist/core/grease.js","../node_modules/@internet-privacy/marmot-ts/dist/core/default-capabilities.js","../node_modules/@internet-privacy/marmot-ts/dist/core/nostr.js","../node_modules/@internet-privacy/marmot-ts/node_modules/@scure/base/index.js","../node_modules/@internet-privacy/marmot-ts/dist/utils/encoding.js","../node_modules/applesauce-common/dist/helpers/gift-wrap.js","../node_modules/applesauce-common/dist/operations/gift-wrap.js","../node_modules/applesauce-common/dist/blueprints/gift-wrap.js","../node_modules/@internet-privacy/marmot-ts/dist/utils/nostr.js","../node_modules/@internet-privacy/marmot-ts/dist/utils/relay-url.js","../node_modules/@internet-privacy/marmot-ts/dist/core/marmot-group-data.js","../node_modules/@internet-privacy/marmot-ts/dist/core/welcome.js","../node_modules/@internet-privacy/marmot-ts/dist/utils/debug.js","../node_modules/eventemitter3/index.js","../node_modules/eventemitter3/index.mjs","../node_modules/@internet-privacy/marmot-ts/dist/core/client-state.js","../node_modules/@internet-privacy/marmot-ts/dist/core/credential.js","../node_modules/@internet-privacy/marmot-ts/dist/core/group.js","../node_modules/@internet-privacy/marmot-ts/dist/utils/timestamp.js","../node_modules/@internet-privacy/marmot-ts/dist/core/extensions.js","../node_modules/@internet-privacy/marmot-ts/dist/core/key-package.js","../node_modules/@internet-privacy/marmot-ts/dist/utils/nip44-binary.js","../node_modules/@internet-privacy/marmot-ts/dist/core/group-message-legacy.js","../node_modules/@internet-privacy/marmot-ts/dist/core/message.js","../node_modules/@internet-privacy/marmot-ts/dist/core/group-message.js","../node_modules/@internet-privacy/marmot-ts/dist/core/key-package-event.js","../node_modules/light-bolt11-decoder/node_modules/@scure/base/lib/index.js","../node_modules/light-bolt11-decoder/bolt11.js","../node_modules/applesauce-common/dist/helpers/bolt11.js","../node_modules/applesauce-common/dist/helpers/bookmark.js","../node_modules/applesauce-common/dist/helpers/calendar-event.js","../node_modules/applesauce-common/dist/helpers/channels.js","../node_modules/applesauce-common/dist/helpers/comment.js","../node_modules/applesauce-common/dist/helpers/encrypted-content-cache.js","../node_modules/applesauce-common/dist/helpers/file-metadata.js","../node_modules/applesauce-common/dist/helpers/groups.js","../node_modules/applesauce-common/dist/helpers/highlight.js","../node_modules/applesauce-common/dist/helpers/lnurl.js","../node_modules/applesauce-common/dist/helpers/threading.js","../node_modules/applesauce-common/dist/helpers/mute.js","../node_modules/applesauce-common/dist/helpers/poll.js","../node_modules/applesauce-common/dist/helpers/reports.js","../node_modules/applesauce-common/dist/helpers/share.js","../node_modules/applesauce-common/dist/helpers/stream.js","../node_modules/applesauce-common/dist/helpers/torrent.js","../node_modules/applesauce-common/dist/helpers/user-status.js","../node_modules/applesauce-common/dist/helpers/zap.js","../node_modules/applesauce-common/dist/helpers/zap-goal.js","../node_modules/@internet-privacy/marmot-ts/dist/core/media.js","../node_modules/@internet-privacy/marmot-ts/dist/client/group/proposals/invite-user.js","../node_modules/@internet-privacy/marmot-ts/dist/core/group-members.js","../node_modules/@internet-privacy/marmot-ts/dist/client/group/proposals/leave-group.js","../node_modules/@internet-privacy/marmot-ts/dist/client/group/marmot-group.js","../node_modules/@internet-privacy/marmot-ts/dist/client/groups-manager.js","../node_modules/@internet-privacy/marmot-ts/dist/client/invite-manager.js","../node_modules/@internet-privacy/marmot-ts/dist/client/key-package-manager.js","../node_modules/@internet-privacy/marmot-ts/dist/extra/in-memory-key-value-store.js","../node_modules/@internet-privacy/marmot-ts/dist/client/marmot-client.js","../node_modules/@internet-privacy/marmot-ts/dist/core/group-image.js"],"sourcesContent":["export const uint8Encoder = (n) => [\n 1,\n (offset, buffer) => {\n const view = new DataView(buffer);\n view.setUint8(offset, n);\n },\n];\nexport const uint8Decoder = (b, offset) => {\n const value = b.at(offset);\n return value !== undefined ? [value, 1] : undefined;\n};\nexport const uint16Encoder = (n) => [\n 2,\n (offset, buffer) => {\n const view = new DataView(buffer);\n view.setUint16(offset, n);\n },\n];\nexport const uint16Decoder = (b, offset) => {\n const view = new DataView(b.buffer, b.byteOffset, b.byteLength);\n try {\n return [view.getUint16(offset), 2];\n }\n catch (e) {\n return undefined;\n }\n};\nexport const uint32Encoder = (n) => [\n 4,\n (offset, buffer) => {\n const view = new DataView(buffer);\n view.setUint32(offset, n);\n },\n];\nexport const uint32Decoder = (b, offset) => {\n const view = new DataView(b.buffer, b.byteOffset, b.byteLength);\n try {\n return [view.getUint32(offset), 4];\n }\n catch (e) {\n return undefined;\n }\n};\nexport const uint64Encoder = (n) => [\n 8,\n (offset, buffer) => {\n const view = new DataView(buffer);\n view.setBigUint64(offset, n);\n },\n];\nexport const uint64Decoder = (b, offset) => {\n const view = new DataView(b.buffer, b.byteOffset, b.byteLength);\n try {\n return [view.getBigUint64(offset), 8];\n }\n catch (e) {\n return undefined;\n }\n};\n//# sourceMappingURL=number.js.map","/** @public */\nexport class MlsError extends Error {\n constructor(message) {\n super(message);\n this.name = \"MlsError\";\n }\n}\n/** @public */\nexport class ValidationError extends MlsError {\n constructor(message) {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n/** @public */\nexport class CodecError extends MlsError {\n constructor(message) {\n super(message);\n this.name = \"CodecError\";\n }\n}\n/** @public */\nexport class UsageError extends MlsError {\n constructor(message) {\n super(message);\n this.name = \"UsageError\";\n }\n}\n/** @public */\nexport class DependencyError extends MlsError {\n constructor(message) {\n super(message);\n this.name = \"DependencyError\";\n }\n}\n/** @public */\nexport class CryptoVerificationError extends MlsError {\n constructor(message) {\n super(message);\n this.name = \"CryptoVerificationError\";\n }\n}\n/** @public */\nexport class CryptoError extends MlsError {\n constructor(message) {\n super(message);\n this.name = \"CryptoError\";\n }\n}\n/** @public */\nexport class InternalError extends MlsError {\n constructor(message) {\n super(`This error should never occur, if you see this please submit a bug report. Message: ${message}`);\n this.name = \"InternalError\";\n }\n}\n//# sourceMappingURL=mlsError.js.map","import { CodecError } from \"../mlsError.js\";\n/** @public */\nexport function decode(dec, t, maxInputSize = 64000000) {\n if (t.length > maxInputSize)\n throw new CodecError(\"Payload larger than max allowed size, increase maxInputSize if you want to decode this\");\n return dec(t, 0)?.[0];\n}\nexport function mapDecoder(dec, f) {\n return (b, offset) => {\n const x = dec(b, offset);\n if (x !== undefined) {\n const [t, l] = x;\n return [f(t), l];\n }\n };\n}\nexport function mapDecodersOption(rsDecoder, f) {\n return (b, offset) => {\n const initial = mapDecoders(rsDecoder, f)(b, offset);\n if (initial === undefined)\n return undefined;\n else {\n const [r, len] = initial;\n return r !== undefined ? [r, len] : undefined;\n }\n };\n}\nexport function mapDecoders(rsDecoder, f) {\n return (b, offset) => {\n const result = rsDecoder.reduce((acc, decoder) => {\n if (!acc)\n return undefined;\n const decoded = decoder(b, acc.offset);\n if (!decoded)\n return undefined;\n const [value, length] = decoded;\n return {\n values: [...acc.values, value],\n offset: acc.offset + length,\n totalLength: acc.totalLength + length,\n };\n }, { values: [], offset, totalLength: 0 });\n if (!result)\n return;\n return [f(...result.values), result.totalLength];\n };\n}\nexport function mapDecoderOption(dec, f) {\n return (b, offset) => {\n const x = dec(b, offset);\n if (x !== undefined) {\n const [t, l] = x;\n const u = f(t);\n return u !== undefined ? [u, l] : undefined;\n }\n };\n}\nexport function flatMapDecoder(dec, f) {\n return flatMapDecoderAndMap(dec, f, (_t, u) => u);\n}\nexport function orDecoder(decT, decU) {\n return (b, offset) => {\n const t = decT(b, offset);\n return t ? t : decU(b, offset);\n };\n}\nfunction flatMapDecoderAndMap(dec, f, g) {\n return (b, offset) => {\n const decodedT = dec(b, offset);\n if (decodedT !== undefined) {\n const [t, len] = decodedT;\n const rUDecoder = f(t);\n const decodedU = rUDecoder(b, offset + len);\n if (decodedU !== undefined) {\n const [u, len2] = decodedU;\n return [g(t, u), len + len2];\n }\n }\n };\n}\nexport function succeedDecoder(t) {\n return () => [t, 0];\n}\nexport function failDecoder() {\n return () => undefined;\n}\n//# sourceMappingURL=tlsDecoder.js.map","/** @public */\nexport function encode(enc, t) {\n const [len, write] = enc(t);\n const buf = new ArrayBuffer(len);\n write(0, buf);\n return new Uint8Array(buf);\n}\nexport function contramapBufferEncoder(enc, f) {\n return (u) => enc(f(u));\n}\nexport function contramapBufferEncoders(encoders, toTuple) {\n return (value) => {\n const values = toTuple(value);\n const lengths = new Array(encoders.length);\n const writes = new Array(encoders.length);\n let totalLength = 0;\n for (let i = 0; i < encoders.length; i++) {\n const [len, write] = encoders[i](values[i]);\n lengths[i] = len;\n writes[i] = write;\n totalLength += len;\n }\n return [\n totalLength,\n (offset, buffer) => {\n let cursor = offset;\n for (let i = 0; i < writes.length; i++) {\n writes[i](cursor, buffer);\n cursor += lengths[i];\n }\n },\n ];\n };\n}\nexport function composeBufferEncoders(encoders) {\n return (values) => contramapBufferEncoders(encoders, (t) => t)(values);\n}\nexport const encVoid = [0, () => { }];\n//# sourceMappingURL=tlsEncoder.js.map","/** @public */\nexport function bytesToArrayBuffer(b) {\n if (b.buffer instanceof ArrayBuffer) {\n if (b.byteOffset === 0 && b.byteLength === b.buffer.byteLength) {\n return b.buffer;\n }\n return b.buffer.slice(b.byteOffset, b.byteOffset + b.byteLength);\n }\n else {\n const ab = new ArrayBuffer(b.byteLength);\n const arr = new Uint8Array(ab);\n arr.set(b, 0);\n return ab;\n }\n}\n/** @public */\nexport function toBufferSource(b) {\n if (b.buffer instanceof ArrayBuffer)\n return b;\n const ab = new ArrayBuffer(b.byteLength);\n const arr = new Uint8Array(ab);\n arr.set(b, 0);\n return ab;\n}\n/** @public */\nexport function bytesToBase64(bytes) {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\");\n }\n else {\n let binary = \"\";\n bytes.forEach((b) => (binary += String.fromCharCode(b)));\n return globalThis.btoa(binary);\n }\n}\n/** @public */\nexport function base64ToBytes(base64) {\n if (typeof Buffer !== \"undefined\") {\n return Uint8Array.from(Buffer.from(base64, \"base64\"));\n }\n else {\n const binary = globalThis.atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n}\nexport function concatUint8Arrays(a, b) {\n const result = new Uint8Array(a.length + b.length);\n result.set(a, 0);\n result.set(b, a.length);\n return result;\n}\n/** @public */\nexport function zeroOutUint8Array(buf) {\n crypto.getRandomValues(buf);\n for (let i = 0; i < buf.length; i++) {\n buf[i] ^= buf[i];\n }\n}\nexport function fastEqual(a, b) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n}\n//# sourceMappingURL=byteArray.js.map","import { CodecError } from \"../mlsError.js\";\nimport { base64ToBytes, bytesToBase64 } from \"../util/byteArray.js\";\nimport { uint64Decoder, uint64Encoder } from \"./number.js\";\nimport { mapDecoder, mapDecoders } from \"./tlsDecoder.js\";\nimport { contramapBufferEncoder, contramapBufferEncoders } from \"./tlsEncoder.js\";\nexport const varLenDataEncoder = (data) => {\n const [len, write] = lengthEncoder(data.length);\n return [\n len + data.length,\n (offset, buffer) => {\n write(offset, buffer);\n const view = new Uint8Array(buffer);\n view.set(data, offset + len);\n },\n ];\n};\nexport function lengthEncoder(len) {\n if (len < 64) {\n return [\n 1,\n (offset, buffer) => {\n // 1-byte length: 00xxxxxx\n const view = new Uint8Array(buffer);\n view[offset] = len & 0b00111111;\n },\n ];\n }\n else if (len < 16384) {\n return [\n 2,\n (offset, buffer) => {\n // 2-byte length: 01xxxxxx xxxxxxxx\n const view = new Uint8Array(buffer);\n view[offset] = ((len >> 8) & 0b00111111) | 0b01000000;\n view[offset + 1] = len & 0xff;\n },\n ];\n }\n else if (len < 0x40000000) {\n return [\n 4,\n (offset, buffer) => {\n // 4-byte length: 10xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n const view = new Uint8Array(buffer);\n view[offset] = ((len >> 24) & 0b00111111) | 0b10000000;\n view[offset + 1] = (len >> 16) & 0xff;\n view[offset + 2] = (len >> 8) & 0xff;\n view[offset + 3] = len & 0xff;\n },\n ];\n }\n else {\n throw new CodecError(\"Length too large to encode (max is 2^30 - 1)\");\n }\n}\nexport function determineLength(data, offset = 0) {\n if (offset >= data.length) {\n throw new CodecError(\"Offset beyond buffer\");\n }\n const firstByte = data[offset];\n const prefix = firstByte >> 6;\n if (prefix === 0) {\n return { length: firstByte & 0b00111111, lengthFieldSize: 1 };\n }\n else if (prefix === 1) {\n if (offset + 2 > data.length)\n throw new CodecError(\"Incomplete 2-byte length\");\n return { length: ((firstByte & 0b00111111) << 8) | data[offset + 1], lengthFieldSize: 2 };\n }\n else if (prefix === 2) {\n if (offset + 4 > data.length)\n throw new CodecError(\"Incomplete 4-byte length\");\n return {\n length: ((firstByte & 0b00111111) << 24) |\n (data[offset + 1] << 16) |\n (data[offset + 2] << 8) |\n data[offset + 3],\n lengthFieldSize: 4,\n };\n }\n else {\n throw new CodecError(\"8-byte length not supported in this implementation\");\n }\n}\nexport const varLenDataDecoder = (buf, offset) => {\n if (offset >= buf.length) {\n throw new CodecError(\"Offset beyond buffer\");\n }\n const { length, lengthFieldSize } = determineLength(buf, offset);\n const totalBytes = lengthFieldSize + length;\n if (offset + totalBytes > buf.length) {\n throw new CodecError(\"Data length exceeds buffer\");\n }\n //todo maybe use slice?\n const data = buf.subarray(offset + lengthFieldSize, offset + totalBytes);\n return [data, totalBytes];\n};\nexport function varLenTypeEncoder(enc, until) {\n return (data) => {\n const len = until ?? data.length;\n const lengths = new Array(len);\n const writes = new Array(len);\n let totalLength = 0;\n for (let i = 0; i < len; i++) {\n const [itemLength, write] = enc(data[i]);\n lengths[i] = itemLength;\n writes[i] = write;\n totalLength += itemLength;\n }\n const [headerLength, writeLength] = lengthEncoder(totalLength);\n return [\n headerLength + totalLength,\n (offset, buffer) => {\n writeLength(offset, buffer);\n let cursor = offset + headerLength;\n for (let i = 0; i < len; i++) {\n writes[i](cursor, buffer);\n cursor += lengths[i];\n }\n },\n ];\n };\n}\nexport function varLenTypeDecoder(dec) {\n return (b, offset) => {\n const d = varLenDataDecoder(b, offset);\n if (d === undefined)\n return;\n const [totalBytes, totalLength] = d;\n let cursor = 0;\n const result = [];\n while (cursor < totalBytes.length) {\n const item = dec(totalBytes, cursor);\n if (item === undefined)\n return undefined;\n const [value, len] = item;\n result.push(value);\n cursor += len;\n }\n return [result, totalLength];\n };\n}\nexport function base64RecordEncoder(valueEncoder) {\n const entryEncoder = contramapBufferEncoders([contramapBufferEncoder(varLenDataEncoder, base64ToBytes), valueEncoder], ([key, value]) => [key, value]);\n return contramapBufferEncoders([varLenTypeEncoder(entryEncoder)], (record) => [Object.entries(record)]);\n}\nexport function base64RecordDecoder(valueDecoder) {\n return mapDecoder(varLenTypeDecoder(mapDecoders([mapDecoder(varLenDataDecoder, bytesToBase64), valueDecoder], (key, value) => [key, value])), (entries) => {\n const record = {};\n for (const [key, value] of entries) {\n record[key] = value;\n }\n return record;\n });\n}\nexport function numberRecordEncoder(numberEncoder, valueEncoder) {\n const entryEncoder = contramapBufferEncoders([numberEncoder, valueEncoder], ([key, value]) => [key, value]);\n return contramapBufferEncoder(varLenTypeEncoder(entryEncoder), (record) => Object.entries(record).map(([key, value]) => [Number(key), value]));\n}\nexport function numberRecordDecoder(numberDecoder, valueDecoder) {\n return mapDecoder(varLenTypeDecoder(mapDecoders([numberDecoder, valueDecoder], (key, value) => [key, value])), (entries) => {\n const record = {};\n for (const [key, value] of entries) {\n record[key] = value;\n }\n return record;\n });\n}\nexport function bigintMapEncoder(valueEncoder) {\n const entryEncoder = contramapBufferEncoders([uint64Encoder, valueEncoder], ([key, value]) => [key, value]);\n return contramapBufferEncoder(varLenTypeEncoder(entryEncoder), (map) => Array.from(map.entries()));\n}\nexport function bigintMapDecoder(valueDecoder) {\n return mapDecoder(varLenTypeDecoder(mapDecoders([uint64Decoder, valueDecoder], (key, value) => [key, value])), (entries) => new Map(entries));\n}\n//# sourceMappingURL=variableLength.js.map","/** @public */\nexport const defaultExtensionTypes = {\n application_id: 1,\n ratchet_tree: 2,\n required_capabilities: 3,\n external_pub: 4,\n external_senders: 5,\n};\nexport function isDefaultExtensionTypeValue(v) {\n return Object.values(defaultExtensionTypes).includes(v);\n}\n//# sourceMappingURL=defaultExtensionType.js.map","/** @public */\nexport const defaultCredentialTypes = {\n basic: 1,\n x509: 2,\n};\nconst defaultCredentialTypeValues = new Set(Object.values(defaultCredentialTypes));\nexport function isDefaultCredentialTypeValue(v) {\n return defaultCredentialTypeValues.has(v);\n}\n//# sourceMappingURL=defaultCredentialType.js.map","import { uint16Decoder, uint16Encoder } from \"./codec/number.js\";\nimport { flatMapDecoder, mapDecoder } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenTypeDecoder, varLenDataEncoder, varLenTypeEncoder } from \"./codec/variableLength.js\";\nimport { defaultCredentialTypes, isDefaultCredentialTypeValue } from \"./defaultCredentialType.js\";\n/** @public */\nexport function isDefaultCredential(c) {\n return isDefaultCredentialTypeValue(c.credentialType);\n}\nconst credentialBasicEncoder = contramapBufferEncoders([uint16Encoder, varLenDataEncoder], (c) => [c.credentialType, c.identity]);\nconst credentialX509Encoder = contramapBufferEncoders([uint16Encoder, varLenTypeEncoder(varLenDataEncoder)], (c) => [c.credentialType, c.certificates]);\nconst credentialCustomEncoder = contramapBufferEncoders([uint16Encoder, varLenDataEncoder], (c) => [c.credentialType, c.data]);\nexport const credentialEncoder = (c) => {\n if (!isDefaultCredential(c))\n return credentialCustomEncoder(c);\n switch (c.credentialType) {\n case defaultCredentialTypes.basic:\n return credentialBasicEncoder(c);\n case defaultCredentialTypes.x509:\n return credentialX509Encoder(c);\n }\n};\nconst credentialBasicDecoder = mapDecoder(varLenDataDecoder, (identity) => ({\n credentialType: defaultCredentialTypes.basic,\n identity,\n}));\nconst credentialX509Decoder = mapDecoder(varLenTypeDecoder(varLenDataDecoder), (certificates) => ({ credentialType: defaultCredentialTypes.x509, certificates }));\nfunction credentialCustomDecoder(credentialType) {\n return mapDecoder(varLenDataDecoder, (data) => ({ credentialType, data }));\n}\nexport const credentialDecoder = flatMapDecoder(uint16Decoder, (credentialType) => {\n switch (credentialType) {\n case defaultCredentialTypes.basic:\n return credentialBasicDecoder;\n case defaultCredentialTypes.x509:\n return credentialX509Decoder;\n default:\n return credentialCustomDecoder(credentialType);\n }\n});\n//# sourceMappingURL=credential.js.map","import { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenDataEncoder } from \"./codec/variableLength.js\";\nimport { credentialDecoder, credentialEncoder } from \"./credential.js\";\nexport const externalSenderEncoder = contramapBufferEncoders([varLenDataEncoder, credentialEncoder], (e) => [e.signaturePublicKey, e.credential]);\nexport const externalSenderDecoder = mapDecoders([varLenDataDecoder, credentialDecoder], (signaturePublicKey, credential) => ({ signaturePublicKey, credential }));\n//# sourceMappingURL=externalSender.js.map","import { varLenTypeEncoder, varLenTypeDecoder } from \"./codec/variableLength.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { uint16Decoder, uint16Encoder } from \"./codec/number.js\";\nexport const requiredCapabilitiesEncoder = contramapBufferEncoders([varLenTypeEncoder(uint16Encoder), varLenTypeEncoder(uint16Encoder), varLenTypeEncoder(uint16Encoder)], (rc) => [rc.extensionTypes, rc.proposalTypes, rc.credentialTypes]);\nexport const requiredCapabilitiesDecoder = mapDecoders([varLenTypeDecoder(uint16Decoder), varLenTypeDecoder(uint16Decoder), varLenTypeDecoder(uint16Decoder)], (extensionTypes, proposalTypes, credentialTypes) => ({ extensionTypes, proposalTypes, credentialTypes }));\n//# sourceMappingURL=requiredCapabilities.js.map","export function constantTimeEqual(a, b) {\n if (a.length !== b.length)\n return false;\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a[i] ^ b[i];\n }\n return result === 0;\n}\n//# sourceMappingURL=constantTimeCompare.js.map","import { uint16Decoder, uint16Encoder } from \"./codec/number.js\";\nimport { decode, flatMapDecoder, mapDecoder, mapDecoderOption, mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenDataEncoder } from \"./codec/variableLength.js\";\nimport { defaultExtensionTypes, isDefaultExtensionTypeValue } from \"./defaultExtensionType.js\";\nimport { externalSenderDecoder, externalSenderEncoder } from \"./externalSender.js\";\nimport { UsageError } from \"./mlsError.js\";\nimport { requiredCapabilitiesDecoder, requiredCapabilitiesEncoder, } from \"./requiredCapabilities.js\";\nimport { constantTimeEqual } from \"./util/constantTimeCompare.js\";\n/** @public */\nexport function makeCustomExtension(extension) {\n if (isDefaultExtensionTypeValue(extension.extensionType)) {\n throw new UsageError(\"Cannot create custom exception with default extension type\");\n }\n return extension;\n}\n/** @public */\nexport function isDefaultExtension(e) {\n return isDefaultExtensionTypeValue(e.extensionType);\n}\nexport const extensionEncoder = contramapBufferEncoders([uint16Encoder, varLenDataEncoder], (e) => {\n if (isDefaultExtension(e)) {\n if (e.extensionType === defaultExtensionTypes.required_capabilities) {\n return [e.extensionType, encode(requiredCapabilitiesEncoder, e.extensionData)];\n }\n else if (e.extensionType === defaultExtensionTypes.external_senders) {\n return [e.extensionType, encode(externalSenderEncoder, e.extensionData)];\n }\n return [e.extensionType, e.extensionData];\n }\n else\n return [e.extensionType, e.extensionData];\n});\nexport const customExtensionDecoder = mapDecoders([uint16Decoder, varLenDataDecoder], (extensionType, extensionData) => ({ extensionType, extensionData }));\nexport const leafNodeExtensionDecoder = flatMapDecoder(uint16Decoder, (extensionType) => {\n if (extensionType === defaultExtensionTypes.application_id) {\n return mapDecoder(varLenDataDecoder, (extensionData) => {\n return { extensionType: defaultExtensionTypes.application_id, extensionData };\n });\n }\n else\n return mapDecoder(varLenDataDecoder, (extensionData) => ({ extensionType, extensionData }));\n});\nexport const groupInfoExtensionDecoder = flatMapDecoder(uint16Decoder, (extensionType) => {\n if (extensionType === defaultExtensionTypes.external_pub) {\n return mapDecoder(varLenDataDecoder, (extensionData) => {\n return { extensionType: defaultExtensionTypes.external_pub, extensionData };\n });\n }\n else if (extensionType === defaultExtensionTypes.ratchet_tree) {\n return mapDecoder(varLenDataDecoder, (extensionData) => {\n return { extensionType: defaultExtensionTypes.ratchet_tree, extensionData };\n });\n }\n else\n return mapDecoder(varLenDataDecoder, (extensionData) => ({ extensionType, extensionData }));\n});\nexport const groupContextExtensionDecoder = flatMapDecoder(uint16Decoder, (extensionType) => {\n if (extensionType === defaultExtensionTypes.external_senders) {\n return mapDecoderOption(varLenDataDecoder, (extensionData) => {\n const res = decode(externalSenderDecoder, extensionData);\n if (res)\n return { extensionType: defaultExtensionTypes.external_senders, extensionData: res };\n });\n }\n else if (extensionType === defaultExtensionTypes.required_capabilities) {\n return mapDecoderOption(varLenDataDecoder, (extensionData) => {\n const res = decode(requiredCapabilitiesDecoder, extensionData);\n if (res)\n return { extensionType: defaultExtensionTypes.required_capabilities, extensionData: res };\n });\n }\n else\n return mapDecoder(varLenDataDecoder, (extensionData) => ({ extensionType, extensionData }));\n});\nfunction extensionEqual(a, b) {\n if (a.extensionType !== b.extensionType)\n return false;\n if (isDefaultExtension(a)) {\n if (a.extensionType === defaultExtensionTypes.required_capabilities) {\n return a.extensionData === b.extensionData;\n }\n else if (a.extensionType === defaultExtensionTypes.external_senders &&\n b.extensionType === defaultExtensionTypes.external_senders) {\n return constantTimeEqual(encode(externalSenderEncoder, a.extensionData), encode(externalSenderEncoder, b.extensionData));\n }\n }\n //TypeScript isn't smart enough to figure out the extensionTypes are the same\n return constantTimeEqual(a.extensionData, b.extensionData);\n}\nexport function extensionsEqual(a, b) {\n if (a.length !== b.length)\n return false;\n return a.every((val, i) => extensionEqual(val, b[i]));\n}\nexport function extensionsSupportedByCapabilities(requiredExtensions, capabilities) {\n return requiredExtensions\n .filter((ex) => !isDefaultExtensionTypeValue(ex.extensionType))\n .every((ex) => capabilities.extensions.includes(ex.extensionType));\n}\n//# sourceMappingURL=extension.js.map","import { composeBufferEncoders, encode } from \"../codec/tlsEncoder.js\";\nimport { varLenDataEncoder } from \"../codec/variableLength.js\";\nexport function refhash(label, value, h) {\n return h.digest(encodeRefHash(label, value));\n}\nfunction encodeRefHash(label, value) {\n const labelBytes = new TextEncoder().encode(label);\n const enc = composeBufferEncoders([varLenDataEncoder, varLenDataEncoder]);\n return encode(enc, [labelBytes, value]);\n}\n//# sourceMappingURL=hash.js.map","import { composeBufferEncoders, encode } from \"../codec/tlsEncoder.js\";\nimport { varLenDataEncoder } from \"../codec/variableLength.js\";\nexport async function signWithLabel(signKey, label, content, s) {\n const messageEncoder = composeBufferEncoders([varLenDataEncoder, varLenDataEncoder]);\n return s.sign(signKey, encode(messageEncoder, [new TextEncoder().encode(`MLS 1.0 ${label}`), content]));\n}\nexport async function verifyWithLabel(publicKey, label, content, signature, s) {\n const messageEncoder = composeBufferEncoders([varLenDataEncoder, varLenDataEncoder]);\n return s.verify(publicKey, encode(messageEncoder, [new TextEncoder().encode(`MLS 1.0 ${label}`), content]), signature);\n}\n//# sourceMappingURL=signature.js.map","import { uint16Decoder, uint16Encoder } from \"./codec/number.js\";\nimport { mapDecoderOption } from \"./codec/tlsDecoder.js\";\n/** @public */\nexport const protocolVersions = {\n mls10: 1,\n};\nconst protocolVersionValues = new Set(Object.values(protocolVersions));\nexport const protocolVersionEncoder = uint16Encoder;\nexport const protocolVersionDecoder = mapDecoderOption(uint16Decoder, (v) => protocolVersionValues.has(v) ? v : undefined);\n//# sourceMappingURL=protocolVersion.js.map","import { protocolVersionDecoder, protocolVersionEncoder } from \"./protocolVersion.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { varLenTypeDecoder, varLenTypeEncoder } from \"./codec/variableLength.js\";\nimport { uint16Decoder, uint16Encoder } from \"./codec/number.js\";\nexport const capabilitiesEncoder = contramapBufferEncoders([\n varLenTypeEncoder(protocolVersionEncoder),\n varLenTypeEncoder(uint16Encoder),\n varLenTypeEncoder(uint16Encoder),\n varLenTypeEncoder(uint16Encoder),\n varLenTypeEncoder(uint16Encoder),\n], (cap) => [cap.versions, cap.ciphersuites, cap.extensions, cap.proposals, cap.credentials]);\nexport const capabilitiesDecoder = mapDecoders([\n varLenTypeDecoder(protocolVersionDecoder),\n varLenTypeDecoder(uint16Decoder),\n varLenTypeDecoder(uint16Decoder),\n varLenTypeDecoder(uint16Decoder),\n varLenTypeDecoder(uint16Decoder),\n], (versions, ciphersuites, extensions, proposals, credentials) => ({\n versions,\n ciphersuites,\n extensions,\n proposals,\n credentials,\n}));\n//# sourceMappingURL=capabilities.js.map","import { uint8Decoder, uint8Encoder } from \"./codec/number.js\";\nimport { mapDecoderOption } from \"./codec/tlsDecoder.js\";\n/** @public */\nexport const leafNodeSources = {\n key_package: 1,\n update: 2,\n commit: 3,\n};\nconst leafNodeSourceValues = new Set(Object.values(leafNodeSources));\nexport const leafNodeSourceValueEncoder = uint8Encoder;\nexport const leafNodeSourceValueDecoder = mapDecoderOption(uint8Decoder, (v) => leafNodeSourceValues.has(v) ? v : undefined);\n//# sourceMappingURL=leafNodeSource.js.map","import { uint64Encoder, uint64Decoder } from \"./codec/number.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nexport const lifetimeEncoder = contramapBufferEncoders([uint64Encoder, uint64Encoder], (lt) => [lt.notBefore, lt.notAfter]);\nexport const lifetimeDecoder = mapDecoders([uint64Decoder, uint64Decoder], (notBefore, notAfter) => ({\n notBefore,\n notAfter,\n}));\n/** @public */\nexport function defaultLifetime() {\n const now = Math.floor(Date.now() / 1000);\n return {\n notBefore: BigInt(now - 86400),\n notAfter: BigInt(now + 1314000), // Half month\n };\n}\n//# sourceMappingURL=lifetime.js.map","import { capabilitiesEncoder, capabilitiesDecoder } from \"./capabilities.js\";\nimport { uint32Encoder } from \"./codec/number.js\";\nimport { mapDecoders, flatMapDecoder, mapDecoderOption, mapDecoder } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { varLenDataEncoder, varLenDataDecoder, varLenTypeEncoder, varLenTypeDecoder } from \"./codec/variableLength.js\";\nimport { credentialEncoder, credentialDecoder } from \"./credential.js\";\nimport { signWithLabel, verifyWithLabel } from \"./crypto/signature.js\";\nimport { extensionEncoder, leafNodeExtensionDecoder } from \"./extension.js\";\nimport { leafNodeSources, leafNodeSourceValueDecoder, leafNodeSourceValueEncoder } from \"./leafNodeSource.js\";\nimport { lifetimeEncoder, lifetimeDecoder } from \"./lifetime.js\";\nimport { fastEqual } from \"./util/byteArray.js\";\nexport const leafNodeDataEncoder = contramapBufferEncoders([varLenDataEncoder, varLenDataEncoder, credentialEncoder, capabilitiesEncoder], (data) => [data.hpkePublicKey, data.signaturePublicKey, data.credential, data.capabilities]);\nexport const leafNodeDataDecoder = mapDecoders([varLenDataDecoder, varLenDataDecoder, credentialDecoder, capabilitiesDecoder], (hpkePublicKey, signaturePublicKey, credential, capabilities) => ({\n hpkePublicKey,\n signaturePublicKey,\n credential,\n capabilities,\n}));\nconst leafNodeInfoKeyPackageEncoder = contramapBufferEncoders([leafNodeSourceValueEncoder, lifetimeEncoder, varLenTypeEncoder(extensionEncoder)], (info) => [leafNodeSources.key_package, info.lifetime, info.extensions]);\nconst leafNodeInfoUpdateOmittedEncoder = contramapBufferEncoders([leafNodeSourceValueEncoder, varLenTypeEncoder(extensionEncoder)], (i) => [i.leafNodeSource, i.extensions]);\nconst leafNodeInfoCommitOmittedEncoder = contramapBufferEncoders([leafNodeSourceValueEncoder, varLenDataEncoder, varLenTypeEncoder(extensionEncoder)], (info) => [info.leafNodeSource, info.parentHash, info.extensions]);\nconst leafNodeInfoOmittedEncoder = (info) => {\n switch (info.leafNodeSource) {\n case leafNodeSources.key_package:\n return leafNodeInfoKeyPackageEncoder(info);\n case leafNodeSources.update:\n return leafNodeInfoUpdateOmittedEncoder(info);\n case leafNodeSources.commit:\n return leafNodeInfoCommitOmittedEncoder(info);\n }\n};\nconst leafNodeInfoKeyPackageDecoder = mapDecoders([lifetimeDecoder, varLenTypeDecoder(leafNodeExtensionDecoder)], (lifetime, extensions) => ({\n leafNodeSource: leafNodeSources.key_package,\n lifetime,\n extensions,\n}));\nconst leafNodeInfoUpdateOmittedDecoder = mapDecoder(varLenTypeDecoder(leafNodeExtensionDecoder), (extensions) => ({\n leafNodeSource: leafNodeSources.update,\n extensions,\n}));\nconst leafNodeInfoCommitOmittedDecoder = mapDecoders([varLenDataDecoder, varLenTypeDecoder(leafNodeExtensionDecoder)], (parentHash, extensions) => ({\n leafNodeSource: leafNodeSources.commit,\n parentHash,\n extensions,\n}));\nconst leafNodeInfoOmittedDecoder = flatMapDecoder(leafNodeSourceValueDecoder, (leafNodeSource) => {\n switch (leafNodeSource) {\n case leafNodeSources.key_package:\n return leafNodeInfoKeyPackageDecoder;\n case leafNodeSources.update:\n return leafNodeInfoUpdateOmittedDecoder;\n case leafNodeSources.commit:\n return leafNodeInfoCommitOmittedDecoder;\n }\n});\nconst leafNodeInfoUpdateEncoder = contramapBufferEncoders([leafNodeInfoUpdateOmittedEncoder, varLenDataEncoder, uint32Encoder], (i) => [i, i.groupId, i.leafIndex]);\nconst leafNodeInfoCommitEncoder = contramapBufferEncoders([leafNodeInfoCommitOmittedEncoder, varLenDataEncoder, uint32Encoder], (info) => [info, info.groupId, info.leafIndex]);\nconst leafNodeInfoEncoder = (info) => {\n switch (info.leafNodeSource) {\n case leafNodeSources.key_package:\n return leafNodeInfoKeyPackageEncoder(info);\n case leafNodeSources.update:\n return leafNodeInfoUpdateEncoder(info);\n case leafNodeSources.commit:\n return leafNodeInfoCommitEncoder(info);\n }\n};\nconst leafNodeTBSEncoder = contramapBufferEncoders([leafNodeDataEncoder, leafNodeInfoEncoder], (tbs) => [tbs, tbs]);\nexport const leafNodeEncoder = contramapBufferEncoders([leafNodeDataEncoder, leafNodeInfoOmittedEncoder, varLenDataEncoder], (leafNode) => [leafNode, leafNode, leafNode.signature]);\nexport const leafNodeDecoder = mapDecoders([leafNodeDataDecoder, leafNodeInfoOmittedDecoder, varLenDataDecoder], (data, info, signature) => ({\n ...data,\n ...info,\n signature,\n}));\nexport const leafNodeKeyPackageDecoder = mapDecoderOption(leafNodeDecoder, (ln) => ln.leafNodeSource === leafNodeSources.key_package ? ln : undefined);\nexport const leafNodeCommitDecoder = mapDecoderOption(leafNodeDecoder, (ln) => ln.leafNodeSource === leafNodeSources.commit ? ln : undefined);\nexport const leafNodeUpdateDecoder = mapDecoderOption(leafNodeDecoder, (ln) => ln.leafNodeSource === leafNodeSources.update ? ln : undefined);\nfunction toTbs(leafNode, groupId, leafIndex) {\n switch (leafNode.leafNodeSource) {\n case leafNodeSources.key_package:\n return { ...leafNode, leafNodeSource: leafNode.leafNodeSource };\n case leafNodeSources.update:\n return { ...leafNode, leafNodeSource: leafNode.leafNodeSource, groupId, leafIndex };\n case leafNodeSources.commit:\n return { ...leafNode, leafNodeSource: leafNode.leafNodeSource, groupId, leafIndex };\n }\n}\nexport async function signLeafNodeCommit(tbs, signaturePrivateKey, sig) {\n return {\n ...tbs,\n signature: await signWithLabel(signaturePrivateKey, \"LeafNodeTBS\", encode(leafNodeTBSEncoder, tbs), sig),\n };\n}\nexport async function signLeafNodeKeyPackage(tbs, signaturePrivateKey, sig) {\n return {\n ...tbs,\n signature: await signWithLabel(signaturePrivateKey, \"LeafNodeTBS\", encode(leafNodeTBSEncoder, tbs), sig),\n };\n}\nexport function verifyLeafNodeSignature(leaf, groupId, leafIndex, sig) {\n return verifyWithLabel(leaf.signaturePublicKey, \"LeafNodeTBS\", encode(leafNodeTBSEncoder, toTbs(leaf, groupId, leafIndex)), leaf.signature, sig);\n}\nexport function verifyLeafNodeSignatureKeyPackage(leaf, sig) {\n return verifyWithLabel(leaf.signaturePublicKey, \"LeafNodeTBS\", encode(leafNodeTBSEncoder, leaf), leaf.signature, sig);\n}\nexport function leafNodeEqual(a, b) {\n return fastEqual(a.signaturePublicKey, b.signaturePublicKey);\n}\n//# sourceMappingURL=leafNode.js.map","/** @public */\nexport const ciphersuites = {\n MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519: 1,\n MLS_128_DHKEMP256_AES128GCM_SHA256_P256: 2,\n MLS_128_DHKEMX25519_CHACHA20POLY1305_SHA256_Ed25519: 3,\n MLS_256_DHKEMX448_AES256GCM_SHA512_Ed448: 4,\n MLS_256_DHKEMP521_AES256GCM_SHA512_P521: 5,\n MLS_256_DHKEMX448_CHACHA20POLY1305_SHA512_Ed448: 6,\n MLS_256_DHKEMP384_AES256GCM_SHA384_P384: 7,\n MLS_128_MLKEM512_AES128GCM_SHA256_Ed25519: 0xf007,\n MLS_128_MLKEM512_CHACHA20POLY1305_SHA256_Ed25519: 0xf008,\n MLS_256_MLKEM768_AES256GCM_SHA384_Ed25519: 0xf009,\n MLS_256_MLKEM768_CHACHA20POLY1305_SHA384_Ed25519: 0xf00a,\n MLS_256_MLKEM1024_AES256GCM_SHA512_Ed25519: 0xf00b,\n MLS_256_MLKEM1024_CHACHA20POLY1305_SHA512_Ed25519: 0xf00c,\n MLS_256_XWING_AES256GCM_SHA512_Ed25519: 0xf00d,\n MLS_256_XWING_CHACHA20POLY1305_SHA512_Ed25519: 0xf00e,\n MLS_256_MLKEM1024_AES256GCM_SHA512_MLDSA87: 0xf00f,\n MLS_256_MLKEM1024_CHACHA20POLY1305_SHA512_MLDSA87: 0xf010,\n MLS_256_XWING_AES256GCM_SHA512_MLDSA87: 0xf011,\n MLS_256_XWING_CHACHA20POLY1305_SHA512_MLDSA87: 0xf012,\n};\nexport function isDefaultCiphersuiteId(id) {\n return ciphersuiteValues[id] ? true : false;\n}\n/** @public */\nexport function getCiphersuiteFromName(name) {\n return ciphersuiteValues[ciphersuites[name]];\n}\nexport const ciphersuiteValues = {\n 1: {\n hash: \"SHA-256\",\n hpke: {\n kem: \"DHKEM-X25519-HKDF-SHA256\",\n aead: \"AES128GCM\",\n kdf: \"HKDF-SHA256\",\n },\n signature: \"Ed25519\",\n id: 1,\n },\n 2: {\n hash: \"SHA-256\",\n hpke: {\n kem: \"DHKEM-P256-HKDF-SHA256\",\n aead: \"AES128GCM\",\n kdf: \"HKDF-SHA256\",\n },\n signature: \"P256\",\n id: 2,\n },\n 3: {\n hash: \"SHA-256\",\n hpke: {\n kem: \"DHKEM-X25519-HKDF-SHA256\",\n aead: \"CHACHA20POLY1305\",\n kdf: \"HKDF-SHA256\",\n },\n signature: \"Ed25519\",\n id: 3,\n },\n 4: {\n hash: \"SHA-512\",\n hpke: {\n kem: \"DHKEM-X448-HKDF-SHA512\",\n aead: \"AES256GCM\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"Ed448\",\n id: 4,\n },\n 5: {\n hash: \"SHA-512\",\n hpke: {\n kem: \"DHKEM-P521-HKDF-SHA512\",\n aead: \"AES256GCM\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"P521\",\n id: 5,\n },\n 6: {\n hash: \"SHA-512\",\n hpke: {\n kem: \"DHKEM-X448-HKDF-SHA512\",\n aead: \"CHACHA20POLY1305\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"Ed448\",\n id: 6,\n },\n 7: {\n hash: \"SHA-384\",\n hpke: {\n kem: \"DHKEM-P384-HKDF-SHA384\",\n aead: \"AES256GCM\",\n kdf: \"HKDF-SHA384\",\n },\n signature: \"P384\",\n id: 7,\n },\n 0xf007: {\n hash: \"SHA-256\",\n hpke: {\n kem: \"ML-KEM-512\",\n aead: \"AES256GCM\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"Ed25519\",\n id: 0xf007,\n },\n 0xf008: {\n hash: \"SHA-256\",\n hpke: {\n kem: \"ML-KEM-512\",\n aead: \"CHACHA20POLY1305\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"Ed25519\",\n id: 0xf008,\n },\n 0xf009: {\n hash: \"SHA-384\",\n hpke: {\n kem: \"ML-KEM-768\",\n aead: \"AES256GCM\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"Ed25519\",\n id: 0xf009,\n },\n 0xf00a: {\n hash: \"SHA-384\",\n hpke: {\n kem: \"ML-KEM-768\",\n aead: \"CHACHA20POLY1305\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"Ed25519\",\n id: 0xf00a,\n },\n 0xf00b: {\n hash: \"SHA-512\",\n hpke: {\n kem: \"ML-KEM-1024\",\n aead: \"AES256GCM\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"Ed25519\",\n id: 0xf00b,\n },\n 0xf00c: {\n hash: \"SHA-512\",\n hpke: {\n kem: \"ML-KEM-1024\",\n aead: \"CHACHA20POLY1305\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"Ed25519\",\n id: 0xf00c,\n },\n 0xf00d: {\n hash: \"SHA-512\",\n hpke: {\n kem: \"X-Wing\",\n aead: \"AES256GCM\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"Ed25519\",\n id: 0xf00d,\n },\n 0xf00e: {\n hash: \"SHA-512\",\n hpke: {\n kem: \"X-Wing\",\n aead: \"CHACHA20POLY1305\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"Ed25519\",\n id: 0xf00e,\n },\n 0xf00f: {\n hash: \"SHA-512\",\n hpke: {\n kem: \"ML-KEM-1024\",\n aead: \"AES256GCM\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"ML-DSA-87\",\n id: 0xf00f,\n },\n 0xf010: {\n hash: \"SHA-512\",\n hpke: {\n kem: \"ML-KEM-1024\",\n aead: \"CHACHA20POLY1305\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"ML-DSA-87\",\n id: 0xf010,\n },\n 0xf011: {\n hash: \"SHA-512\",\n hpke: {\n kem: \"X-Wing\",\n aead: \"AES256GCM\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"ML-DSA-87\",\n id: 0xf011,\n },\n 0xf012: {\n hash: \"SHA-512\",\n hpke: {\n kem: \"X-Wing\",\n aead: \"CHACHA20POLY1305\",\n kdf: \"HKDF-SHA512\",\n },\n signature: \"ML-DSA-87\",\n id: 0xf012,\n },\n};\n//# sourceMappingURL=ciphersuite.js.map","/** @public */\nexport const greaseValues = [\n 0x0a0a, 0x1a1a, 0x2a2a, 0x3a3a, 0x4a4a, 0x5a5a, 0x6a6a, 0x7a7a, 0x8a8a, 0x9a9a, 0xaaaa, 0xbaba, 0xcaca, 0xdada,\n 0xeaea,\n];\nexport const defaultGreaseConfig = {\n probabilityPerGreaseValue: 0.1,\n};\nfunction grease(greaseConfig) {\n return greaseValues.filter(() => greaseConfig.probabilityPerGreaseValue > Math.random());\n}\nfunction greaseCiphersuites(greaseConfig) {\n return grease(greaseConfig).map((n) => n);\n}\nfunction greaseCredentials(greaseConfig) {\n return grease(greaseConfig);\n}\n/** @public */\nexport function greaseExtensions(greaseConfig) {\n return grease(greaseConfig).map((n) => ({ extensionType: n, extensionData: new Uint8Array() }));\n}\n/** @public */\nexport function greaseCapabilities(config, capabilities) {\n return {\n ciphersuites: [...capabilities.ciphersuites, ...greaseCiphersuites(config)],\n credentials: [...capabilities.credentials, ...greaseCredentials(config)],\n extensions: [...capabilities.extensions, ...grease(config)],\n proposals: [...capabilities.proposals, ...grease(config)],\n versions: capabilities.versions,\n };\n}\n//# sourceMappingURL=grease.js.map","import { defaultCredentialTypes } from \"./defaultCredentialType.js\";\nimport { ciphersuites } from \"./crypto/ciphersuite.js\";\nimport { greaseCapabilities, defaultGreaseConfig } from \"./grease.js\";\nimport { protocolVersions } from \"./protocolVersion.js\";\n/** @public */\nexport function defaultCapabilities() {\n return greaseCapabilities(defaultGreaseConfig, {\n versions: [protocolVersions.mls10],\n ciphersuites: Object.values(ciphersuites),\n extensions: [],\n proposals: [],\n credentials: Object.values(defaultCredentialTypes),\n });\n}\n//# sourceMappingURL=defaultCapabilities.js.map","import { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenTypeDecoder, varLenDataEncoder, varLenTypeEncoder } from \"./codec/variableLength.js\";\nimport { refhash } from \"./crypto/hash.js\";\nimport { signWithLabel, verifyWithLabel } from \"./crypto/signature.js\";\nimport { extensionEncoder, customExtensionDecoder } from \"./extension.js\";\nimport { protocolVersionDecoder, protocolVersionEncoder, protocolVersions, } from \"./protocolVersion.js\";\nimport { leafNodeKeyPackageDecoder, leafNodeEncoder, signLeafNodeKeyPackage, } from \"./leafNode.js\";\nimport { leafNodeSources } from \"./leafNodeSource.js\";\nimport { defaultLifetime } from \"./lifetime.js\";\nimport { defaultCapabilities } from \"./defaultCapabilities.js\";\nimport { uint16Decoder, uint16Encoder } from \"./codec/number.js\";\nimport { defaultGreaseConfig, greaseExtensions } from \"./grease.js\";\nexport const keyPackageTBSEncoder = contramapBufferEncoders([protocolVersionEncoder, uint16Encoder, varLenDataEncoder, leafNodeEncoder, varLenTypeEncoder(extensionEncoder)], (keyPackageTBS) => [\n keyPackageTBS.version,\n keyPackageTBS.cipherSuite,\n keyPackageTBS.initKey,\n keyPackageTBS.leafNode,\n keyPackageTBS.extensions,\n]);\nexport const keyPackageTBSDecoder = mapDecoders([\n protocolVersionDecoder,\n uint16Decoder,\n varLenDataDecoder,\n leafNodeKeyPackageDecoder,\n varLenTypeDecoder(customExtensionDecoder),\n], (version, cipherSuite, initKey, leafNode, extensions) => ({\n version,\n cipherSuite,\n initKey,\n leafNode,\n extensions,\n}));\n/** @public */\nexport const keyPackageEncoder = contramapBufferEncoders([keyPackageTBSEncoder, varLenDataEncoder], (keyPackage) => [keyPackage, keyPackage.signature]);\n/** @public */\nexport const keyPackageDecoder = mapDecoders([keyPackageTBSDecoder, varLenDataDecoder], (keyPackageTBS, signature) => ({\n ...keyPackageTBS,\n signature,\n}));\nasync function signKeyPackage(tbs, signKey, s) {\n return { ...tbs, signature: await signWithLabel(signKey, \"KeyPackageTBS\", encode(keyPackageTBSEncoder, tbs), s) };\n}\nexport async function verifyKeyPackage(kp, s) {\n return verifyWithLabel(kp.leafNode.signaturePublicKey, \"KeyPackageTBS\", encode(keyPackageTBSEncoder, kp), kp.signature, s);\n}\n/** @public */\nexport function makeKeyPackageRef(value, h) {\n return refhash(\"MLS 1.0 KeyPackage Reference\", encode(keyPackageEncoder, value), h);\n}\n/** @public */\nexport const privateKeyPackageEncoder = contramapBufferEncoders([varLenDataEncoder, varLenDataEncoder, varLenDataEncoder], (pkp) => [pkp.initPrivateKey, pkp.hpkePrivateKey, pkp.signaturePrivateKey]);\n/** @public */\nexport const privateKeyPackageDecoder = mapDecoders([varLenDataDecoder, varLenDataDecoder, varLenDataDecoder], (initPrivateKey, hpkePrivateKey, signaturePrivateKey) => ({ initPrivateKey, hpkePrivateKey, signaturePrivateKey }));\n/** @public */\nexport async function generateKeyPackageWithKey(params) {\n const { credential, signatureKeyPair, cipherSuite, leafNodeExtensions } = params;\n const capabilities = params.capabilities ?? defaultCapabilities();\n const lifetime = params.lifetime ?? defaultLifetime();\n const extensions = params.extensions ?? greaseExtensions(defaultGreaseConfig);\n const cs = cipherSuite;\n const initKeys = await cs.hpke.generateKeyPair();\n const hpkeKeys = await cs.hpke.generateKeyPair();\n const privatePackage = {\n initPrivateKey: await cs.hpke.exportPrivateKey(initKeys.privateKey),\n hpkePrivateKey: await cs.hpke.exportPrivateKey(hpkeKeys.privateKey),\n signaturePrivateKey: signatureKeyPair.signKey,\n };\n const leafNodeTbs = {\n leafNodeSource: leafNodeSources.key_package,\n hpkePublicKey: await cs.hpke.exportPublicKey(hpkeKeys.publicKey),\n signaturePublicKey: signatureKeyPair.publicKey,\n extensions: leafNodeExtensions ?? [],\n credential,\n capabilities,\n lifetime,\n };\n const tbs = {\n version: protocolVersions.mls10,\n cipherSuite: cs.id,\n initKey: await cs.hpke.exportPublicKey(initKeys.publicKey),\n leafNode: await signLeafNodeKeyPackage(leafNodeTbs, signatureKeyPair.signKey, cs.signature),\n extensions: extensions,\n };\n return { publicPackage: await signKeyPackage(tbs, signatureKeyPair.signKey, cs.signature), privatePackage };\n}\n/** @public */\nexport async function generateKeyPackage(params) {\n const { credential, cipherSuite, leafNodeExtensions, capabilities, lifetime } = params;\n const extensions = params.extensions ?? [];\n const sigKeys = await cipherSuite.signature.keygen();\n return generateKeyPackageWithKey({\n credential,\n capabilities,\n lifetime,\n extensions,\n signatureKeyPair: sigKeys,\n cipherSuite,\n leafNodeExtensions,\n });\n}\n//# sourceMappingURL=keyPackage.js.map","import { varLenDataEncoder } from \"../codec/variableLength.js\";\nimport { uint16Encoder, uint32Encoder } from \"../codec/number.js\";\nimport { composeBufferEncoders, encode } from \"../codec/tlsEncoder.js\";\nexport function expandWithLabel(secret, label, context, length, kdf) {\n const infoEncoder = composeBufferEncoders([uint16Encoder, varLenDataEncoder, varLenDataEncoder]);\n return kdf.expand(secret, encode(infoEncoder, [length, new TextEncoder().encode(`MLS 1.0 ${label}`), context]), length);\n}\nexport async function deriveSecret(secret, label, kdf) {\n return expandWithLabel(secret, label, new Uint8Array(), kdf.size, kdf);\n}\nexport async function deriveTreeSecret(secret, label, generation, length, kdf) {\n return expandWithLabel(secret, label, encode(uint32Encoder, generation), length, kdf);\n}\n//# sourceMappingURL=kdf.js.map","export function numberToEnum(t) {\n return (n) => (Object.values(t).includes(n) ? n : undefined);\n}\n//# sourceMappingURL=enumHelpers.js.map","import { uint16Decoder, uint64Decoder, uint8Decoder, uint16Encoder, uint64Encoder, uint8Encoder, } from \"./codec/number.js\";\nimport { flatMapDecoder, mapDecoder, mapDecoderOption, mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenDataEncoder } from \"./codec/variableLength.js\";\nimport { expandWithLabel } from \"./crypto/kdf.js\";\nimport { numberToEnum } from \"./util/enumHelpers.js\";\n/** @public */\nexport const pskTypes = {\n external: 1,\n resumption: 2,\n};\nexport const pskTypeEncoder = uint8Encoder;\nexport const pskTypeDecoder = mapDecoderOption(uint8Decoder, numberToEnum(pskTypes));\n/** @public */\nexport const resumptionPSKUsages = {\n application: 1,\n reinit: 2,\n branch: 3,\n};\nexport const resumptionPSKUsageEncoder = uint8Encoder;\nexport const resumptionPSKUsageDecoder = mapDecoderOption(uint8Decoder, numberToEnum(resumptionPSKUsages));\nconst encodePskInfoExternal = contramapBufferEncoders([pskTypeEncoder, varLenDataEncoder], (i) => [i.psktype, i.pskId]);\nconst encodePskInfoResumption = contramapBufferEncoders([pskTypeEncoder, resumptionPSKUsageEncoder, varLenDataEncoder, uint64Encoder], (info) => [info.psktype, info.usage, info.pskGroupId, info.pskEpoch]);\nconst pskInfoResumptionDecoder = mapDecoders([resumptionPSKUsageDecoder, varLenDataDecoder, uint64Decoder], (usage, pskGroupId, pskEpoch) => {\n return { usage, pskGroupId, pskEpoch };\n});\nexport const pskInfoEncoder = (info) => {\n switch (info.psktype) {\n case pskTypes.external:\n return encodePskInfoExternal(info);\n case pskTypes.resumption:\n return encodePskInfoResumption(info);\n }\n};\nexport const pskInfoDecoder = flatMapDecoder(pskTypeDecoder, (psktype) => {\n switch (psktype) {\n case pskTypes.external:\n return mapDecoder(varLenDataDecoder, (pskId) => ({\n psktype,\n pskId,\n }));\n case pskTypes.resumption:\n return mapDecoder(pskInfoResumptionDecoder, (resumption) => ({\n psktype,\n ...resumption,\n }));\n }\n});\nexport const pskIdEncoder = contramapBufferEncoders([pskInfoEncoder, varLenDataEncoder], (pskid) => [pskid, pskid.pskNonce]);\nexport const pskIdDecoder = mapDecoders([pskInfoDecoder, varLenDataDecoder], (info, pskNonce) => ({\n ...info,\n pskNonce,\n}));\nexport const pskLabelEncoder = contramapBufferEncoders([pskIdEncoder, uint16Encoder, uint16Encoder], (label) => [label.id, label.index, label.count]);\nexport const pskLabelDecoder = mapDecoders([pskIdDecoder, uint16Decoder, uint16Decoder], (id, index, count) => ({ id, index, count }));\nexport async function computePskSecret(psks, impl) {\n const zeroes = new Uint8Array(impl.kdf.size);\n return psks.reduce(async (acc, [curId, curPsk], index) => updatePskSecret(await acc, curId, curPsk, index, psks.length, impl), Promise.resolve(zeroes));\n}\nexport async function updatePskSecret(secret, pskId, psk, index, count, impl) {\n const zeroes = new Uint8Array(impl.kdf.size);\n return impl.kdf.extract(await expandWithLabel(await impl.kdf.extract(zeroes, psk), \"derived psk\", encode(pskLabelEncoder, { id: pskId, index, count }), impl.kdf.size, impl.kdf), secret);\n}\n//# sourceMappingURL=presharedkey.js.map","import { uint16Decoder, uint16Encoder } from \"./codec/number.js\";\nimport { mapDecoderOption } from \"./codec/tlsDecoder.js\";\n/** @public */\nexport const defaultProposalTypes = {\n add: 1,\n update: 2,\n remove: 3,\n psk: 4,\n reinit: 5,\n external_init: 6,\n group_context_extensions: 7,\n};\nconst defaultProposalTypeValues = new Set(Object.values(defaultProposalTypes));\nexport function isDefaultProposalTypeValue(v) {\n return defaultProposalTypeValues.has(v);\n}\nexport const defaultProposalTypeValueEncoder = uint16Encoder;\nexport const decodeDefaultProposalTypeValue = mapDecoderOption(uint16Decoder, (v) => defaultProposalTypeValues.has(v) ? v : undefined);\n//# sourceMappingURL=defaultProposalType.js.map","import { uint16Decoder, uint32Decoder, uint16Encoder, uint32Encoder } from \"./codec/number.js\";\nimport { flatMapDecoder, mapDecoder, mapDecoders, orDecoder } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoder, contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenTypeDecoder, varLenDataEncoder, varLenTypeEncoder } from \"./codec/variableLength.js\";\nimport { extensionEncoder, groupContextExtensionDecoder } from \"./extension.js\";\nimport { keyPackageDecoder, keyPackageEncoder } from \"./keyPackage.js\";\nimport { pskIdDecoder, pskIdEncoder } from \"./presharedkey.js\";\nimport { decodeDefaultProposalTypeValue, defaultProposalTypeValueEncoder, defaultProposalTypes, isDefaultProposalTypeValue, } from \"./defaultProposalType.js\";\nimport { protocolVersionDecoder, protocolVersionEncoder } from \"./protocolVersion.js\";\nimport { leafNodeUpdateDecoder, leafNodeEncoder } from \"./leafNode.js\";\nexport const addEncoder = contramapBufferEncoder(keyPackageEncoder, (a) => a.keyPackage);\nexport const addDecoder = mapDecoder(keyPackageDecoder, (keyPackage) => ({ keyPackage }));\nexport const updateEncoder = contramapBufferEncoder(leafNodeEncoder, (u) => u.leafNode);\nexport const updateDecoder = mapDecoder(leafNodeUpdateDecoder, (leafNode) => ({ leafNode }));\nexport const removeEncoder = contramapBufferEncoder(uint32Encoder, (r) => r.removed);\nexport const removeDecoder = mapDecoder(uint32Decoder, (removed) => ({ removed }));\nexport const pskEncoder = contramapBufferEncoder(pskIdEncoder, (p) => p.preSharedKeyId);\nexport const pskDecoder = mapDecoder(pskIdDecoder, (preSharedKeyId) => ({ preSharedKeyId }));\nexport const reinitEncoder = contramapBufferEncoders([varLenDataEncoder, protocolVersionEncoder, uint16Encoder, varLenTypeEncoder(extensionEncoder)], (r) => [r.groupId, r.version, r.cipherSuite, r.extensions]);\nexport const reinitDecoder = mapDecoders([varLenDataDecoder, protocolVersionDecoder, uint16Decoder, varLenTypeDecoder(groupContextExtensionDecoder)], (groupId, version, cipherSuite, extensions) => ({ groupId, version, cipherSuite, extensions }));\nexport const externalInitEncoder = contramapBufferEncoder(varLenDataEncoder, (e) => e.kemOutput);\nexport const externalInitDecoder = mapDecoder(varLenDataDecoder, (kemOutput) => ({ kemOutput }));\nexport const groupContextExtensionsEncoder = contramapBufferEncoder(varLenTypeEncoder(extensionEncoder), (g) => g.extensions);\nexport const groupContextExtensionsDecoder = mapDecoder(varLenTypeDecoder(groupContextExtensionDecoder), (extensions) => ({ extensions }));\n/** @public */\nexport function isDefaultProposal(p) {\n return isDefaultProposalTypeValue(p.proposalType);\n}\nconst proposalAddEncoder = contramapBufferEncoders([defaultProposalTypeValueEncoder, addEncoder], (p) => [p.proposalType, p.add]);\nconst proposalUpdateEncoder = contramapBufferEncoders([defaultProposalTypeValueEncoder, updateEncoder], (p) => [p.proposalType, p.update]);\nconst proposalRemoveEncoder = contramapBufferEncoders([defaultProposalTypeValueEncoder, removeEncoder], (p) => [p.proposalType, p.remove]);\nconst proposalPSKEncoder = contramapBufferEncoders([defaultProposalTypeValueEncoder, pskEncoder], (p) => [p.proposalType, p.psk]);\nconst proposalReinitEncoder = contramapBufferEncoders([defaultProposalTypeValueEncoder, reinitEncoder], (p) => [p.proposalType, p.reinit]);\nconst proposalExternalInitEncoder = contramapBufferEncoders([defaultProposalTypeValueEncoder, externalInitEncoder], (p) => [p.proposalType, p.externalInit]);\nconst proposalGroupContextExtensionsEncoder = contramapBufferEncoders([defaultProposalTypeValueEncoder, groupContextExtensionsEncoder], (p) => [p.proposalType, p.groupContextExtensions]);\nconst proposalCustomEncoder = contramapBufferEncoders([uint16Encoder, varLenDataEncoder], (p) => [p.proposalType, p.proposalData]);\nexport const proposalEncoder = (p) => {\n if (!isDefaultProposal(p))\n return proposalCustomEncoder(p);\n switch (p.proposalType) {\n case defaultProposalTypes.add:\n return proposalAddEncoder(p);\n case defaultProposalTypes.update:\n return proposalUpdateEncoder(p);\n case defaultProposalTypes.remove:\n return proposalRemoveEncoder(p);\n case defaultProposalTypes.psk:\n return proposalPSKEncoder(p);\n case defaultProposalTypes.reinit:\n return proposalReinitEncoder(p);\n case defaultProposalTypes.external_init:\n return proposalExternalInitEncoder(p);\n case defaultProposalTypes.group_context_extensions:\n return proposalGroupContextExtensionsEncoder(p);\n }\n};\nconst proposalAddDecoder = mapDecoder(addDecoder, (add) => ({\n proposalType: defaultProposalTypes.add,\n add,\n}));\nconst proposalUpdateDecoder = mapDecoder(updateDecoder, (update) => ({\n proposalType: defaultProposalTypes.update,\n update,\n}));\nconst proposalRemoveDecoder = mapDecoder(removeDecoder, (remove) => ({\n proposalType: defaultProposalTypes.remove,\n remove,\n}));\nconst proposalPSKDecoder = mapDecoder(pskDecoder, (psk) => ({\n proposalType: defaultProposalTypes.psk,\n psk,\n}));\nconst proposalReinitDecoder = mapDecoder(reinitDecoder, (reinit) => ({\n proposalType: defaultProposalTypes.reinit,\n reinit,\n}));\nconst proposalExternalInitDecoder = mapDecoder(externalInitDecoder, (externalInit) => ({\n proposalType: defaultProposalTypes.external_init,\n externalInit,\n}));\nconst proposalGroupContextExtensionsDecoder = mapDecoder(groupContextExtensionsDecoder, (groupContextExtensions) => ({\n proposalType: defaultProposalTypes.group_context_extensions,\n groupContextExtensions,\n}));\nfunction proposalCustomDecoder(proposalType) {\n return mapDecoder(varLenDataDecoder, (proposalData) => ({ proposalType, proposalData }));\n}\nexport const proposalDecoder = orDecoder(flatMapDecoder(decodeDefaultProposalTypeValue, (proposalType) => {\n switch (proposalType) {\n case defaultProposalTypes.add:\n return proposalAddDecoder;\n case defaultProposalTypes.update:\n return proposalUpdateDecoder;\n case defaultProposalTypes.remove:\n return proposalRemoveDecoder;\n case defaultProposalTypes.psk:\n return proposalPSKDecoder;\n case defaultProposalTypes.reinit:\n return proposalReinitDecoder;\n case defaultProposalTypes.external_init:\n return proposalExternalInitDecoder;\n case defaultProposalTypes.group_context_extensions:\n return proposalGroupContextExtensionsDecoder;\n }\n}), flatMapDecoder(uint16Decoder, (n) => proposalCustomDecoder(n)));\n//# sourceMappingURL=proposal.js.map","import { uint8Decoder } from \"./number.js\";\nexport function optionalEncoder(encodeT) {\n return (t) => {\n if (t) {\n const [len, write] = encodeT(t);\n return [\n len + 1,\n (offset, buffer) => {\n const view = new DataView(buffer);\n view.setUint8(offset, 0x1);\n write(offset + 1, buffer);\n },\n ];\n }\n else {\n return [\n 1,\n (offset, buffer) => {\n const view = new DataView(buffer);\n view.setUint8(offset, 0x0);\n },\n ];\n }\n };\n}\nexport function optionalDecoder(decodeT) {\n return (b, offset) => {\n const presenceOctet = uint8Decoder(b, offset)?.[0];\n if (presenceOctet == 1) {\n const result = decodeT(b, offset + 1);\n return result === undefined ? undefined : [result[0], result[1] + 1];\n }\n else {\n return [undefined, 1];\n }\n };\n}\n//# sourceMappingURL=optional.js.map","import { uint8Decoder, uint8Encoder } from \"./codec/number.js\";\nimport { flatMapDecoder, mapDecoder, mapDecoderOption } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenDataEncoder } from \"./codec/variableLength.js\";\nimport { proposalDecoder, proposalEncoder } from \"./proposal.js\";\nimport { numberToEnum } from \"./util/enumHelpers.js\";\n/** @public */\nexport const proposalOrRefTypes = {\n proposal: 1,\n reference: 2,\n};\nexport const proposalOrRefTypeEncoder = uint8Encoder;\nexport const proposalOrRefTypeDecoder = mapDecoderOption(uint8Decoder, numberToEnum(proposalOrRefTypes));\nconst proposalOrRefProposalEncoder = contramapBufferEncoders([proposalOrRefTypeEncoder, proposalEncoder], (p) => [p.proposalOrRefType, p.proposal]);\nconst proposalOrRefProposalRefEncoder = contramapBufferEncoders([proposalOrRefTypeEncoder, varLenDataEncoder], (r) => [r.proposalOrRefType, r.reference]);\nexport const proposalOrRefEncoder = (input) => {\n switch (input.proposalOrRefType) {\n case proposalOrRefTypes.proposal:\n return proposalOrRefProposalEncoder(input);\n case proposalOrRefTypes.reference:\n return proposalOrRefProposalRefEncoder(input);\n }\n};\nexport const proposalOrRefDecoder = flatMapDecoder(proposalOrRefTypeDecoder, (proposalOrRefType) => {\n switch (proposalOrRefType) {\n case proposalOrRefTypes.proposal:\n return mapDecoder(proposalDecoder, (proposal) => ({ proposalOrRefType, proposal }));\n case proposalOrRefTypes.reference:\n return mapDecoder(varLenDataDecoder, (reference) => ({ proposalOrRefType, reference }));\n }\n});\n//# sourceMappingURL=proposalOrRefType.js.map","import { varLenDataEncoder } from \"../codec/variableLength.js\";\nimport { composeBufferEncoders, encode } from \"../codec/tlsEncoder.js\";\nexport function encryptWithLabel(publicKey, label, context, plaintext, hpke) {\n const infoEncoder = composeBufferEncoders([varLenDataEncoder, varLenDataEncoder]);\n return hpke.seal(publicKey, plaintext, encode(infoEncoder, [new TextEncoder().encode(`MLS 1.0 ${label}`), context]), new Uint8Array());\n}\nexport function decryptWithLabel(privateKey, label, context, kemOutput, ciphertext, hpke) {\n const infoEncoder = composeBufferEncoders([varLenDataEncoder, varLenDataEncoder]);\n return hpke.open(privateKey, kemOutput, ciphertext, encode(infoEncoder, [new TextEncoder().encode(`MLS 1.0 ${label}`), context]));\n}\n//# sourceMappingURL=hpke.js.map","import { uint16Decoder, uint16Encoder, uint64Decoder, uint64Encoder } from \"./codec/number.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenTypeDecoder, varLenDataEncoder, varLenTypeEncoder } from \"./codec/variableLength.js\";\nimport { expandWithLabel } from \"./crypto/kdf.js\";\nimport { extensionEncoder, groupContextExtensionDecoder } from \"./extension.js\";\nimport { protocolVersionDecoder, protocolVersionEncoder } from \"./protocolVersion.js\";\nexport const groupContextEncoder = contramapBufferEncoders([\n protocolVersionEncoder,\n uint16Encoder,\n varLenDataEncoder, // groupId\n uint64Encoder, // epoch\n varLenDataEncoder, // treeHash\n varLenDataEncoder, // confirmedTranscriptHash\n varLenTypeEncoder(extensionEncoder),\n], (gc) => [gc.version, gc.cipherSuite, gc.groupId, gc.epoch, gc.treeHash, gc.confirmedTranscriptHash, gc.extensions]);\nexport const groupContextDecoder = mapDecoders([\n protocolVersionDecoder,\n uint16Decoder,\n varLenDataDecoder, // groupId\n uint64Decoder, // epoch\n varLenDataDecoder, // treeHash\n varLenDataDecoder, // confirmedTranscriptHash\n varLenTypeDecoder(groupContextExtensionDecoder),\n], (version, cipherSuite, groupId, epoch, treeHash, confirmedTranscriptHash, extensions) => ({\n version,\n cipherSuite,\n groupId,\n epoch,\n treeHash,\n confirmedTranscriptHash,\n extensions,\n}));\nexport async function extractEpochSecret(context, joinerSecret, kdf, pskSecret) {\n const psk = pskSecret === undefined ? new Uint8Array(kdf.size) : pskSecret;\n const extracted = await kdf.extract(joinerSecret, psk);\n return expandWithLabel(extracted, \"epoch\", encode(groupContextEncoder, context), kdf.size, kdf);\n}\nexport async function extractJoinerSecret(context, previousInitSecret, commitSecret, kdf) {\n const extracted = await kdf.extract(previousInitSecret, commitSecret);\n return expandWithLabel(extracted, \"joiner\", encode(groupContextEncoder, context), kdf.size, kdf);\n}\n//# sourceMappingURL=groupContext.js.map","import { uint8Decoder, uint8Encoder } from \"./codec/number.js\";\nimport { mapDecoderOption } from \"./codec/tlsDecoder.js\";\nimport { numberToEnum } from \"./util/enumHelpers.js\";\n/** @public */\nexport const nodeTypes = {\n leaf: 1,\n parent: 2,\n};\nexport const nodeTypeEncoder = uint8Encoder;\nexport const nodeTypeDecoder = mapDecoderOption(uint8Decoder, numberToEnum(nodeTypes));\n//# sourceMappingURL=nodeType.js.map","import { uint32Encoder, uint32Decoder } from \"./codec/number.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { varLenDataEncoder, varLenTypeEncoder, varLenDataDecoder, varLenTypeDecoder } from \"./codec/variableLength.js\";\nexport const parentNodeEncoder = contramapBufferEncoders([varLenDataEncoder, varLenDataEncoder, varLenTypeEncoder(uint32Encoder)], (node) => [node.hpkePublicKey, node.parentHash, node.unmergedLeaves]);\nexport const parentNodeDecoder = mapDecoders([varLenDataDecoder, varLenDataDecoder, varLenTypeDecoder(uint32Decoder)], (hpkePublicKey, parentHash, unmergedLeaves) => ({\n hpkePublicKey,\n parentHash,\n unmergedLeaves,\n}));\n//# sourceMappingURL=parentNode.js.map","import { InternalError } from \"./mlsError.js\";\n/** @public */\nexport function toNodeIndex(n) {\n return n;\n}\n/** @public */\nexport function toLeafIndex(n) {\n return n;\n}\nfunction log2(x) {\n if (x === 0)\n return 0;\n let k = 0;\n while (x >> k > 0) {\n k++;\n }\n return k - 1;\n}\nfunction level(nodeIndex) {\n if ((nodeIndex & 0x01) === 0)\n return 0;\n let k = 0;\n while (((nodeIndex >> k) & 0x01) === 1) {\n k++;\n }\n return k;\n}\nexport function isLeaf(nodeIndex) {\n return nodeIndex % 2 == 0;\n}\nexport function leafToNodeIndex(leafIndex) {\n return toNodeIndex(leafIndex * 2);\n}\nexport function nodeToLeafIndex(nodeIndex) {\n return toLeafIndex(nodeIndex / 2);\n}\nexport function leafWidth(nodeWidth) {\n return nodeWidth == 0 ? 0 : (nodeWidth - 1) / 2 + 1;\n}\nexport function nodeWidth(leafWidth) {\n return leafWidth === 0 ? 0 : 2 * (leafWidth - 1) + 1;\n}\nexport function rootFromNodeWidth(nodeWidth) {\n return toNodeIndex((1 << log2(nodeWidth)) - 1);\n}\nexport function root(leafWidth) {\n const w = nodeWidth(leafWidth);\n return rootFromNodeWidth(w);\n}\nexport function left(nodeIndex) {\n const k = level(nodeIndex);\n if (k === 0)\n throw new InternalError(\"leaf node has no children\");\n return toNodeIndex(nodeIndex ^ (0x01 << (k - 1)));\n}\nexport function right(nodeIndex) {\n const k = level(nodeIndex);\n if (k === 0)\n throw new InternalError(\"leaf node has no children\");\n return toNodeIndex(nodeIndex ^ (0x03 << (k - 1)));\n}\nexport function parent(nodeIndex, leafWidth) {\n if (nodeIndex === root(leafWidth))\n throw new InternalError(\"root node has no parent\");\n const k = level(nodeIndex);\n const b = (nodeIndex >> (k + 1)) & 0x01;\n return toNodeIndex((nodeIndex | (1 << k)) ^ (b << (k + 1)));\n}\nexport function sibling(x, leafWidth) {\n const p = parent(x, leafWidth);\n return x < p ? right(p) : left(p);\n}\nexport function directPath(nodeIndex, leafWidth) {\n const r = root(leafWidth);\n if (nodeIndex === r)\n return [];\n const d = [];\n while (nodeIndex !== r) {\n nodeIndex = parent(nodeIndex, leafWidth);\n d.push(nodeIndex);\n }\n return d;\n}\nexport function copath(nodeIndex, leafWidth) {\n if (nodeIndex === root(leafWidth))\n return [];\n const d = directPath(nodeIndex, leafWidth);\n d.unshift(nodeIndex);\n d.pop();\n return d.map((y) => sibling(y, leafWidth));\n}\nexport function isAncestor(childNodeIndex, ancestor, nodeWidth) {\n return directPath(childNodeIndex, leafWidth(nodeWidth)).includes(ancestor);\n}\n//# sourceMappingURL=treemath.js.map","import { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { flatMapDecoder, mapDecoder } from \"./codec/tlsDecoder.js\";\nimport { varLenTypeDecoder, varLenTypeEncoder } from \"./codec/variableLength.js\";\nimport { nodeTypeDecoder, nodeTypeEncoder, nodeTypes } from \"./nodeType.js\";\nimport { optionalDecoder, optionalEncoder } from \"./codec/optional.js\";\nimport { parentNodeEncoder, parentNodeDecoder } from \"./parentNode.js\";\nimport { copath, directPath, isLeaf, leafToNodeIndex, leafWidth, left, nodeToLeafIndex, parent, right, root, toLeafIndex, toNodeIndex, } from \"./treemath.js\";\nimport { leafNodeEncoder, leafNodeDecoder, leafNodeEqual } from \"./leafNode.js\";\nimport { InternalError, ValidationError } from \"./mlsError.js\";\nconst nodeEncoder = (node) => {\n switch (node.nodeType) {\n case nodeTypes.parent:\n return contramapBufferEncoders([nodeTypeEncoder, parentNodeEncoder], (n) => [n.nodeType, n.parent])(node);\n case nodeTypes.leaf:\n return contramapBufferEncoders([nodeTypeEncoder, leafNodeEncoder], (n) => [n.nodeType, n.leaf])(node);\n }\n};\nconst nodeDecoder = flatMapDecoder(nodeTypeDecoder, (nodeType) => {\n switch (nodeType) {\n case nodeTypes.parent:\n return mapDecoder(parentNodeDecoder, (parent) => ({\n nodeType,\n parent,\n }));\n case nodeTypes.leaf:\n return mapDecoder(leafNodeDecoder, (leaf) => ({\n nodeType,\n leaf,\n }));\n }\n});\nexport function getHpkePublicKey(n) {\n switch (n.nodeType) {\n case nodeTypes.parent:\n return n.parent.hpkePublicKey;\n case nodeTypes.leaf:\n return n.leaf.hpkePublicKey;\n }\n}\nfunction extendRatchetTree(tree) {\n const lastIndex = tree.length - 1;\n if (tree[lastIndex] === undefined) {\n throw new InternalError(\"The last node in the ratchet tree must be non-blank.\");\n }\n // Compute the smallest full binary tree size >= current length\n const neededSize = nextFullBinaryTreeSize(tree.length);\n // Fill with `undefined` until tree has the needed size\n while (tree.length < neededSize) {\n tree.push(undefined);\n }\n return tree;\n}\n// Compute the smallest 2^(d + 1) - 1 >= n\nfunction nextFullBinaryTreeSize(n) {\n const value = n + 1;\n const exponent = 32 - Math.clz32(value - 1);\n return 2 ** exponent - 1;\n}\n/**\n * If the tree has 2d leaves, then it has 2d+1 - 1 nodes.\n * The ratchet_tree vector logically has this number of entries, but the sender MUST NOT include blank nodes after the last non-blank node.\n * The receiver MUST check that the last node in ratchet_tree is non-blank, and then extend the tree to the right until it has a length of the form 2d+1 - 1, adding the minimum number of blank values possible.\n * (Obviously, this may be done \"virtually\", by synthesizing blank nodes when required, as opposed to actually changing the structure in memory.)\n */\nfunction stripBlankNodes(tree) {\n const lastNonBlank = findLastNonBlankNodeIndex(tree);\n if (lastNonBlank === tree.length - 1) {\n return tree;\n }\n return tree.slice(0, lastNonBlank + 1);\n}\nfunction stripBlankNodesMutable(tree) {\n const lastNonBlank = findLastNonBlankNodeIndex(tree);\n if (lastNonBlank === tree.length - 1) {\n return tree;\n }\n tree.length = lastNonBlank + 1;\n return tree;\n}\nfunction findLastNonBlankNodeIndex(tree) {\n let lastNonBlank = tree.length - 1;\n while (lastNonBlank >= 0 && tree[lastNonBlank] === undefined) {\n lastNonBlank--;\n }\n return lastNonBlank;\n}\nexport const ratchetTreeEncoder = (tree) => varLenTypeEncoder(optionalEncoder(nodeEncoder), findLastNonBlankNodeIndex(tree) + 1)(tree);\nexport const ratchetTreeDecoder = mapDecoder(varLenTypeDecoder(optionalDecoder(nodeDecoder)), extendRatchetTree);\nexport function findBlankLeafNodeIndex(tree) {\n const nodeIndex = tree.findIndex((node, nodeIndex) => node === undefined && isLeaf(toNodeIndex(nodeIndex)));\n if (nodeIndex < 0)\n return undefined;\n else\n return toNodeIndex(nodeIndex);\n}\nexport function findBlankLeafNodeIndexOrExtend(tree) {\n const blankLeaf = findBlankLeafNodeIndex(tree);\n return blankLeaf === undefined ? toNodeIndex(tree.length + 1) : blankLeaf;\n}\nfunction extendTreeMutable(mutableTree, leafNode) {\n const newRoot = undefined;\n const insertedNodeIndex = toNodeIndex(mutableTree.length + 1);\n const originalLength = mutableTree.length;\n mutableTree.push(newRoot);\n mutableTree.push({ nodeType: nodeTypes.leaf, leaf: leafNode });\n for (let i = 0; i < originalLength - 1; i++) {\n mutableTree.push(undefined);\n }\n return insertedNodeIndex;\n}\nexport function addLeafNodeMutable(mutableTree, leafNode) {\n const blankLeaf = findBlankLeafNodeIndex(mutableTree);\n if (blankLeaf === undefined) {\n return extendTreeMutable(mutableTree, leafNode);\n }\n const insertedLeafIndex = nodeToLeafIndex(blankLeaf);\n const dp = directPath(blankLeaf, leafWidth(mutableTree.length));\n for (const nodeIndex of dp) {\n const node = mutableTree[nodeIndex];\n if (node !== undefined) {\n const parentNode = node;\n const updated = {\n nodeType: nodeTypes.parent,\n parent: { ...parentNode.parent, unmergedLeaves: [...parentNode.parent.unmergedLeaves, insertedLeafIndex] },\n };\n mutableTree[nodeIndex] = updated;\n }\n }\n mutableTree[blankLeaf] = { nodeType: nodeTypes.leaf, leaf: leafNode };\n return blankLeaf;\n}\nexport function updateLeafNodeMutable(mutableTree, leafNode, leafIndex) {\n const leafNodeIndex = leafToNodeIndex(leafIndex);\n const pathToBlank = directPath(leafNodeIndex, leafWidth(mutableTree.length));\n for (const nodeIndex of pathToBlank) {\n const node = mutableTree[nodeIndex];\n if (node !== undefined) {\n mutableTree[nodeIndex] = undefined;\n }\n }\n mutableTree[leafNodeIndex] = { nodeType: nodeTypes.leaf, leaf: leafNode };\n}\nexport function removeLeafNodeMutable(mutableTree, removedLeafIndex) {\n const leafNodeIndex = leafToNodeIndex(removedLeafIndex);\n const pathToBlank = directPath(leafNodeIndex, leafWidth(mutableTree.length));\n for (const nodeIndex of pathToBlank) {\n const node = mutableTree[nodeIndex];\n if (node !== undefined) {\n mutableTree[nodeIndex] = undefined;\n }\n }\n mutableTree[leafNodeIndex] = undefined;\n condenseRatchetTreeAfterRemoveMutable(mutableTree);\n}\n/**\n * When the right subtree of the tree no longer has any non-blank nodes, it can be safely removed\n */\nfunction condenseRatchetTreeAfterRemove(tree) {\n return extendRatchetTree(stripBlankNodes(tree));\n}\n/**\n * When the right subtree of the tree no longer has any non-blank nodes, it can be safely removed\n */\nfunction condenseRatchetTreeAfterRemoveMutable(tree) {\n return extendRatchetTree(stripBlankNodesMutable(tree));\n}\nexport function resolution(tree, nodeIndex) {\n const node = tree[nodeIndex];\n if (node === undefined) {\n if (isLeaf(nodeIndex)) {\n return [];\n }\n const l = left(nodeIndex);\n const r = right(nodeIndex);\n const leftRes = resolution(tree, l);\n const rightRes = resolution(tree, r);\n if (leftRes.length === 0)\n return rightRes;\n if (rightRes.length === 0)\n return leftRes;\n leftRes.push(...rightRes);\n return leftRes;\n }\n if (isLeaf(nodeIndex)) {\n return [nodeIndex];\n }\n const unmerged = node.nodeType === nodeTypes.parent ? node.parent.unmergedLeaves : [];\n return [nodeIndex, ...unmerged.map((u) => leafToNodeIndex(toLeafIndex(u)))];\n}\nexport function filteredDirectPath(leafIndex, tree) {\n const leafNodeIndex = leafToNodeIndex(leafIndex);\n const leafWidth = nodeToLeafIndex(toNodeIndex(tree.length));\n const cp = copath(leafNodeIndex, leafWidth);\n // the filtered direct path of a leaf node L is the node's direct path,\n // with any node removed whose child on the copath of L has an empty resolution\n return directPath(leafNodeIndex, leafWidth).filter((_nodeIndex, n) => resolution(tree, cp[n]).length !== 0);\n}\nexport function filteredDirectPathAndCopathResolution(leafIndex, tree) {\n const leafNodeIndex = leafToNodeIndex(leafIndex);\n const lWidth = leafWidth(tree.length);\n const cp = copath(leafNodeIndex, lWidth);\n // the filtered direct path of a leaf node L is the node's direct path,\n // with any node removed whose child on the copath of L has an empty resolution\n const result = [];\n const direct = directPath(leafNodeIndex, lWidth);\n for (let n = 0; n < direct.length; n++) {\n const cur = direct[n];\n const r = resolution(tree, cp[n]);\n if (r.length !== 0) {\n result.push({ nodeIndex: cur, resolution: r });\n }\n }\n return result;\n}\nexport function removeLeaves(tree, leafIndices) {\n const copy = tree.slice();\n const removedLeaves = new Set(leafIndices);\n function shouldBeRemoved(leafIndex) {\n return removedLeaves.has(toLeafIndex(leafIndex));\n }\n for (const [i, n] of tree.entries()) {\n if (n !== undefined) {\n const nodeIndex = toNodeIndex(i);\n if (isLeaf(nodeIndex) && shouldBeRemoved(nodeToLeafIndex(nodeIndex))) {\n copy[i] = undefined;\n }\n else if (n.nodeType === nodeTypes.parent) {\n copy[i] = {\n ...n,\n parent: { ...n.parent, unmergedLeaves: n.parent.unmergedLeaves.filter((l) => !shouldBeRemoved(l)) },\n };\n }\n }\n }\n return condenseRatchetTreeAfterRemove(copy);\n}\nfunction traverseToRoot(tree, leafIndex, f) {\n const rootIndex = root(leafWidth(tree.length));\n let currentIndex = leafToNodeIndex(leafIndex);\n while (currentIndex != rootIndex) {\n currentIndex = parent(currentIndex, leafWidth(tree.length));\n const currentNode = tree[currentIndex];\n if (currentNode !== undefined) {\n if (currentNode.nodeType === nodeTypes.leaf) {\n throw new InternalError(\"Expected parent node\");\n }\n const result = f(currentIndex, currentNode.parent);\n if (result !== undefined) {\n return [result, currentIndex];\n }\n }\n }\n}\nexport function findFirstNonBlankAncestor(tree, nodeIndex) {\n return (traverseToRoot(tree, nodeToLeafIndex(nodeIndex), (nodeIndex, _node) => nodeIndex)?.[0] ??\n root(leafWidth(tree.length)));\n}\nexport function findLeafIndex(tree, leaf) {\n const foundIndex = tree.findIndex((node, nodeIndex) => {\n if (isLeaf(toNodeIndex(nodeIndex)) && node !== undefined) {\n if (node.nodeType === nodeTypes.parent)\n throw new InternalError(\"Found parent node in leaf node position\");\n return leafNodeEqual(leaf, node.leaf);\n }\n return false;\n });\n return foundIndex === -1 ? undefined : nodeToLeafIndex(toNodeIndex(foundIndex));\n}\n/** @public */\nexport function getCredentialFromLeafIndex(ratchetTree, leafIndex) {\n const senderLeafNode = ratchetTree[leafToNodeIndex(leafIndex)];\n if (senderLeafNode === undefined || senderLeafNode.nodeType === nodeTypes.parent)\n throw new ValidationError(\"Unable to find leafnode for leafIndex\");\n return senderLeafNode.leaf.credential;\n}\nexport function getSignaturePublicKeyFromLeafIndex(ratchetTree, leafIndex) {\n const leafNode = ratchetTree[leafToNodeIndex(leafIndex)];\n if (leafNode === undefined || leafNode.nodeType === nodeTypes.parent)\n throw new ValidationError(\"Unable to find leafnode for leafIndex\");\n return leafNode.leaf.signaturePublicKey;\n}\n//# sourceMappingURL=ratchetTree.js.map","import { uint32Encoder, uint32Decoder } from \"./codec/number.js\";\nimport { optionalEncoder, optionalDecoder } from \"./codec/optional.js\";\nimport { mapDecoders, flatMapDecoder } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { varLenDataEncoder, varLenDataDecoder } from \"./codec/variableLength.js\";\nimport { leafNodeEncoder, leafNodeDecoder } from \"./leafNode.js\";\nimport { InternalError } from \"./mlsError.js\";\nimport { nodeTypeDecoder, nodeTypeEncoder, nodeTypes } from \"./nodeType.js\";\nimport { parentNodeEncoder, parentNodeDecoder } from \"./parentNode.js\";\nimport { rootFromNodeWidth, isLeaf, nodeToLeafIndex, left, right } from \"./treemath.js\";\nconst leafNodeHashInputEncoder = contramapBufferEncoders([nodeTypeEncoder, uint32Encoder, optionalEncoder(leafNodeEncoder)], (input) => [input.nodeType, input.leafIndex, input.leafNode]);\nconst leafNodeHashInputDecoder = mapDecoders([uint32Decoder, optionalDecoder(leafNodeDecoder)], (leafIndex, leafNode) => ({\n nodeType: nodeTypes.leaf,\n leafIndex,\n leafNode,\n}));\nconst parentNodeHashInputEncoder = contramapBufferEncoders([nodeTypeEncoder, optionalEncoder(parentNodeEncoder), varLenDataEncoder, varLenDataEncoder], (input) => [input.nodeType, input.parentNode, input.leftHash, input.rightHash]);\nconst parentNodeHashInputDecoder = mapDecoders([optionalDecoder(parentNodeDecoder), varLenDataDecoder, varLenDataDecoder], (parentNode, leftHash, rightHash) => ({\n nodeType: nodeTypes.parent,\n parentNode,\n leftHash,\n rightHash,\n}));\nexport const treeHashInputEncoder = (input) => {\n switch (input.nodeType) {\n case nodeTypes.leaf:\n return leafNodeHashInputEncoder(input);\n case nodeTypes.parent:\n return parentNodeHashInputEncoder(input);\n }\n};\nexport const treeHashInputDecoder = flatMapDecoder(nodeTypeDecoder, (nodeType) => {\n switch (nodeType) {\n case nodeTypes.leaf:\n return leafNodeHashInputDecoder;\n case nodeTypes.parent:\n return parentNodeHashInputDecoder;\n }\n});\nexport async function treeHashRoot(tree, h) {\n return treeHash(tree, rootFromNodeWidth(tree.length), h);\n}\nexport async function treeHash(tree, subtreeIndex, h) {\n if (isLeaf(subtreeIndex)) {\n const leafNode = tree[subtreeIndex];\n if (leafNode?.nodeType === nodeTypes.parent)\n throw new InternalError(\"Somehow found parent node in leaf position\");\n const input = encode(leafNodeHashInputEncoder, {\n nodeType: nodeTypes.leaf,\n leafIndex: nodeToLeafIndex(subtreeIndex),\n leafNode: leafNode?.leaf,\n });\n return await h.digest(input);\n }\n else {\n const parentNode = tree[subtreeIndex];\n if (parentNode?.nodeType === nodeTypes.leaf)\n throw new InternalError(\"Somehow found leaf node in parent position\");\n const leftHash = await treeHash(tree, left(subtreeIndex), h);\n const rightHash = await treeHash(tree, right(subtreeIndex), h);\n const input = {\n nodeType: nodeTypes.parent,\n parentNode: parentNode?.parent,\n leftHash: leftHash,\n rightHash: rightHash,\n };\n return await h.digest(encode(parentNodeHashInputEncoder, input));\n }\n}\n//# sourceMappingURL=treeHash.js.map","import { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenDataEncoder } from \"./codec/variableLength.js\";\nimport { InternalError } from \"./mlsError.js\";\nimport { findFirstNonBlankAncestor, removeLeaves } from \"./ratchetTree.js\";\nimport { treeHash } from \"./treeHash.js\";\nimport { isLeaf, leafWidth, left, right, root, toNodeIndex } from \"./treemath.js\";\nimport { nodeTypes } from \"./nodeType.js\";\nimport { leafNodeSources } from \"./leafNodeSource.js\";\nimport { constantTimeEqual } from \"./util/constantTimeCompare.js\";\nexport const parentHashInputEncoder = contramapBufferEncoders([varLenDataEncoder, varLenDataEncoder, varLenDataEncoder], (i) => [i.encryptionKey, i.parentHash, i.originalSiblingTreeHash]);\nexport const parentHashInputDecoder = mapDecoders([varLenDataDecoder, varLenDataDecoder, varLenDataDecoder], (encryptionKey, parentHash, originalSiblingTreeHash) => ({\n encryptionKey,\n parentHash,\n originalSiblingTreeHash,\n}));\nfunction validateParentHashCoverage(parentIndices, coverage) {\n for (const index of parentIndices) {\n if ((coverage[index] ?? 0) !== 1) {\n return false;\n }\n }\n return true;\n}\nexport async function verifyParentHashes(tree, h) {\n const parentNodes = tree.reduce((acc, cur, index) => {\n if (cur !== undefined && cur.nodeType === nodeTypes.parent) {\n return [...acc, index];\n }\n else\n return acc;\n }, []);\n if (parentNodes.length === 0)\n return true;\n const coverage = await parentHashCoverage(tree, h);\n return validateParentHashCoverage(parentNodes, coverage);\n}\n/**\n * Traverse tree from bottom up, verifying that all non-blank parent nodes are covered by exactly one chain\n */\nfunction parentHashCoverage(tree, h) {\n return tree.reduce(async (acc, node, nodeIndex) => {\n let currentIndex = toNodeIndex(nodeIndex);\n if (!isLeaf(currentIndex) || node === undefined)\n return acc;\n let updated = { ...(await acc) };\n const rootIndex = root(leafWidth(tree.length));\n while (currentIndex !== rootIndex) {\n const currentNode = tree[currentIndex];\n // skip blank nodes\n if (currentNode === undefined) {\n continue;\n }\n // parentHashNodeIndex is the node index where the nearest non blank ancestor was\n const [parentHash, parentHashNodeIndex] = await calculateParentHash(tree, currentIndex, h);\n if (parentHashNodeIndex === undefined) {\n throw new InternalError(\"Reached root before completing parent hash coeverage\");\n }\n const expectedParentHash = getParentHash(currentNode);\n if (expectedParentHash !== undefined && constantTimeEqual(parentHash, expectedParentHash)) {\n const newCount = (updated[parentHashNodeIndex] ?? 0) + 1;\n updated = { ...updated, [parentHashNodeIndex]: newCount };\n }\n else {\n // skip to next leaf\n break;\n }\n currentIndex = parentHashNodeIndex;\n }\n return updated;\n }, Promise.resolve({}));\n}\nfunction getParentHash(node) {\n if (node.nodeType === nodeTypes.parent)\n return node.parent.parentHash;\n else if (node.leaf.leafNodeSource === leafNodeSources.commit)\n return node.leaf.parentHash;\n}\n/**\n * Calculcates parent hash for a given node or leaf and returns the node index of the parent or undefined if the given node is the root node.\n */\nexport async function calculateParentHash(tree, nodeIndex, h) {\n const rootIndex = root(leafWidth(tree.length));\n if (nodeIndex === rootIndex) {\n return [new Uint8Array(), undefined];\n }\n const parentNodeIndex = findFirstNonBlankAncestor(tree, nodeIndex);\n const parentNode = tree[parentNodeIndex];\n if (parentNodeIndex === rootIndex && parentNode === undefined) {\n return [new Uint8Array(), parentNodeIndex];\n }\n const siblingIndex = nodeIndex < parentNodeIndex ? right(parentNodeIndex) : left(parentNodeIndex);\n if (parentNode === undefined || parentNode.nodeType === nodeTypes.leaf)\n throw new InternalError(\"Expected non-blank parent Node\");\n const removedUnmerged = removeLeaves(tree, parentNode.parent.unmergedLeaves);\n const originalSiblingTreeHash = await treeHash(removedUnmerged, siblingIndex, h);\n const input = {\n encryptionKey: parentNode.parent.hpkePublicKey,\n parentHash: parentNode.parent.parentHash,\n originalSiblingTreeHash,\n };\n return [await h.digest(encode(parentHashInputEncoder, input)), parentNodeIndex];\n}\n//# sourceMappingURL=parentHash.js.map","import { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { varLenDataEncoder, varLenDataDecoder } from \"./codec/variableLength.js\";\nexport const hpkeCiphertextEncoder = contramapBufferEncoders([varLenDataEncoder, varLenDataEncoder], (egs) => [egs.kemOutput, egs.ciphertext]);\nexport const hpkeCiphertextDecoder = mapDecoders([varLenDataDecoder, varLenDataDecoder], (kemOutput, ciphertext) => ({ kemOutput, ciphertext }));\n//# sourceMappingURL=hpkeCiphertext.js.map","import { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenTypeDecoder, varLenDataEncoder, varLenTypeEncoder } from \"./codec/variableLength.js\";\nimport { encryptWithLabel } from \"./crypto/hpke.js\";\nimport { deriveSecret } from \"./crypto/kdf.js\";\nimport { groupContextEncoder } from \"./groupContext.js\";\nimport { leafNodeCommitDecoder, leafNodeEncoder, signLeafNodeCommit, } from \"./leafNode.js\";\nimport { leafNodeSources } from \"./leafNodeSource.js\";\nimport { calculateParentHash } from \"./parentHash.js\";\nimport { filteredDirectPath, filteredDirectPathAndCopathResolution, getHpkePublicKey, } from \"./ratchetTree.js\";\nimport { nodeTypes } from \"./nodeType.js\";\nimport { treeHashRoot } from \"./treeHash.js\";\nimport { isAncestor, leafToNodeIndex, toNodeIndex } from \"./treemath.js\";\nimport { constantTimeEqual } from \"./util/constantTimeCompare.js\";\nimport { hpkeCiphertextDecoder, hpkeCiphertextEncoder } from \"./hpkeCiphertext.js\";\nimport { InternalError, ValidationError } from \"./mlsError.js\";\nexport const updatePathNodeEncoder = contramapBufferEncoders([varLenDataEncoder, varLenTypeEncoder(hpkeCiphertextEncoder)], (node) => [node.hpkePublicKey, node.encryptedPathSecret]);\nexport const updatePathNodeDecoder = mapDecoders([varLenDataDecoder, varLenTypeDecoder(hpkeCiphertextDecoder)], (hpkePublicKey, encryptedPathSecret) => ({ hpkePublicKey, encryptedPathSecret }));\nexport const updatePathEncoder = contramapBufferEncoders([leafNodeEncoder, varLenTypeEncoder(updatePathNodeEncoder)], (path) => [path.leafNode, path.nodes]);\nexport const updatePathDecoder = mapDecoders([leafNodeCommitDecoder, varLenTypeDecoder(updatePathNodeDecoder)], (leafNode, nodes) => ({ leafNode, nodes }));\nexport async function createUpdatePath(originalTree, mutableTree, senderLeafIndex, groupContext, signaturePrivateKey, cs) {\n const originalLeafNode = mutableTree[leafToNodeIndex(senderLeafIndex)];\n if (originalLeafNode === undefined || originalLeafNode.nodeType === nodeTypes.parent)\n throw new InternalError(\"Expected non-blank leaf node\");\n const pathSecret = cs.rng.randomBytes(cs.kdf.size);\n const leafNodeSecret = await deriveSecret(pathSecret, \"node\", cs.kdf);\n const leafKeypair = await cs.hpke.deriveKeyPair(leafNodeSecret);\n const fdp = filteredDirectPathAndCopathResolution(senderLeafIndex, mutableTree);\n const ps = await applyInitialTreeUpdate(fdp, pathSecret, senderLeafIndex, mutableTree, cs);\n await insertParentHashes(fdp, mutableTree, cs);\n const leafParentHash = await calculateParentHash(mutableTree, leafToNodeIndex(senderLeafIndex), cs.hash);\n const updatedLeafNodeTbs = {\n leafNodeSource: leafNodeSources.commit,\n hpkePublicKey: await cs.hpke.exportPublicKey(leafKeypair.publicKey),\n extensions: originalLeafNode.leaf.extensions,\n capabilities: originalLeafNode.leaf.capabilities,\n credential: originalLeafNode.leaf.credential,\n signaturePublicKey: originalLeafNode.leaf.signaturePublicKey,\n parentHash: leafParentHash[0],\n groupId: groupContext.groupId,\n leafIndex: senderLeafIndex,\n };\n const updatedLeafNode = await signLeafNodeCommit(updatedLeafNodeTbs, signaturePrivateKey, cs.signature);\n mutableTree[leafToNodeIndex(senderLeafIndex)] = {\n nodeType: nodeTypes.leaf,\n leaf: updatedLeafNode,\n };\n const updatedTreeHash = await treeHashRoot(mutableTree, cs.hash);\n const updatedGroupContext = {\n ...groupContext,\n treeHash: updatedTreeHash,\n epoch: groupContext.epoch + 1n,\n };\n // we have to remove the leaf secret since we don't send it to anyone\n const pathSecrets = ps.slice(0, ps.length - 1).reverse();\n // we have to pass the old tree here since the receiver won't have the updated public keys yet\n const updatePathNodes = await Promise.all(pathSecrets.map(encryptSecretsForPath(originalTree, mutableTree, updatedGroupContext, cs)));\n const updatePath = { leafNode: updatedLeafNode, nodes: updatePathNodes };\n return [mutableTree, updatePath, pathSecrets, leafKeypair.privateKey];\n}\nfunction encryptSecretsForPath(originalTree, updatedTree, updatedGroupContext, cs) {\n return async (pathSecret) => {\n const key = getHpkePublicKey(updatedTree[pathSecret.nodeIndex]);\n const res = {\n hpkePublicKey: key,\n encryptedPathSecret: await Promise.all(pathSecret.sendTo.map(async (nodeIndex) => {\n const { ct, enc } = await encryptWithLabel(await cs.hpke.importPublicKey(getHpkePublicKey(originalTree[nodeIndex])), \"UpdatePathNode\", encode(groupContextEncoder, updatedGroupContext), pathSecret.secret, cs.hpke);\n return { ciphertext: ct, kemOutput: enc };\n })),\n };\n return res;\n };\n}\nasync function insertParentHashes(fdp, mutableTree, cs) {\n for (let x = fdp.length - 1; x >= 0; x--) {\n const { nodeIndex } = fdp[x];\n const parentHash = await calculateParentHash(mutableTree, nodeIndex, cs.hash);\n const currentNode = mutableTree[nodeIndex];\n if (currentNode === undefined || currentNode.nodeType === nodeTypes.leaf)\n throw new InternalError(\"Expected non-blank parent node\");\n const updatedNode = {\n nodeType: nodeTypes.parent,\n parent: { ...currentNode.parent, parentHash: parentHash[0] },\n };\n mutableTree[nodeIndex] = updatedNode;\n }\n}\n/**\n * Inserts new public keys from a single secret in the update path and returns the resulting tree along with the secrets along the path\n * Note that the path secrets are returned root to leaf\n */\nasync function applyInitialTreeUpdate(fdp, pathSecret, senderLeafIndex, mutableTree, cs) {\n let lastPathSecret = { secret: pathSecret, nodeIndex: leafToNodeIndex(senderLeafIndex), sendTo: new Array() };\n const pathSecrets = new Array(lastPathSecret);\n for (const [_i, { nodeIndex, resolution }] of fdp.entries()) {\n const nextPathSecret = await deriveSecret(lastPathSecret.secret, \"path\", cs.kdf);\n const nextNodeSecret = await deriveSecret(nextPathSecret, \"node\", cs.kdf);\n const { publicKey } = await cs.hpke.deriveKeyPair(nextNodeSecret);\n mutableTree[nodeIndex] = {\n nodeType: nodeTypes.parent,\n parent: {\n hpkePublicKey: await cs.hpke.exportPublicKey(publicKey),\n parentHash: new Uint8Array(),\n unmergedLeaves: [],\n },\n };\n lastPathSecret = { nodeIndex: toNodeIndex(nodeIndex), secret: nextPathSecret, sendTo: resolution };\n pathSecrets.unshift(lastPathSecret);\n }\n return pathSecrets;\n}\nexport async function applyUpdatePath(mutableTree, senderLeafIndex, path, h, isExternal = false) {\n // if this is an external commit, the leaf node did not exist prior\n if (!isExternal) {\n const leafToUpdate = mutableTree[leafToNodeIndex(senderLeafIndex)];\n if (leafToUpdate === undefined || leafToUpdate.nodeType === nodeTypes.parent)\n throw new InternalError(\"Leaf node not defined or is parent\");\n const leafNodePublicKeyNotNew = constantTimeEqual(leafToUpdate.leaf.hpkePublicKey, path.leafNode.hpkePublicKey);\n if (leafNodePublicKeyNotNew)\n throw new ValidationError(\"Public key in the LeafNode is the same as the committer's current leaf node\");\n }\n const pathNodePublicKeysExistInTree = path.nodes.some((node) => mutableTree.some((treeNode) => {\n return treeNode?.nodeType === nodeTypes.parent\n ? constantTimeEqual(treeNode.parent.hpkePublicKey, node.hpkePublicKey)\n : false;\n }));\n if (pathNodePublicKeysExistInTree)\n throw new ValidationError(\"Public keys in the UpdatePath may not appear in a node of the new ratchet tree\");\n const reverseFilteredDirectPath = filteredDirectPath(senderLeafIndex, mutableTree).reverse();\n mutableTree[leafToNodeIndex(senderLeafIndex)] = { nodeType: nodeTypes.leaf, leaf: path.leafNode };\n // need to call .slice here so as not to mutate the original\n const reverseUpdatePath = path.nodes.slice().reverse();\n if (reverseUpdatePath.length !== reverseFilteredDirectPath.length) {\n throw new ValidationError(\"Invalid length of UpdatePath\");\n }\n for (const [level, nodeIndex] of reverseFilteredDirectPath.entries()) {\n const parentHash = await calculateParentHash(mutableTree, nodeIndex, h);\n mutableTree[nodeIndex] = {\n nodeType: nodeTypes.parent,\n parent: { hpkePublicKey: reverseUpdatePath[level].hpkePublicKey, unmergedLeaves: [], parentHash: parentHash[0] },\n };\n }\n const leafParentHash = await calculateParentHash(mutableTree, leafToNodeIndex(senderLeafIndex), h);\n if (!constantTimeEqual(leafParentHash[0], path.leafNode.parentHash))\n throw new ValidationError(\"Parent hash did not match the UpdatePath\");\n}\nexport function firstCommonAncestor(tree, leafIndex, senderLeafIndex) {\n const fdp = filteredDirectPathAndCopathResolution(senderLeafIndex, tree);\n for (const { nodeIndex } of fdp) {\n if (isAncestor(leafToNodeIndex(leafIndex), nodeIndex, tree.length)) {\n return nodeIndex;\n }\n }\n throw new ValidationError(\"Could not find common ancestor\");\n}\nexport function firstMatchAncestor(tree, leafIndex, senderLeafIndex, path) {\n const fdp = filteredDirectPathAndCopathResolution(senderLeafIndex, tree);\n for (const [n, { nodeIndex, resolution }] of fdp.entries()) {\n if (isAncestor(leafToNodeIndex(leafIndex), nodeIndex, tree.length)) {\n return { nodeIndex, resolution, updateNode: path.nodes[n] };\n }\n }\n throw new ValidationError(\"Could not find common ancestor\");\n}\n//# sourceMappingURL=updatePath.js.map","import { optionalDecoder, optionalEncoder } from \"./codec/optional.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { varLenTypeDecoder, varLenTypeEncoder } from \"./codec/variableLength.js\";\nimport { proposalOrRefDecoder, proposalOrRefEncoder } from \"./proposalOrRefType.js\";\nimport { updatePathDecoder, updatePathEncoder } from \"./updatePath.js\";\nexport const commitEncoder = contramapBufferEncoders([varLenTypeEncoder(proposalOrRefEncoder), optionalEncoder(updatePathEncoder)], (commit) => [commit.proposals, commit.path]);\nexport const commitDecoder = mapDecoders([varLenTypeDecoder(proposalOrRefDecoder), optionalDecoder(updatePathDecoder)], (proposals, path) => ({ proposals, path }));\n//# sourceMappingURL=commit.js.map","import { uint8Decoder, uint8Encoder } from \"./codec/number.js\";\nimport { mapDecoderOption } from \"./codec/tlsDecoder.js\";\nimport { numberToEnum } from \"./util/enumHelpers.js\";\n/** @public */\nexport const contentTypes = {\n application: 1,\n proposal: 2,\n commit: 3,\n};\nexport const contentTypeEncoder = uint8Encoder;\nexport const contentTypeDecoder = mapDecoderOption(uint8Decoder, numberToEnum(contentTypes));\n//# sourceMappingURL=contentType.js.map","import { uint16Decoder, uint16Encoder } from \"./codec/number.js\";\nimport { mapDecoderOption } from \"./codec/tlsDecoder.js\";\nimport { numberToEnum } from \"./util/enumHelpers.js\";\n/** @public */\nexport const wireformats = {\n mls_public_message: 1,\n mls_private_message: 2,\n mls_welcome: 3,\n mls_group_info: 4,\n mls_key_package: 5,\n};\nexport const wireformatEncoder = uint16Encoder;\nexport const wireformatDecoder = mapDecoderOption(uint16Decoder, numberToEnum(wireformats));\n//# sourceMappingURL=wireformat.js.map","import { uint32Decoder, uint64Decoder, uint8Decoder, uint32Encoder, uint64Encoder, uint8Encoder, } from \"./codec/number.js\";\nimport { flatMapDecoder, mapDecoder, mapDecoderOption, mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenDataEncoder } from \"./codec/variableLength.js\";\nimport { contentTypeEncoder, contentTypeDecoder } from \"./contentType.js\";\nimport { expandWithLabel } from \"./crypto/kdf.js\";\nimport { numberToEnum } from \"./util/enumHelpers.js\";\n/** @public */\nexport const senderTypes = {\n member: 1,\n external: 2,\n new_member_proposal: 3,\n new_member_commit: 4,\n};\nexport const senderTypeEncoder = uint8Encoder;\nexport const senderTypeDecoder = mapDecoderOption(uint8Decoder, numberToEnum(senderTypes));\nexport const senderEncoder = (s) => {\n switch (s.senderType) {\n case senderTypes.member:\n return contramapBufferEncoders([senderTypeEncoder, uint32Encoder], (s) => [s.senderType, s.leafIndex])(s);\n case senderTypes.external:\n return contramapBufferEncoders([senderTypeEncoder, uint32Encoder], (s) => [s.senderType, s.senderIndex])(s);\n case senderTypes.new_member_proposal:\n case senderTypes.new_member_commit:\n return senderTypeEncoder(s.senderType);\n }\n};\nexport const senderDecoder = flatMapDecoder(senderTypeDecoder, (senderType) => {\n switch (senderType) {\n case senderTypes.member:\n return mapDecoder(uint32Decoder, (leafIndex) => ({\n senderType,\n leafIndex,\n }));\n case senderTypes.external:\n return mapDecoder(uint32Decoder, (senderIndex) => ({\n senderType,\n senderIndex,\n }));\n case senderTypes.new_member_proposal:\n return mapDecoder(() => [undefined, 0], () => ({\n senderType,\n }));\n case senderTypes.new_member_commit:\n return mapDecoder(() => [undefined, 0], () => ({\n senderType,\n }));\n }\n});\nexport function getSenderLeafNodeIndex(sender) {\n return sender.senderType === senderTypes.member ? sender.leafIndex : undefined;\n}\nexport const reuseGuardEncoder = (g) => [\n 4,\n (offset, buffer) => {\n const view = new Uint8Array(buffer, offset, 4);\n view.set(g, 0);\n },\n];\nexport const reuseGuardDecoder = (b, offset) => {\n return [b.subarray(offset, offset + 4), 4];\n};\nexport const senderDataEncoder = contramapBufferEncoders([uint32Encoder, uint32Encoder, reuseGuardEncoder], (s) => [s.leafIndex, s.generation, s.reuseGuard]);\nexport const senderDataDecoder = mapDecoders([uint32Decoder, uint32Decoder, reuseGuardDecoder], (leafIndex, generation, reuseGuard) => ({\n leafIndex,\n generation,\n reuseGuard,\n}));\nexport const senderDataAADEncoder = contramapBufferEncoders([varLenDataEncoder, uint64Encoder, contentTypeEncoder], (aad) => [aad.groupId, aad.epoch, aad.contentType]);\nexport const senderDataAADDecoder = mapDecoders([varLenDataDecoder, uint64Decoder, contentTypeDecoder], (groupId, epoch, contentType) => ({\n groupId,\n epoch,\n contentType,\n}));\nfunction sampleCiphertext(cs, ciphertext) {\n return ciphertext.length < cs.kdf.size ? ciphertext : ciphertext.subarray(0, cs.kdf.size);\n}\nexport async function expandSenderDataKey(cs, senderDataSecret, ciphertext) {\n const ciphertextSample = sampleCiphertext(cs, ciphertext);\n const keyLength = cs.hpke.keyLength;\n return await expandWithLabel(senderDataSecret, \"key\", ciphertextSample, keyLength, cs.kdf);\n}\nexport async function expandSenderDataNonce(cs, senderDataSecret, ciphertext) {\n const ciphertextSample = sampleCiphertext(cs, ciphertext);\n const keyLength = cs.hpke.nonceLength;\n return await expandWithLabel(senderDataSecret, \"nonce\", ciphertextSample, keyLength, cs.kdf);\n}\n//# sourceMappingURL=sender.js.map","import { uint64Decoder, uint64Encoder } from \"./codec/number.js\";\nimport { flatMapDecoder, mapDecoder, mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoder, contramapBufferEncoders, encode, encVoid } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenDataEncoder } from \"./codec/variableLength.js\";\nimport { commitDecoder, commitEncoder } from \"./commit.js\";\nimport { contentTypes, contentTypeEncoder, contentTypeDecoder } from \"./contentType.js\";\nimport { signWithLabel, verifyWithLabel } from \"./crypto/signature.js\";\nimport { groupContextEncoder } from \"./groupContext.js\";\nimport { wireformatEncoder, wireformats } from \"./wireformat.js\";\nimport { proposalDecoder, proposalEncoder } from \"./proposal.js\";\nimport { protocolVersionEncoder } from \"./protocolVersion.js\";\nimport { senderDecoder, senderEncoder } from \"./sender.js\";\nimport { senderTypes } from \"./sender.js\";\nconst framedContentApplicationDataEncoder = contramapBufferEncoders([contentTypeEncoder, varLenDataEncoder], (f) => [f.contentType, f.applicationData]);\nconst framedContentProposalDataEncoder = contramapBufferEncoders([contentTypeEncoder, proposalEncoder], (f) => [f.contentType, f.proposal]);\nconst framedContentCommitDataEncoder = contramapBufferEncoders([contentTypeEncoder, commitEncoder], (f) => [f.contentType, f.commit]);\nconst framedContentInfoEncoder = (fc) => {\n switch (fc.contentType) {\n case contentTypes.application:\n return framedContentApplicationDataEncoder(fc);\n case contentTypes.proposal:\n return framedContentProposalDataEncoder(fc);\n case contentTypes.commit:\n return framedContentCommitDataEncoder(fc);\n }\n};\nconst framedContentApplicationDataDecoder = mapDecoder(varLenDataDecoder, (applicationData) => ({ contentType: contentTypes.application, applicationData }));\nconst framedContentProposalDataDecoder = mapDecoder(proposalDecoder, (proposal) => ({ contentType: contentTypes.proposal, proposal }));\nconst framedContentCommitDataDecoder = mapDecoder(commitDecoder, (commit) => ({\n contentType: contentTypes.commit,\n commit,\n}));\nconst framedContentInfoDecoder = flatMapDecoder(contentTypeDecoder, (contentType) => {\n switch (contentType) {\n case contentTypes.application:\n return framedContentApplicationDataDecoder;\n case contentTypes.proposal:\n return framedContentProposalDataDecoder;\n case contentTypes.commit:\n return framedContentCommitDataDecoder;\n }\n});\nexport function toTbs(content, wireformat, context) {\n return { protocolVersion: context.version, wireformat, content, senderType: content.sender.senderType, context };\n}\nexport const framedContentEncoder = contramapBufferEncoders([varLenDataEncoder, uint64Encoder, senderEncoder, varLenDataEncoder, framedContentInfoEncoder], (fc) => [fc.groupId, fc.epoch, fc.sender, fc.authenticatedData, fc]);\nexport const framedContentDecoder = mapDecoders([varLenDataDecoder, uint64Decoder, senderDecoder, varLenDataDecoder, framedContentInfoDecoder], (groupId, epoch, sender, authenticatedData, info) => ({\n groupId,\n epoch,\n sender,\n authenticatedData,\n ...info,\n}));\nconst senderInfoEncoder = (info) => {\n switch (info.senderType) {\n case senderTypes.member:\n case senderTypes.new_member_commit:\n return groupContextEncoder(info.context);\n case senderTypes.external:\n case senderTypes.new_member_proposal:\n return encVoid;\n }\n};\nexport const framedContentTBSEncoder = contramapBufferEncoders([protocolVersionEncoder, wireformatEncoder, framedContentEncoder, senderInfoEncoder], (f) => [f.protocolVersion, f.wireformat, f.content, f]);\nconst encodeFramedContentAuthDataContent = (authData) => {\n switch (authData.contentType) {\n case contentTypes.commit:\n return encodeFramedContentAuthDataCommit(authData);\n case contentTypes.application:\n case contentTypes.proposal:\n return encVoid;\n }\n};\nconst encodeFramedContentAuthDataCommit = contramapBufferEncoder(varLenDataEncoder, (data) => data.confirmationTag);\nexport const framedContentAuthDataEncoder = contramapBufferEncoders([varLenDataEncoder, encodeFramedContentAuthDataContent], (d) => [d.signature, d]);\nexport const framedContentAuthDataCommitDecoder = mapDecoder(varLenDataDecoder, (confirmationTag) => ({\n contentType: contentTypes.commit,\n confirmationTag,\n}));\nexport function framedContentAuthDataDecoder(contentType) {\n switch (contentType) {\n case contentTypes.commit:\n return mapDecoders([varLenDataDecoder, framedContentAuthDataCommitDecoder], (signature, commitData) => ({\n signature,\n ...commitData,\n }));\n case contentTypes.application:\n case contentTypes.proposal:\n return mapDecoder(varLenDataDecoder, (signature) => ({\n signature,\n contentType,\n }));\n }\n}\nexport async function verifyFramedContentSignature(signKey, wireformat, content, auth, context, s) {\n return verifyWithLabel(signKey, \"FramedContentTBS\", encode(framedContentTBSEncoder, toTbs(content, wireformat, context)), auth.signature, s);\n}\nfunction signFramedContentTBS(signKey, tbs, s) {\n return signWithLabel(signKey, \"FramedContentTBS\", encode(framedContentTBSEncoder, tbs), s);\n}\nexport async function signFramedContentApplicationOrProposal(signKey, tbs, cs) {\n const signature = await signFramedContentTBS(signKey, tbs, cs.signature);\n return {\n contentType: tbs.content.contentType,\n signature,\n };\n}\nexport function createConfirmationTag(confirmationKey, confirmedTranscriptHash, h) {\n return h.mac(confirmationKey, confirmedTranscriptHash);\n}\nexport function verifyConfirmationTag(confirmationKey, tag, confirmedTranscriptHash, h) {\n return h.verifyMac(confirmationKey, tag, confirmedTranscriptHash);\n}\nexport async function createContentCommitSignature(groupContext, wireformat, c, sender, authenticatedData, signKey, s) {\n const tbs = {\n protocolVersion: groupContext.version,\n wireformat: wireformats[wireformat],\n content: {\n contentType: contentTypes.commit,\n commit: c,\n groupId: groupContext.groupId,\n epoch: groupContext.epoch,\n sender,\n authenticatedData,\n },\n senderType: sender.senderType,\n context: groupContext,\n };\n const signature = await signFramedContentTBS(signKey, tbs, s);\n return { framedContent: tbs.content, signature };\n}\n//# sourceMappingURL=framedContent.js.map","import { flatMapDecoder, mapDecoder, mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { refhash } from \"./crypto/hash.js\";\nimport { framedContentDecoder, framedContentAuthDataDecoder, framedContentEncoder, framedContentAuthDataEncoder, framedContentTBSEncoder, } from \"./framedContent.js\";\nimport { wireformatDecoder, wireformatEncoder } from \"./wireformat.js\";\nexport const authenticatedContentEncoder = contramapBufferEncoders([wireformatEncoder, framedContentEncoder, framedContentAuthDataEncoder], (a) => [a.wireformat, a.content, a.auth]);\nexport const authenticatedContentDecoder = mapDecoders([\n wireformatDecoder,\n flatMapDecoder(framedContentDecoder, (content) => {\n return mapDecoder(framedContentAuthDataDecoder(content.contentType), (auth) => ({ content, auth }));\n }),\n], (wireformat, contentAuth) => ({\n wireformat,\n ...contentAuth,\n}));\nconst authenticatedContentTBMEncoder = contramapBufferEncoders([framedContentTBSEncoder, framedContentAuthDataEncoder], (t) => [t.contentTbs, t.auth]);\nexport function createMembershipTag(membershipKey, tbm, h) {\n return h.mac(membershipKey, encode(authenticatedContentTBMEncoder, tbm));\n}\nexport function verifyMembershipTag(membershipKey, tbm, tag, h) {\n return h.verifyMac(membershipKey, tag, encode(authenticatedContentTBMEncoder, tbm));\n}\nexport function makeProposalRef(proposal, h) {\n return refhash(\"MLS 1.0 Proposal Reference\", encode(authenticatedContentEncoder, proposal), h);\n}\n//# sourceMappingURL=authenticatedContent.js.map","import { uint32Decoder, uint32Encoder } from \"./codec/number.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenTypeDecoder, varLenDataEncoder, varLenTypeEncoder } from \"./codec/variableLength.js\";\nimport { deriveSecret } from \"./crypto/kdf.js\";\nimport { signWithLabel, verifyWithLabel } from \"./crypto/signature.js\";\nimport { extensionEncoder, groupInfoExtensionDecoder } from \"./extension.js\";\nimport { groupContextDecoder, groupContextEncoder, extractEpochSecret } from \"./groupContext.js\";\nimport { ratchetTreeDecoder } from \"./ratchetTree.js\";\nimport { defaultExtensionTypes } from \"./defaultExtensionType.js\";\nimport { CodecError } from \"./mlsError.js\";\nexport const groupInfoTBSEncoder = contramapBufferEncoders([groupContextEncoder, varLenTypeEncoder(extensionEncoder), varLenDataEncoder, uint32Encoder], (g) => [g.groupContext, g.extensions, g.confirmationTag, g.signer]);\nexport const groupInfoTBSDecoder = mapDecoders([groupContextDecoder, varLenTypeDecoder(groupInfoExtensionDecoder), varLenDataDecoder, uint32Decoder], (groupContext, extensions, confirmationTag, signer) => ({\n groupContext,\n extensions,\n confirmationTag,\n signer,\n}));\nexport const groupInfoEncoder = contramapBufferEncoders([groupInfoTBSEncoder, varLenDataEncoder], (g) => [g, g.signature]);\nexport const groupInfoDecoder = mapDecoders([groupInfoTBSDecoder, varLenDataDecoder], (tbs, signature) => ({\n ...tbs,\n signature,\n}));\nexport function ratchetTreeFromExtension(info) {\n const treeExtension = info.extensions.find((ex) => ex.extensionType === defaultExtensionTypes.ratchet_tree);\n if (treeExtension !== undefined) {\n const tree = ratchetTreeDecoder(treeExtension.extensionData, 0);\n if (tree === undefined)\n throw new CodecError(\"Could not decode RatchetTree\");\n return tree[0];\n }\n}\nexport async function signGroupInfo(tbs, privateKey, s) {\n const signature = await signWithLabel(privateKey, \"GroupInfoTBS\", encode(groupInfoTBSEncoder, tbs), s);\n return { ...tbs, signature };\n}\nexport function verifyGroupInfoSignature(gi, publicKey, s) {\n return verifyWithLabel(publicKey, \"GroupInfoTBS\", encode(groupInfoTBSEncoder, gi), gi.signature, s);\n}\nexport async function verifyGroupInfoConfirmationTag(gi, joinerSecret, pskSecret, cs) {\n const epochSecret = await extractEpochSecret(gi.groupContext, joinerSecret, cs.kdf, pskSecret);\n const key = await deriveSecret(epochSecret, \"confirm\", cs.kdf);\n return cs.hash.verifyMac(key, gi.confirmationTag, gi.groupContext.confirmedTranscriptHash);\n}\nexport async function extractWelcomeSecret(joinerSecret, pskSecret, kdf) {\n return deriveSecret(await kdf.extract(joinerSecret, pskSecret), \"welcome\", kdf);\n}\n//# sourceMappingURL=groupInfo.js.map","import { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenDataEncoder } from \"./codec/variableLength.js\";\nimport { deriveSecret, expandWithLabel } from \"./crypto/kdf.js\";\nimport { extractEpochSecret, extractJoinerSecret } from \"./groupContext.js\";\nimport { extractWelcomeSecret } from \"./groupInfo.js\";\nexport const keyScheduleEncoder = contramapBufferEncoders([\n varLenDataEncoder,\n varLenDataEncoder,\n varLenDataEncoder,\n varLenDataEncoder,\n varLenDataEncoder,\n varLenDataEncoder,\n varLenDataEncoder,\n varLenDataEncoder,\n], (ks) => [\n ks.senderDataSecret,\n ks.exporterSecret,\n ks.externalSecret,\n ks.confirmationKey,\n ks.membershipKey,\n ks.resumptionPsk,\n ks.epochAuthenticator,\n ks.initSecret,\n]);\nexport const keyScheduleDecoder = mapDecoders([\n varLenDataDecoder,\n varLenDataDecoder,\n varLenDataDecoder,\n varLenDataDecoder,\n varLenDataDecoder,\n varLenDataDecoder,\n varLenDataDecoder,\n varLenDataDecoder,\n], (senderDataSecret, exporterSecret, externalSecret, confirmationKey, membershipKey, resumptionPsk, epochAuthenticator, initSecret) => ({\n senderDataSecret,\n exporterSecret,\n externalSecret,\n confirmationKey,\n membershipKey,\n resumptionPsk,\n epochAuthenticator,\n initSecret,\n}));\n/** @public */\nexport async function mlsExporter(exporterSecret, label, context, length, cs) {\n const secret = await deriveSecret(exporterSecret, label, cs.kdf);\n const hash = await cs.hash.digest(context);\n return expandWithLabel(secret, \"exported\", hash, length, cs.kdf);\n}\nexport async function deriveKeySchedule(joinerSecret, pskSecret, groupContext, kdf) {\n const epochSecret = await extractEpochSecret(groupContext, joinerSecret, kdf, pskSecret);\n const encryptionSecret = await deriveSecret(epochSecret, \"encryption\", kdf);\n const keySchedule = await initializeKeySchedule(epochSecret, kdf);\n return [keySchedule, encryptionSecret];\n}\nexport async function initializeKeySchedule(epochSecret, kdf) {\n const newInitSecret = await deriveSecret(epochSecret, \"init\", kdf);\n const senderDataSecret = await deriveSecret(epochSecret, \"sender data\", kdf);\n const exporterSecret = await deriveSecret(epochSecret, \"exporter\", kdf);\n const externalSecret = await deriveSecret(epochSecret, \"external\", kdf);\n const confirmationKey = await deriveSecret(epochSecret, \"confirm\", kdf);\n const membershipKey = await deriveSecret(epochSecret, \"membership\", kdf);\n const resumptionPsk = await deriveSecret(epochSecret, \"resumption\", kdf);\n const epochAuthenticator = await deriveSecret(epochSecret, \"authentication\", kdf);\n const newKeySchedule = {\n initSecret: newInitSecret,\n senderDataSecret,\n exporterSecret,\n externalSecret,\n confirmationKey,\n membershipKey,\n resumptionPsk,\n epochAuthenticator,\n };\n return newKeySchedule;\n}\nexport async function initializeEpoch(initSecret, commitSecret, groupContext, pskSecret, kdf) {\n const joinerSecret = await extractJoinerSecret(groupContext, initSecret, commitSecret, kdf);\n const welcomeSecret = await extractWelcomeSecret(joinerSecret, pskSecret, kdf);\n const [newKeySchedule, encryptionSecret] = await deriveKeySchedule(joinerSecret, pskSecret, groupContext, kdf);\n return { welcomeSecret, joinerSecret, encryptionSecret, keySchedule: newKeySchedule };\n}\n//# sourceMappingURL=keySchedule.js.map","import { uint32Decoder, uint32Encoder } from \"./codec/number.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { numberRecordDecoder, varLenDataDecoder, numberRecordEncoder, varLenDataEncoder, } from \"./codec/variableLength.js\";\nimport { contentTypes } from \"./contentType.js\";\nimport { expandWithLabel, deriveTreeSecret } from \"./crypto/kdf.js\";\nimport { InternalError, ValidationError } from \"./mlsError.js\";\nimport { root, right, left, toLeafIndex, leafToNodeIndex, parent } from \"./treemath.js\";\nconst generationSecretEncoder = contramapBufferEncoders([varLenDataEncoder, uint32Encoder, numberRecordEncoder(uint32Encoder, varLenDataEncoder)], (gs) => [gs.secret, gs.generation, gs.unusedGenerations]);\nconst generationSecretDecoder = mapDecoders([varLenDataDecoder, uint32Decoder, numberRecordDecoder(uint32Decoder, varLenDataDecoder)], (secret, generation, unusedGenerations) => ({\n secret,\n generation,\n unusedGenerations,\n}));\nconst secretTreeNodeEncoder = contramapBufferEncoders([generationSecretEncoder, generationSecretEncoder], (node) => [node.handshake, node.application]);\nconst secretTreeNodeDecoder = mapDecoders([generationSecretDecoder, generationSecretDecoder], (handshake, application) => ({\n handshake,\n application,\n}));\nexport const secretTreeEncoder = contramapBufferEncoders([\n uint32Encoder,\n numberRecordEncoder(uint32Encoder, varLenDataEncoder),\n numberRecordEncoder(uint32Encoder, secretTreeNodeEncoder),\n], (st) => [st.leafWidth, st.intermediateNodes, st.leafNodes]);\nexport const secretTreeDecoder = mapDecoders([\n uint32Decoder,\n numberRecordDecoder(uint32Decoder, varLenDataDecoder),\n numberRecordDecoder(uint32Decoder, secretTreeNodeDecoder),\n], (leafWidth, intermediateNodes, leafNodes) => ({ leafWidth, intermediateNodes, leafNodes }));\nexport function allSecretTreeValues(tree) {\n const arr = new Array(tree.leafWidth * 2);\n for (const node of Object.values(tree.leafNodes)) {\n arr.push(node.application.secret);\n arr.push(node.handshake.secret);\n for (const gen of Object.values(node.application.unusedGenerations)) {\n arr.push(gen);\n }\n for (const gen of Object.values(node.handshake.unusedGenerations)) {\n arr.push(gen);\n }\n }\n for (const node of Object.values(tree.intermediateNodes)) {\n arr.push(node);\n }\n return arr;\n}\nasync function deriveLeafSecret(leafIndex, secretTree, kdf) {\n const targetNodeIndex = leafToNodeIndex(leafIndex);\n const rootIndex = root(secretTree.leafWidth);\n const updatedIntermediateNodes = { ...secretTree.intermediateNodes };\n const consumed = new Array();\n // iterate from target leaf up to root\n const pathFromLeaf = [];\n let current = targetNodeIndex;\n while (current !== rootIndex) {\n pathFromLeaf.push(current);\n current = parent(current, secretTree.leafWidth);\n }\n pathFromLeaf.push(rootIndex);\n // find the first existing node in the path\n let startIndex = pathFromLeaf.length - 1;\n while (startIndex >= 0 && updatedIntermediateNodes[pathFromLeaf[startIndex]] === undefined) {\n startIndex--;\n }\n if (startIndex < 0) {\n throw new InternalError(\"No intermediate nodes found in path from leaf to root\");\n }\n // derive down from the found node to the target\n current = pathFromLeaf[startIndex];\n while (current !== targetNodeIndex) {\n const l = left(current);\n const r = right(current);\n const nextNodeIndex = targetNodeIndex < current ? l : r;\n // we have to derive both children so we can delete the consumed secret\n const currentSecret = updatedIntermediateNodes[current];\n const leftSecret = await expandWithLabel(currentSecret, \"tree\", new TextEncoder().encode(\"left\"), kdf.size, kdf);\n const rightSecret = await expandWithLabel(currentSecret, \"tree\", new TextEncoder().encode(\"right\"), kdf.size, kdf);\n updatedIntermediateNodes[l] = leftSecret;\n updatedIntermediateNodes[r] = rightSecret;\n consumed.push(currentSecret);\n delete updatedIntermediateNodes[current];\n current = nextNodeIndex;\n }\n return { secret: updatedIntermediateNodes[targetNodeIndex], updatedIntermediateNodes, consumed };\n}\nexport function createSecretTree(leafWidth, encryptionSecret) {\n const rootIndex = root(leafWidth);\n return {\n leafWidth,\n intermediateNodes: {\n [rootIndex]: encryptionSecret,\n },\n leafNodes: {},\n };\n}\nasync function deriveNonce(secret, generation, cs) {\n return await deriveTreeSecret(secret, \"nonce\", generation, cs.hpke.nonceLength, cs.kdf);\n}\nasync function deriveKey(secret, generation, cs) {\n return await deriveTreeSecret(secret, \"key\", generation, cs.hpke.keyLength, cs.kdf);\n}\nasync function ratchetUntil(current, desiredGen, config, kdf) {\n const generationDifference = desiredGen - current.generation;\n if (generationDifference > config.maximumForwardRatchetSteps)\n throw new ValidationError(\"Desired generation too far in the future\");\n const consumed = [];\n let result = { ...current };\n for (let i = 0; i < generationDifference; i++) {\n const nextSecret = await deriveTreeSecret(result.secret, \"secret\", result.generation, kdf.size, kdf);\n const [updated, old] = updateUnusedGenerations(result, config.retainKeysForGenerations);\n consumed.push(...old);\n result = {\n secret: nextSecret,\n generation: result.generation + 1,\n unusedGenerations: updated,\n };\n }\n return [result, consumed];\n}\nfunction updateUnusedGenerations(s, retainGenerationsMax) {\n const withNew = { ...s.unusedGenerations, [s.generation]: s.secret };\n const generations = Object.keys(withNew);\n const result = generations.length >= retainGenerationsMax ? removeOldGenerations(withNew, retainGenerationsMax) : [withNew, []];\n return result;\n}\nfunction removeOldGenerations(unusedGenerations, max) {\n const generations = Object.keys(unusedGenerations)\n .map(Number)\n .sort((a, b) => a - b);\n const cutoff = generations.length - max;\n const consumed = new Array();\n const record = {};\n for (const [n, gen] of generations.entries()) {\n const value = unusedGenerations[gen];\n if (n < cutoff) {\n consumed.push(value);\n }\n else {\n record[gen] = value;\n }\n }\n return [record, consumed];\n}\nasync function derivePrivateMessageNonce(secret, generation, reuseGuard, cs) {\n const nonce = await deriveNonce(secret, generation, cs);\n if (nonce.length >= 4 && reuseGuard.length >= 4) {\n for (let i = 0; i < 4; i++) {\n nonce[i] ^= reuseGuard[i];\n }\n }\n else\n throw new ValidationError(\"Reuse guard or nonce incorrect length\");\n return nonce;\n}\nexport async function ratchetToGeneration(tree, senderData, contentType, config, cs) {\n const index = toLeafIndex(senderData.leafIndex);\n const nodeIndex = leafToNodeIndex(index);\n const [updatedTree, consumedSecrets] = await updateTreeWithLeafSecret(tree, index, nodeIndex, cs);\n const node = updatedTree.leafNodes[nodeIndex];\n const ratchet = ratchetForContentType(node, contentType);\n if (ratchet.generation > senderData.generation) {\n const desired = ratchet.unusedGenerations[senderData.generation];\n if (desired !== undefined) {\n const { [senderData.generation]: consumedValue, ...removedDesiredGen } = ratchet.unusedGenerations;\n const ratchetState = { ...ratchet, unusedGenerations: removedDesiredGen };\n const consumed = consumedValue ? [...consumedSecrets, consumedValue] : consumedSecrets;\n return await createRatchetResultWithSecret(node, nodeIndex, desired, senderData.generation, senderData.reuseGuard, updatedTree, contentType, consumed, cs, ratchetState);\n }\n throw new ValidationError(\"Desired gen in the past\");\n }\n const [currentSecret, consumed] = await ratchetUntil(ratchetForContentType(node, contentType), senderData.generation, config, cs.kdf);\n return createRatchetResult(node, index, currentSecret, senderData.reuseGuard, updatedTree, contentType, [...consumed, ...consumedSecrets], cs);\n}\nexport async function consumeRatchet(tree, index, contentType, cs) {\n const nodeIndex = leafToNodeIndex(index);\n const [updatedTree, consumedSecrets] = await updateTreeWithLeafSecret(tree, index, nodeIndex, cs);\n const node = updatedTree.leafNodes[nodeIndex];\n const currentSecret = ratchetForContentType(node, contentType);\n const reuseGuard = cs.rng.randomBytes(4);\n return createRatchetResult(node, index, currentSecret, reuseGuard, updatedTree, contentType, consumedSecrets, cs);\n}\nasync function updateTreeWithLeafSecret(tree, index, nodeIndex, cs) {\n const existingNode = tree.leafNodes[nodeIndex];\n if (existingNode === undefined) {\n const { secret: leafSecret, updatedIntermediateNodes, consumed } = await deriveLeafSecret(index, tree, cs.kdf);\n const application = await createRatchetRoot(leafSecret, \"application\", cs.kdf);\n const handshake = await createRatchetRoot(leafSecret, \"handshake\", cs.kdf);\n // Remove the target node from intermediate nodes since it's now a leaf\n const { [nodeIndex]: _, ...remainingIntermediateNodes } = updatedIntermediateNodes;\n return [\n {\n ...tree,\n intermediateNodes: remainingIntermediateNodes,\n leafNodes: { ...tree.leafNodes, [nodeIndex]: { handshake, application } },\n },\n [...consumed, leafSecret],\n ];\n }\n else {\n return [tree, []];\n }\n}\nasync function createRatchetResult(node, index, currentSecret, reuseGuard, tree, contentType, consumed, cs) {\n const nextSecret = await deriveTreeSecret(currentSecret.secret, \"secret\", currentSecret.generation, cs.kdf.size, cs.kdf);\n const ratchetState = { ...currentSecret, secret: nextSecret, generation: currentSecret.generation + 1 };\n return await createRatchetResultWithSecret(node, leafToNodeIndex(index), currentSecret.secret, currentSecret.generation, reuseGuard, tree, contentType, consumed, cs, ratchetState);\n}\nasync function createRatchetResultWithSecret(node, index, secret, generation, reuseGuard, tree, contentType, consumed, cs, ratchetState) {\n const { nonce, key } = await createKeyAndNonce(secret, generation, reuseGuard, cs);\n const newNode = contentType === contentTypes.application\n ? { ...node, application: ratchetState }\n : { ...node, handshake: ratchetState };\n const newTree = {\n ...tree,\n leafNodes: { ...tree.leafNodes, [index]: newNode },\n };\n return {\n generation: generation,\n reuseGuard,\n nonce,\n key,\n newTree,\n consumed: [...consumed, secret, key],\n };\n}\nasync function createKeyAndNonce(secret, generation, reuseGuard, cs) {\n const key = await deriveKey(secret, generation, cs);\n const nonce = await derivePrivateMessageNonce(secret, generation, reuseGuard, cs);\n return { nonce, key };\n}\nfunction ratchetForContentType(node, contentType) {\n switch (contentType) {\n case contentTypes.application:\n return node.application;\n case contentTypes.proposal:\n return node.handshake;\n case contentTypes.commit:\n return node.handshake;\n }\n}\nasync function createRatchetRoot(node, label, kdf) {\n const secret = await expandWithLabel(node, label, new Uint8Array(), kdf.size, kdf);\n return { secret: secret, generation: 0, unusedGenerations: {} };\n}\n//# sourceMappingURL=secretTree.js.map","import { mapDecodersOption } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenDataEncoder } from \"./codec/variableLength.js\";\nimport { framedContentDecoder, framedContentEncoder } from \"./framedContent.js\";\nimport { wireformatDecoder, wireformatEncoder } from \"./wireformat.js\";\nimport { contentTypes } from \"./contentType.js\";\nexport const confirmedTranscriptHashInputEncoder = contramapBufferEncoders([wireformatEncoder, framedContentEncoder, varLenDataEncoder], (input) => [input.wireformat, input.content, input.signature]);\nexport const confirmedTranscriptHashInputDecoder = mapDecodersOption([wireformatDecoder, framedContentDecoder, varLenDataDecoder], (wireformat, content, signature) => {\n if (content.contentType === contentTypes.commit)\n return {\n wireformat,\n content,\n signature,\n };\n else\n return undefined;\n});\nexport function createConfirmedHash(interimTranscriptHash, input, hash) {\n const [len, write] = confirmedTranscriptHashInputEncoder(input);\n const buf = new ArrayBuffer(interimTranscriptHash.byteLength + len);\n const arr = new Uint8Array(buf);\n arr.set(interimTranscriptHash, 0);\n write(interimTranscriptHash.byteLength, buf);\n return hash.digest(arr);\n}\nexport function createInterimHash(confirmedHash, confirmationTag, hash) {\n const [len, write] = varLenDataEncoder(confirmationTag);\n const buf = new ArrayBuffer(confirmedHash.byteLength + len);\n const arr = new Uint8Array(buf);\n arr.set(confirmedHash, 0);\n write(confirmedHash.byteLength, buf);\n return hash.digest(arr);\n}\n//# sourceMappingURL=transcriptHash.js.map","import { deriveSecret } from \"./crypto/kdf.js\";\nimport { InternalError } from \"./mlsError.js\";\nimport { findFirstNonBlankAncestor } from \"./ratchetTree.js\";\nimport { root, leafWidth } from \"./treemath.js\";\nexport function pathToPathSecrets(pathSecrets) {\n return pathSecrets.reduce((acc, cur) => ({\n ...acc,\n [cur.nodeIndex]: cur.secret,\n }), {});\n}\nexport async function getCommitSecret(tree, nodeIndex, pathSecret, kdf) {\n const rootIndex = root(leafWidth(tree.length));\n const path = await pathToRoot(tree, nodeIndex, pathSecret, kdf);\n const rootSecret = path[rootIndex];\n if (rootSecret === undefined)\n throw new InternalError(\"Could not find secret for root\");\n return deriveSecret(rootSecret, \"path\", kdf);\n}\nexport async function pathToRoot(tree, nodeIndex, pathSecret, kdf) {\n const rootIndex = root(leafWidth(tree.length));\n let currentIndex = nodeIndex;\n const pathSecrets = { [nodeIndex]: pathSecret };\n while (currentIndex != rootIndex) {\n const nextIndex = findFirstNonBlankAncestor(tree, currentIndex);\n const nextSecret = await deriveSecret(pathSecrets[currentIndex], \"path\", kdf);\n pathSecrets[nextIndex] = nextSecret;\n currentIndex = nextIndex;\n }\n return pathSecrets;\n}\n//# sourceMappingURL=pathSecrets.js.map","import { uint32Decoder, uint32Encoder } from \"./codec/number.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { numberRecordDecoder, varLenDataDecoder, numberRecordEncoder, varLenDataEncoder, } from \"./codec/variableLength.js\";\nimport { deriveSecret } from \"./crypto/kdf.js\";\nimport { leafToNodeIndex, toLeafIndex } from \"./treemath.js\";\nexport const privateKeyPathEncoder = contramapBufferEncoders([uint32Encoder, numberRecordEncoder(uint32Encoder, varLenDataEncoder)], (pkp) => [pkp.leafIndex, pkp.privateKeys]);\nexport const privateKeyPathDecoder = mapDecoders([uint32Decoder, numberRecordDecoder(uint32Decoder, varLenDataDecoder)], (leafIndex, privateKeys) => ({\n leafIndex,\n privateKeys,\n}));\n/**\n * Merges PrivateKeyPaths, BEWARE, if there is a conflict, this function will prioritize the second `b` parameter\n */\nexport function mergePrivateKeyPaths(a, b) {\n return { ...a, privateKeys: { ...a.privateKeys, ...b.privateKeys } };\n}\nexport function updateLeafKey(path, newKey) {\n return { ...path, privateKeys: { ...path.privateKeys, [leafToNodeIndex(toLeafIndex(path.leafIndex))]: newKey } };\n}\nexport async function toPrivateKeyPath(pathSecrets, leafIndex, cs) {\n const asArray = await Promise.all(Object.entries(pathSecrets).map(async ([nodeIndex, pathSecret]) => {\n const nodeSecret = await deriveSecret(pathSecret, \"node\", cs.kdf);\n const { privateKey } = await cs.hpke.deriveKeyPair(nodeSecret);\n return [Number(nodeIndex), await cs.hpke.exportPrivateKey(privateKey)];\n }));\n const privateKeys = Object.fromEntries(asArray);\n return { leafIndex, privateKeys };\n}\n//# sourceMappingURL=privateKeyPath.js.map","import { uint32Decoder, uint32Encoder } from \"./codec/number.js\";\nimport { optionalDecoder, optionalEncoder } from \"./codec/optional.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { base64RecordEncoder, base64RecordDecoder } from \"./codec/variableLength.js\";\nimport { proposalDecoder, proposalEncoder } from \"./proposal.js\";\nimport { bytesToBase64 } from \"./util/byteArray.js\";\nexport const proposalWithSenderEncoder = contramapBufferEncoders([proposalEncoder, optionalEncoder(uint32Encoder)], (pws) => [pws.proposal, pws.senderLeafIndex]);\nexport const proposalWithSenderDecoder = mapDecoders([proposalDecoder, optionalDecoder(uint32Decoder)], (proposal, senderLeafIndex) => ({\n proposal,\n senderLeafIndex,\n}));\nexport const unappliedProposalsEncoder = base64RecordEncoder(proposalWithSenderEncoder);\nexport const unappliedProposalsDecoder = base64RecordDecoder(proposalWithSenderDecoder);\nexport function addUnappliedProposal(ref, proposals, proposal, senderLeafIndex) {\n const r = bytesToBase64(ref);\n return {\n ...proposals,\n [r]: { proposal, senderLeafIndex },\n };\n}\n//# sourceMappingURL=unappliedProposals.js.map","import { ValidationError } from \"./mlsError.js\";\nimport { updatePskSecret } from \"./presharedkey.js\";\nexport async function accumulatePskSecret(groupedPsk, pskSearch, cs, zeroes) {\n return groupedPsk.reduce(async (acc, cur, index) => {\n const [previousSecret, ids] = await acc;\n const psk = pskSearch.findPsk(cur);\n if (psk === undefined)\n throw new ValidationError(\"Could not find pskId referenced in proposal\");\n const pskSecret = await updatePskSecret(previousSecret, cur, psk, index, groupedPsk.length, cs);\n return [pskSecret, [...ids, cur]];\n }, Promise.resolve([zeroes, []]));\n}\n//# sourceMappingURL=pskIndex.js.map","export function addToMap(map, k, v) {\n const copy = new Map(map);\n copy.set(k, v);\n return copy;\n}\n//# sourceMappingURL=addToMap.js.map","import { optionalDecoder, optionalEncoder } from \"./codec/optional.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenTypeDecoder, varLenDataEncoder, varLenTypeEncoder } from \"./codec/variableLength.js\";\nimport { pskIdDecoder, pskIdEncoder } from \"./presharedkey.js\";\nexport const groupSecretsEncoder = contramapBufferEncoders([varLenDataEncoder, optionalEncoder(varLenDataEncoder), varLenTypeEncoder(pskIdEncoder)], (gs) => [gs.joinerSecret, gs.pathSecret, gs.psks]);\nexport const groupSecretsDecoder = mapDecoders([varLenDataDecoder, optionalDecoder(varLenDataDecoder), varLenTypeDecoder(pskIdDecoder)], (joinerSecret, pathSecret, psks) => ({ joinerSecret, pathSecret, psks }));\n//# sourceMappingURL=groupSecrets.js.map","import { uint16Decoder, uint16Encoder } from \"./codec/number.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenTypeDecoder, varLenDataEncoder, varLenTypeEncoder } from \"./codec/variableLength.js\";\nimport { encryptWithLabel, decryptWithLabel } from \"./crypto/hpke.js\";\nimport { expandWithLabel } from \"./crypto/kdf.js\";\nimport { groupInfoDecoder, groupInfoEncoder, extractWelcomeSecret } from \"./groupInfo.js\";\nimport { groupSecretsDecoder, groupSecretsEncoder } from \"./groupSecrets.js\";\nimport { hpkeCiphertextEncoder, hpkeCiphertextDecoder } from \"./hpkeCiphertext.js\";\nimport { ValidationError } from \"./mlsError.js\";\nimport { constantTimeEqual } from \"./util/constantTimeCompare.js\";\nexport const encryptedGroupSecretsEncoder = contramapBufferEncoders([varLenDataEncoder, hpkeCiphertextEncoder], (egs) => [egs.newMember, egs.encryptedGroupSecrets]);\nexport const encryptedGroupSecretsDecoder = mapDecoders([varLenDataDecoder, hpkeCiphertextDecoder], (newMember, encryptedGroupSecrets) => ({ newMember, encryptedGroupSecrets }));\nexport const welcomeEncoder = contramapBufferEncoders([uint16Encoder, varLenTypeEncoder(encryptedGroupSecretsEncoder), varLenDataEncoder], (welcome) => [welcome.cipherSuite, welcome.secrets, welcome.encryptedGroupInfo]);\nexport const welcomeDecoder = mapDecoders([uint16Decoder, varLenTypeDecoder(encryptedGroupSecretsDecoder), varLenDataDecoder], (cipherSuite, secrets, encryptedGroupInfo) => ({ cipherSuite, secrets, encryptedGroupInfo }));\nfunction welcomeNonce(welcomeSecret, cs) {\n return expandWithLabel(welcomeSecret, \"nonce\", new Uint8Array(), cs.hpke.nonceLength, cs.kdf);\n}\nfunction welcomeKey(welcomeSecret, cs) {\n return expandWithLabel(welcomeSecret, \"key\", new Uint8Array(), cs.hpke.keyLength, cs.kdf);\n}\nexport async function encryptGroupInfo(groupInfo, welcomeSecret, cs) {\n const key = await welcomeKey(welcomeSecret, cs);\n const nonce = await welcomeNonce(welcomeSecret, cs);\n const encrypted = await cs.hpke.encryptAead(key, nonce, undefined, encode(groupInfoEncoder, groupInfo));\n return encrypted;\n}\nexport async function decryptGroupInfo(w, joinerSecret, pskSecret, cs) {\n const welcomeSecret = await extractWelcomeSecret(joinerSecret, pskSecret, cs.kdf);\n const key = await welcomeKey(welcomeSecret, cs);\n const nonce = await welcomeNonce(welcomeSecret, cs);\n const decrypted = await cs.hpke.decryptAead(key, nonce, undefined, w.encryptedGroupInfo);\n const decoded = groupInfoDecoder(decrypted, 0);\n return decoded?.[0];\n}\nexport function encryptGroupSecrets(initKey, encryptedGroupInfo, groupSecrets, hpke) {\n return encryptWithLabel(initKey, \"Welcome\", encryptedGroupInfo, encode(groupSecretsEncoder, groupSecrets), hpke);\n}\nexport async function decryptGroupSecrets(initPrivateKey, keyPackageRef, welcome, hpke) {\n const secret = welcome.secrets.find((s) => constantTimeEqual(s.newMember, keyPackageRef));\n if (secret === undefined)\n throw new ValidationError(\"No matching secret found\");\n const decrypted = await decryptWithLabel(initPrivateKey, \"Welcome\", welcome.encryptedGroupInfo, secret.encryptedGroupSecrets.kemOutput, secret.encryptedGroupSecrets.ciphertext, hpke);\n return groupSecretsDecoder(decrypted, 0)?.[0];\n}\n//# sourceMappingURL=welcome.js.map","import { constantTimeEqual } from \"./util/constantTimeCompare.js\";\n/** @public */\nexport const defaultKeyPackageEqualityConfig = {\n compareKeyPackages(a, b) {\n return constantTimeEqual(a.leafNode.signaturePublicKey, b.leafNode.signaturePublicKey);\n },\n compareKeyPackageToLeafNode(a, b) {\n return constantTimeEqual(a.leafNode.signaturePublicKey, b.signaturePublicKey);\n },\n};\n//# sourceMappingURL=keyPackageEqualityConfig.js.map","/** @public */\nexport const defaultKeyRetentionConfig = {\n retainKeysForGenerations: 10,\n retainKeysForEpochs: 4,\n maximumForwardRatchetSteps: 200,\n};\n//# sourceMappingURL=keyRetentionConfig.js.map","/** @public */\nexport const defaultLifetimeConfig = {\n maximumTotalLifetime: 10368000n, // 4 months\n validateLifetimeOnReceive: false,\n};\n//# sourceMappingURL=lifetimeConfig.js.map","/** @public */\nexport const defaultPaddingConfig = { kind: \"padUntilLength\", padUntilLength: 256 };\nexport function byteLengthToPad(encodedLength, config) {\n if (config.kind === \"alwaysPad\")\n return config.paddingLength;\n else\n return encodedLength >= config.padUntilLength ? 0 : config.padUntilLength - encodedLength;\n}\n//# sourceMappingURL=paddingConfig.js.map","import { defaultKeyPackageEqualityConfig } from \"./keyPackageEqualityConfig.js\";\nimport { defaultKeyRetentionConfig } from \"./keyRetentionConfig.js\";\nimport { defaultLifetimeConfig } from \"./lifetimeConfig.js\";\nimport { defaultPaddingConfig } from \"./paddingConfig.js\";\nexport const defaultClientConfig = {\n keyRetentionConfig: defaultKeyRetentionConfig,\n lifetimeConfig: defaultLifetimeConfig,\n keyPackageEqualityConfig: defaultKeyPackageEqualityConfig,\n paddingConfig: defaultPaddingConfig,\n};\n//# sourceMappingURL=clientConfig.js.map","export function arraysEqual(a, b) {\n if (a.length !== b.length)\n return false;\n return a.every((val, index) => val === b[index]);\n}\n//# sourceMappingURL=array.js.map","import { mapDecoder } from \"./tlsDecoder.js\";\nimport { contramapBufferEncoder } from \"./tlsEncoder.js\";\nimport { varLenDataDecoder, varLenDataEncoder } from \"./variableLength.js\";\nexport const stringEncoder = contramapBufferEncoder(varLenDataEncoder, (s) => new TextEncoder().encode(s));\nexport const stringDecoder = mapDecoder(varLenDataDecoder, (u) => new TextDecoder().decode(u));\n//# sourceMappingURL=string.js.map","import { stringEncoder, stringDecoder } from \"./codec/string.js\";\nimport { flatMapDecoder, succeedDecoder, mapDecoder, failDecoder } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoder, contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { reinitEncoder, reinitDecoder } from \"./proposal.js\";\nconst activeEncoder = contramapBufferEncoder(stringEncoder, () => \"active\");\nconst suspendedPendingReinitEncoder = contramapBufferEncoders([stringEncoder, reinitEncoder], (s) => [\"suspendedPendingReinit\", s.reinit]);\nconst removedFromGroupEncoder = contramapBufferEncoder(stringEncoder, () => \"removedFromGroup\");\nexport const groupActiveStateEncoder = (state) => {\n switch (state.kind) {\n case \"active\":\n return activeEncoder(state);\n case \"suspendedPendingReinit\":\n return suspendedPendingReinitEncoder(state);\n case \"removedFromGroup\":\n return removedFromGroupEncoder(state);\n }\n};\nexport const groupActiveStateDecoder = flatMapDecoder(stringDecoder, (kind) => {\n switch (kind) {\n case \"active\":\n return succeedDecoder({ kind: \"active\" });\n case \"suspendedPendingReinit\":\n return mapDecoder(reinitDecoder, (reinit) => ({ kind: \"suspendedPendingReinit\", reinit }));\n case \"removedFromGroup\":\n return succeedDecoder({ kind: \"removedFromGroup\" });\n default:\n return failDecoder();\n }\n});\n//# sourceMappingURL=groupActiveState.js.map","import { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { varLenDataEncoder, varLenDataDecoder } from \"./codec/variableLength.js\";\nimport { groupContextEncoder, groupContextDecoder } from \"./groupContext.js\";\nimport { ratchetTreeEncoder, ratchetTreeDecoder } from \"./ratchetTree.js\";\nimport { secretTreeEncoder, secretTreeDecoder } from \"./secretTree.js\";\nexport const epochReceiverDataEncoder = contramapBufferEncoders([varLenDataEncoder, secretTreeEncoder, ratchetTreeEncoder, varLenDataEncoder, groupContextEncoder], (erd) => [erd.resumptionPsk, erd.secretTree, erd.ratchetTree, erd.senderDataSecret, erd.groupContext]);\nexport const epochReceiverDataDecoder = mapDecoders([varLenDataDecoder, secretTreeDecoder, ratchetTreeDecoder, varLenDataDecoder, groupContextDecoder], (resumptionPsk, secretTree, ratchetTree, senderDataSecret, groupContext) => ({\n resumptionPsk,\n secretTree,\n ratchetTree,\n senderDataSecret,\n groupContext,\n}));\n//# sourceMappingURL=epochReceiverData.js.map","import { makeProposalRef } from \"./authenticatedContent.js\";\nimport { extensionsEqual, extensionsSupportedByCapabilities, } from \"./extension.js\";\nimport { createConfirmationTag } from \"./framedContent.js\";\nimport { groupContextDecoder, groupContextEncoder } from \"./groupContext.js\";\nimport { ratchetTreeFromExtension, verifyGroupInfoConfirmationTag, verifyGroupInfoSignature } from \"./groupInfo.js\";\nimport { makeKeyPackageRef, verifyKeyPackage } from \"./keyPackage.js\";\nimport { keyScheduleDecoder, deriveKeySchedule, initializeKeySchedule, keyScheduleEncoder, } from \"./keySchedule.js\";\nimport { pskIdEncoder, pskTypes, resumptionPSKUsages } from \"./presharedkey.js\";\nimport { ratchetTreeDecoder, findBlankLeafNodeIndexOrExtend, findLeafIndex, ratchetTreeEncoder, updateLeafNodeMutable, addLeafNodeMutable, removeLeafNodeMutable, } from \"./ratchetTree.js\";\nimport { allSecretTreeValues, createSecretTree, secretTreeDecoder, secretTreeEncoder, } from \"./secretTree.js\";\nimport { createConfirmedHash, createInterimHash } from \"./transcriptHash.js\";\nimport { treeHashRoot } from \"./treeHash.js\";\nimport { directPath, isLeaf, leafToNodeIndex, leafWidth, nodeToLeafIndex, toLeafIndex, toNodeIndex, } from \"./treemath.js\";\nimport { wireformats } from \"./wireformat.js\";\nimport { proposalOrRefTypes } from \"./proposalOrRefType.js\";\nimport { isDefaultProposal, } from \"./proposal.js\";\nimport { defaultProposalTypes } from \"./defaultProposalType.js\";\nimport { defaultExtensionTypes } from \"./defaultExtensionType.js\";\nimport { pathToRoot } from \"./pathSecrets.js\";\nimport { privateKeyPathDecoder, mergePrivateKeyPaths, privateKeyPathEncoder, toPrivateKeyPath, } from \"./privateKeyPath.js\";\nimport { addUnappliedProposal, unappliedProposalsEncoder, unappliedProposalsDecoder, } from \"./unappliedProposals.js\";\nimport { accumulatePskSecret } from \"./pskIndex.js\";\nimport { getSenderLeafNodeIndex } from \"./sender.js\";\nimport { addToMap } from \"./util/addToMap.js\";\nimport { bytesToBase64, zeroOutUint8Array } from \"./util/byteArray.js\";\nimport { constantTimeEqual } from \"./util/constantTimeCompare.js\";\nimport { CryptoVerificationError, CodecError, InternalError, UsageError, ValidationError, } from \"./mlsError.js\";\nimport { verifyLeafNodeSignature, verifyLeafNodeSignatureKeyPackage, } from \"./leafNode.js\";\nimport { leafNodeSources } from \"./leafNodeSource.js\";\nimport { nodeTypes } from \"./nodeType.js\";\nimport { protocolVersions } from \"./protocolVersion.js\";\nimport { verifyParentHashes } from \"./parentHash.js\";\nimport { firstCommonAncestor } from \"./updatePath.js\";\nimport { decryptGroupInfo, decryptGroupSecrets } from \"./welcome.js\";\nimport { defaultClientConfig } from \"./clientConfig.js\";\nimport { arraysEqual } from \"./util/array.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { bigintMapEncoder, bigintMapDecoder, varLenDataDecoder, varLenDataEncoder } from \"./codec/variableLength.js\";\nimport { groupActiveStateDecoder, groupActiveStateEncoder } from \"./groupActiveState.js\";\nimport { epochReceiverDataDecoder, epochReceiverDataEncoder } from \"./epochReceiverData.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { deriveSecret } from \"./crypto/kdf.js\";\n/** @public */\nexport const publicGroupStateEncoder = contramapBufferEncoders([groupContextEncoder, ratchetTreeEncoder], (state) => [state.groupContext, state.ratchetTree]);\n/** @public */\nexport const groupStateEncoder = contramapBufferEncoders([\n keyScheduleEncoder,\n secretTreeEncoder,\n privateKeyPathEncoder,\n varLenDataEncoder,\n unappliedProposalsEncoder,\n varLenDataEncoder,\n bigintMapEncoder(epochReceiverDataEncoder),\n groupActiveStateEncoder,\n], (state) => [\n state.keySchedule,\n state.secretTree,\n state.privatePath,\n state.signaturePrivateKey,\n state.unappliedProposals,\n state.confirmationTag,\n state.historicalReceiverData,\n state.groupActiveState,\n]);\n/** @public */\nexport const clientStateEncoder = contramapBufferEncoders([publicGroupStateEncoder, groupStateEncoder], (state) => [state, state]);\n/** @public */\nexport const publicGroupStateDecoder = mapDecoders([groupContextDecoder, ratchetTreeDecoder], (groupContext, ratchetTree) => ({\n groupContext,\n ratchetTree,\n}));\n/** @public */\nexport const groupStateDecoder = mapDecoders([\n keyScheduleDecoder,\n secretTreeDecoder,\n privateKeyPathDecoder,\n varLenDataDecoder,\n unappliedProposalsDecoder,\n varLenDataDecoder,\n bigintMapDecoder(epochReceiverDataDecoder),\n groupActiveStateDecoder,\n], (keySchedule, secretTree, privatePath, signaturePrivateKey, unappliedProposals, confirmationTag, historicalReceiverData, groupActiveState) => ({\n keySchedule,\n secretTree,\n privatePath,\n signaturePrivateKey,\n unappliedProposals,\n confirmationTag,\n historicalReceiverData,\n groupActiveState,\n}));\n/** @public */\nexport const clientStateDecoder = mapDecoders([publicGroupStateDecoder, groupStateDecoder], (publicState, state) => ({\n ...publicState,\n ...state,\n}));\n/** @public */\nexport function getOwnLeafNode(state) {\n const idx = leafToNodeIndex(toLeafIndex(state.privatePath.leafIndex));\n const leaf = state.ratchetTree[idx];\n if (leaf?.nodeType !== nodeTypes.leaf)\n throw new InternalError(\"Expected leaf node\");\n return leaf.leaf;\n}\n/** @public */\nexport function getOwnSignatureKeyPair(state) {\n return {\n signKey: state.signaturePrivateKey,\n publicKey: getOwnLeafNode(state).signaturePublicKey,\n };\n}\n/** @public */\nexport function getGroupMembers(state) {\n return extractFromGroupMembers(state, () => false, (l) => l);\n}\nexport function extractFromGroupMembers(state, exclude, map) {\n const recipients = [];\n for (const node of state.ratchetTree) {\n if (node?.nodeType === nodeTypes.leaf && !exclude(node.leaf)) {\n recipients.push(map(node.leaf));\n }\n }\n return recipients;\n}\nexport function checkCanSendApplicationMessages(state) {\n if (Object.keys(state.unappliedProposals).length !== 0)\n throw new UsageError(\"Cannot send application message with unapplied proposals\");\n checkCanSendHandshakeMessages(state);\n}\nexport function checkCanSendHandshakeMessages(state) {\n if (state.groupActiveState.kind === \"suspendedPendingReinit\")\n throw new UsageError(\"Cannot send messages while Group is suspended pending reinit\");\n else if (state.groupActiveState.kind === \"removedFromGroup\")\n throw new UsageError(\"Cannot send messages after being removed from group\");\n}\nconst emptyProposals = {\n [defaultProposalTypes.add]: [],\n [defaultProposalTypes.update]: [],\n [defaultProposalTypes.remove]: [],\n [defaultProposalTypes.psk]: [],\n [defaultProposalTypes.reinit]: [],\n [defaultProposalTypes.external_init]: [],\n [defaultProposalTypes.group_context_extensions]: [],\n};\nfunction flattenExtensions(groupContextExtensions) {\n return groupContextExtensions[0]?.proposal.groupContextExtensions.extensions ?? [];\n}\nasync function validateProposals(p, committerLeafIndex, groupContext, config, authService, tree) {\n const containsUpdateByCommitter = p[defaultProposalTypes.update].some((o) => o.senderLeafIndex !== undefined && o.senderLeafIndex === committerLeafIndex);\n if (containsUpdateByCommitter)\n return new ValidationError(\"Commit cannot contain an update proposal sent by committer\");\n const containsRemoveOfCommitter = p[defaultProposalTypes.remove].some((o) => o.proposal.remove.removed === committerLeafIndex);\n if (containsRemoveOfCommitter)\n return new ValidationError(\"Commit cannot contain a remove proposal removing committer\");\n const multipleUpdateRemoveForSameLeaf = p[defaultProposalTypes.update].some(({ senderLeafIndex: a }, indexA) => p[defaultProposalTypes.update].some(({ senderLeafIndex: b }, indexB) => a === b && indexA !== indexB) ||\n p[defaultProposalTypes.remove].some((r) => r.proposal.remove.removed === a)) ||\n p[defaultProposalTypes.remove].some((a, indexA) => p[defaultProposalTypes.remove].some((b, indexB) => b.proposal.remove.removed === a.proposal.remove.removed && indexA !== indexB) ||\n p[defaultProposalTypes.update].some(({ senderLeafIndex }) => a.proposal.remove.removed === senderLeafIndex));\n if (multipleUpdateRemoveForSameLeaf)\n return new ValidationError(\"Commit cannot contain multiple update and/or remove proposals that apply to the same leaf\");\n const multipleAddsContainSameKeypackage = p[defaultProposalTypes.add].some(({ proposal: a }, indexA) => p[defaultProposalTypes.add].some(({ proposal: b }, indexB) => config.compareKeyPackages(a.add.keyPackage, b.add.keyPackage) && indexA !== indexB));\n if (multipleAddsContainSameKeypackage)\n return new ValidationError(\"Commit cannot contain multiple Add proposals that contain KeyPackages that represent the same client\");\n // checks if there is an Add proposal with a KeyPackage that matches a client already in the group\n // unless there is a Remove proposal in the list removing the matching client from the group.\n const addsContainExistingKeypackage = p[defaultProposalTypes.add].some(({ proposal }) => tree.some((node, nodeIndex) => node !== undefined &&\n node.nodeType === nodeTypes.leaf &&\n config.compareKeyPackageToLeafNode(proposal.add.keyPackage, node.leaf) &&\n p[defaultProposalTypes.remove].every((r) => r.proposal.remove.removed !== nodeToLeafIndex(toNodeIndex(nodeIndex)))));\n if (addsContainExistingKeypackage)\n return new ValidationError(\"Commit cannot contain an Add proposal for someone already in the group\");\n const everyLeafSupportsGroupExtensions = p[defaultProposalTypes.add].every(({ proposal }) => extensionsSupportedByCapabilities(groupContext.extensions, proposal.add.keyPackage.leafNode.capabilities));\n if (!everyLeafSupportsGroupExtensions)\n return new ValidationError(\"Added leaf node that doesn't support extension in GroupContext\");\n const multiplePskWithSamePskId = p[defaultProposalTypes.psk].some((a, indexA) => p[defaultProposalTypes.psk].some((b, indexB) => constantTimeEqual(encode(pskIdEncoder, a.proposal.psk.preSharedKeyId), encode(pskIdEncoder, b.proposal.psk.preSharedKeyId)) && indexA !== indexB));\n if (multiplePskWithSamePskId)\n return new ValidationError(\"Commit cannot contain PreSharedKey proposals that reference the same PreSharedKeyID\");\n const multipleGroupContextExtensions = p[defaultProposalTypes.group_context_extensions].length > 1;\n if (multipleGroupContextExtensions)\n return new ValidationError(\"Commit cannot contain multiple GroupContextExtensions proposals\");\n const allExtensions = flattenExtensions(p[defaultProposalTypes.group_context_extensions]);\n const requiredCapabilities = allExtensions.find((e) => e.extensionType === defaultExtensionTypes.required_capabilities);\n if (requiredCapabilities !== undefined) {\n const caps = requiredCapabilities.extensionData;\n const everyLeafSupportsCapabilities = tree\n .filter((n) => n !== undefined && n.nodeType === nodeTypes.leaf)\n .every((l) => capabiltiesAreSupported(caps, l.leaf.capabilities));\n if (!everyLeafSupportsCapabilities)\n return new ValidationError(\"Not all members support required capabilities\");\n const allAdditionsSupportCapabilities = p[defaultProposalTypes.add].every((a) => capabiltiesAreSupported(caps, a.proposal.add.keyPackage.leafNode.capabilities));\n if (!allAdditionsSupportCapabilities)\n return new ValidationError(\"Commit contains add proposals of member without required capabilities\");\n }\n return await validateExternalSenders(allExtensions, authService);\n}\nasync function validateExternalSenders(extensions, authService) {\n const externalSenders = extensions.filter((e) => e.extensionType === defaultExtensionTypes.external_senders);\n for (const externalSender of externalSenders) {\n const validCredential = await authService.validateCredential(externalSender.extensionData.credential, externalSender.extensionData.signaturePublicKey);\n if (!validCredential)\n return new ValidationError(\"Could not validate external credential\");\n }\n}\nfunction capabiltiesAreSupported(caps, cs) {\n return (caps.credentialTypes.every((c) => cs.credentials.includes(c)) &&\n caps.extensionTypes.every((e) => cs.extensions.includes(e)) &&\n caps.proposalTypes.every((p) => cs.proposals.includes(p)));\n}\nexport async function validateRatchetTree(tree, groupContext, config, authService, treeHash, cs) {\n const hpkeKeys = new Set();\n const signatureKeys = new Set();\n const credentialTypes = new Set();\n for (const [i, n] of tree.entries()) {\n const nodeIndex = toNodeIndex(i);\n if (n?.nodeType === nodeTypes.leaf) {\n if (!isLeaf(nodeIndex))\n return new ValidationError(\"Received Ratchet Tree is not structurally sound\");\n const hpkeKey = bytesToBase64(n.leaf.hpkePublicKey);\n if (hpkeKeys.has(hpkeKey))\n return new ValidationError(\"hpke keys not unique\");\n else\n hpkeKeys.add(hpkeKey);\n const signatureKey = bytesToBase64(n.leaf.signaturePublicKey);\n if (signatureKeys.has(signatureKey))\n return new ValidationError(\"signature keys not unique\");\n else\n signatureKeys.add(signatureKey);\n {\n credentialTypes.add(n.leaf.credential.credentialType);\n }\n const err = n.leaf.leafNodeSource === leafNodeSources.key_package\n ? await validateLeafNodeKeyPackage(n.leaf, groupContext, false, config, authService, cs.signature)\n : await validateLeafNodeUpdateOrCommit(n.leaf, nodeToLeafIndex(nodeIndex), groupContext, authService, cs.signature);\n if (err !== undefined)\n return err;\n }\n else if (n?.nodeType === nodeTypes.parent) {\n if (isLeaf(nodeIndex))\n return new ValidationError(\"Received Ratchet Tree is not structurally sound\");\n const hpkeKey = bytesToBase64(n.parent.hpkePublicKey);\n if (hpkeKeys.has(hpkeKey))\n return new ValidationError(\"hpke keys not unique\");\n else\n hpkeKeys.add(hpkeKey);\n for (const unmergedLeaf of n.parent.unmergedLeaves) {\n const leafIndex = toLeafIndex(unmergedLeaf);\n const dp = directPath(leafToNodeIndex(leafIndex), leafWidth(tree.length));\n const nodeIndex = leafToNodeIndex(leafIndex);\n if (tree[nodeIndex]?.nodeType !== nodeTypes.leaf && !dp.includes(toNodeIndex(i)))\n return new ValidationError(\"Unmerged leaf did not represent a non-blank descendant leaf node\");\n for (const parentIdx of dp) {\n const dpNode = tree[parentIdx];\n if (dpNode !== undefined) {\n if (dpNode.nodeType !== nodeTypes.parent)\n return new InternalError(\"Expected parent node\");\n if (!arraysEqual(dpNode.parent.unmergedLeaves, n.parent.unmergedLeaves))\n return new ValidationError(\"non-blank intermediate node must list leaf node in its unmerged_leaves\");\n }\n }\n }\n }\n }\n for (const n of tree) {\n if (n?.nodeType === nodeTypes.leaf) {\n for (const credentialType of credentialTypes) {\n if (!n.leaf.capabilities.credentials.includes(credentialType))\n return new ValidationError(\"LeafNode has credential that is not supported by member of the group\");\n }\n }\n }\n const parentHashesVerified = await verifyParentHashes(tree, cs.hash);\n if (!parentHashesVerified)\n return new CryptoVerificationError(\"Unable to verify parent hash\");\n if (!constantTimeEqual(treeHash, await treeHashRoot(tree, cs.hash)))\n return new ValidationError(\"Unable to verify tree hash\");\n}\nexport async function validateLeafNodeUpdateOrCommit(leafNode, leafIndex, groupContext, authService, s) {\n const signatureValid = await verifyLeafNodeSignature(leafNode, groupContext.groupId, leafIndex, s);\n if (!signatureValid)\n return new CryptoVerificationError(\"Could not verify leaf node signature\");\n const commonError = await validateLeafNodeCommon(leafNode, groupContext, authService);\n if (commonError !== undefined)\n return commonError;\n}\nexport function throwIfDefined(err) {\n if (err !== undefined)\n throw err;\n}\nasync function validateLeafNodeCommon(leafNode, groupContext, authService) {\n const credentialValid = await authService.validateCredential(leafNode.credential, leafNode.signaturePublicKey);\n if (!credentialValid)\n return new ValidationError(\"Could not validate credential\");\n const requiredCapabilities = groupContext.extensions.find((e) => e.extensionType === defaultExtensionTypes.required_capabilities);\n if (requiredCapabilities !== undefined) {\n const caps = requiredCapabilities.extensionData;\n const leafSupportsCapabilities = capabiltiesAreSupported(caps, leafNode.capabilities);\n if (!leafSupportsCapabilities)\n return new ValidationError(\"LeafNode does not support required capabilities\");\n }\n const extensionsSupported = extensionsSupportedByCapabilities(leafNode.extensions, leafNode.capabilities);\n if (!extensionsSupported)\n return new ValidationError(\"LeafNode contains extension not listed in capabilities\");\n}\nasync function validateLeafNodeKeyPackage(leafNode, groupContext, sentByClient, config, authService, s) {\n const signatureValid = await verifyLeafNodeSignatureKeyPackage(leafNode, s);\n if (!signatureValid)\n return new CryptoVerificationError(\"Could not verify leaf node signature\");\n //verify lifetime\n if (sentByClient || config.validateLifetimeOnReceive) {\n if (leafNode.leafNodeSource === leafNodeSources.key_package) {\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n if (leafNode.lifetime.notBefore > currentTime || leafNode.lifetime.notAfter < currentTime)\n return new ValidationError(\"Current time not within Lifetime\");\n }\n }\n const commonError = await validateLeafNodeCommon(leafNode, groupContext, authService);\n if (commonError !== undefined)\n return commonError;\n}\nexport async function validateLeafNodeCredentialAndKeyUniqueness(tree, leafNode, existingLeafIndex) {\n const hpkeKeys = new Set();\n const signatureKeys = new Set();\n for (const [nodeIndex, node] of tree.entries()) {\n if (node?.nodeType === nodeTypes.leaf) {\n const credentialType = leafNode.credential.credentialType;\n if (!node.leaf.capabilities.credentials.includes(credentialType)) {\n return new ValidationError(\"LeafNode has credential that is not supported by member of the group\");\n }\n const hpkeKey = bytesToBase64(node.leaf.hpkePublicKey);\n if (hpkeKeys.has(hpkeKey))\n return new ValidationError(\"hpke keys not unique\");\n else\n hpkeKeys.add(hpkeKey);\n const signatureKey = bytesToBase64(node.leaf.signaturePublicKey);\n if (signatureKeys.has(signatureKey) && existingLeafIndex !== nodeToLeafIndex(toNodeIndex(nodeIndex)))\n return new ValidationError(\"signature keys not unique\");\n else\n signatureKeys.add(signatureKey);\n }\n else if (node?.nodeType === nodeTypes.parent) {\n const hpkeKey = bytesToBase64(node.parent.hpkePublicKey);\n if (hpkeKeys.has(hpkeKey))\n return new ValidationError(\"hpke keys not unique\");\n else\n hpkeKeys.add(hpkeKey);\n }\n }\n}\nasync function validateKeyPackage(kp, groupContext, tree, sentByClient, config, authService, s) {\n if (kp.cipherSuite !== groupContext.cipherSuite)\n return new ValidationError(\"Invalid CipherSuite\");\n if (kp.version !== groupContext.version)\n return new ValidationError(\"Invalid mls version\");\n const leafNodeConsistentWithTree = await validateLeafNodeCredentialAndKeyUniqueness(tree, kp.leafNode);\n if (leafNodeConsistentWithTree !== undefined)\n return leafNodeConsistentWithTree;\n const leafNodeError = await validateLeafNodeKeyPackage(kp.leafNode, groupContext, sentByClient, config, authService, s);\n if (leafNodeError !== undefined)\n return leafNodeError;\n const signatureValid = await verifyKeyPackage(kp, s);\n if (!signatureValid)\n return new CryptoVerificationError(\"Invalid keypackage signature\");\n if (constantTimeEqual(kp.initKey, kp.leafNode.hpkePublicKey))\n return new ValidationError(\"Cannot have identicial init and encryption keys\");\n}\nfunction validateReinit(allProposals, reinit, gc) {\n if (allProposals.length !== 1)\n return new ValidationError(\"Reinit proposal needs to be commited by itself\");\n if (reinit.version < gc.version)\n return new ValidationError(\"A ReInit proposal cannot use a version less than the version for the current group\");\n}\nfunction validateExternalInit(grouped) {\n if (grouped[defaultProposalTypes.external_init].length > 1)\n return new ValidationError(\"Cannot contain more than one external_init proposal\");\n if (grouped[defaultProposalTypes.remove].length > 1)\n return new ValidationError(\"Cannot contain more than one remove proposal\");\n if (grouped[defaultProposalTypes.add].length > 0 ||\n grouped[defaultProposalTypes.group_context_extensions].length > 0 ||\n grouped[defaultProposalTypes.reinit].length > 0 ||\n grouped[defaultProposalTypes.update].length > 0)\n return new ValidationError(\"Invalid proposals\");\n}\nfunction validateRemove(remove, tree) {\n if (tree[leafToNodeIndex(toLeafIndex(remove.removed))] === undefined)\n return new ValidationError(\"Tried to remove empty leaf node\");\n}\nexport async function applyProposals(state, mutableTree, proposals, committerLeafIndex, pskSearch, sentByClient, clientConfig, authService, cs) {\n const allProposals = proposals.reduce((acc, cur) => {\n if (cur.proposalOrRefType === proposalOrRefTypes.proposal)\n return [...acc, { proposal: cur.proposal, senderLeafIndex: committerLeafIndex }];\n const p = state.unappliedProposals[bytesToBase64(cur.reference)];\n if (p === undefined)\n throw new ValidationError(\"Could not find proposal with supplied reference\");\n return [...acc, p];\n }, []);\n const grouped = allProposals.reduce((acc, cur) => {\n //this skips any custom proposals\n if (isDefaultProposal(cur.proposal)) {\n const proposalType = cur.proposal.proposalType;\n const proposals = acc[proposalType] ?? [];\n return { ...acc, [cur.proposal.proposalType]: [...proposals, cur] };\n }\n else {\n return acc;\n }\n }, emptyProposals);\n const zeroes = new Uint8Array(cs.kdf.size);\n const isExternalInit = grouped[defaultProposalTypes.external_init].length > 0;\n if (!isExternalInit) {\n if (grouped[defaultProposalTypes.reinit].length > 0) {\n const reinit = grouped[defaultProposalTypes.reinit].at(0).proposal.reinit;\n throwIfDefined(validateReinit(allProposals, reinit, state.groupContext));\n return {\n pskSecret: zeroes,\n pskIds: [],\n needsUpdatePath: false,\n additionalResult: {\n kind: \"reinit\",\n reinit,\n },\n selfRemoved: false,\n allProposals,\n };\n }\n throwIfDefined(await validateProposals(grouped, committerLeafIndex, state.groupContext, clientConfig.keyPackageEqualityConfig, authService, mutableTree));\n const newExtensions = flattenExtensions(grouped[defaultProposalTypes.group_context_extensions]);\n const addedLeafNodes = await applyTreeMutations(mutableTree, grouped, state.groupContext, sentByClient, authService, clientConfig.lifetimeConfig, cs.signature);\n const [updatedPskSecret, pskIds] = await accumulatePskSecret(grouped[defaultProposalTypes.psk].map((p) => p.proposal.psk.preSharedKeyId), pskSearch, cs, zeroes);\n const selfRemoved = mutableTree[leafToNodeIndex(toLeafIndex(state.privatePath.leafIndex))] === undefined;\n const needsUpdatePath = allProposals.length === 0 ||\n Object.values(grouped[defaultProposalTypes.update]).length > 1 ||\n Object.values(grouped[defaultProposalTypes.remove]).length > 1;\n return {\n pskSecret: updatedPskSecret,\n additionalResult: {\n kind: \"memberCommit\",\n addedLeafNodes,\n extensions: newExtensions,\n },\n pskIds,\n needsUpdatePath,\n selfRemoved,\n allProposals,\n };\n }\n else {\n throwIfDefined(validateExternalInit(grouped));\n grouped[defaultProposalTypes.remove].forEach(({ proposal }) => {\n removeLeafNodeMutable(mutableTree, toLeafIndex(proposal.remove.removed));\n });\n const zeroes = new Uint8Array(cs.kdf.size);\n const [updatedPskSecret, pskIds] = await accumulatePskSecret(grouped[defaultProposalTypes.psk].map((p) => p.proposal.psk.preSharedKeyId), pskSearch, cs, zeroes);\n const initProposal = grouped[defaultProposalTypes.external_init].at(0);\n const externalKeyPair = await cs.hpke.deriveKeyPair(state.keySchedule.externalSecret);\n const externalInitSecret = await importSecret(await cs.hpke.exportPrivateKey(externalKeyPair.privateKey), initProposal.proposal.externalInit.kemOutput, cs);\n return {\n needsUpdatePath: true,\n pskSecret: updatedPskSecret,\n pskIds,\n additionalResult: {\n kind: \"externalCommit\",\n externalInitSecret,\n newMemberLeafIndex: nodeToLeafIndex(findBlankLeafNodeIndexOrExtend(mutableTree)),\n },\n selfRemoved: false,\n allProposals,\n };\n }\n}\n/** @public */\nexport function makePskIndex(state, externalPsks) {\n return {\n findPsk(preSharedKeyId) {\n if (preSharedKeyId.psktype === pskTypes.external) {\n return externalPsks[bytesToBase64(preSharedKeyId.pskId)];\n }\n if (state !== undefined && constantTimeEqual(preSharedKeyId.pskGroupId, state.groupContext.groupId)) {\n if (preSharedKeyId.pskEpoch === state.groupContext.epoch)\n return state.keySchedule.resumptionPsk;\n else\n return state.historicalReceiverData.get(preSharedKeyId.pskEpoch)?.resumptionPsk;\n }\n },\n };\n}\nexport async function nextEpochContext(groupContext, wireformat, content, signature, updatedTreeHash, confirmationTag, h) {\n const interimTranscriptHash = await createInterimHash(groupContext.confirmedTranscriptHash, confirmationTag, h);\n const newConfirmedHash = await createConfirmedHash(interimTranscriptHash, { wireformat: wireformats[wireformat], content, signature }, h);\n return {\n ...groupContext,\n epoch: groupContext.epoch + 1n,\n treeHash: updatedTreeHash,\n confirmedTranscriptHash: newConfirmedHash,\n };\n}\n/** @public */\nexport async function joinGroup(params) {\n const res = await joinGroupInternal(params);\n return res.state;\n}\nexport async function joinGroupInternal(params) {\n const context = params.context;\n const welcome = params.welcome;\n const keyPackage = params.keyPackage;\n const privateKeys = params.privateKeys;\n const pskSearch = makePskIndex(params.resumingFromState, context.externalPsks ?? {});\n const authService = context.authService;\n const cs = context.cipherSuite;\n const clientConfig = context.clientConfig ?? defaultClientConfig;\n const ratchetTree = params.ratchetTree;\n const resumingFromState = params.resumingFromState;\n const keyPackageRef = await makeKeyPackageRef(keyPackage, cs.hash);\n const privKey = await cs.hpke.importPrivateKey(privateKeys.initPrivateKey);\n const groupSecrets = await decryptGroupSecrets(privKey, keyPackageRef, welcome, cs.hpke);\n if (groupSecrets === undefined)\n throw new CodecError(\"Could not decode group secrets\");\n const zeroes = new Uint8Array(cs.kdf.size);\n const [pskSecret, pskIds] = await accumulatePskSecret(groupSecrets.psks, pskSearch, cs, zeroes);\n const gi = await decryptGroupInfo(welcome, groupSecrets.joinerSecret, pskSecret, cs);\n if (gi === undefined)\n throw new CodecError(\"Could not decode group info\");\n const resumptionPsk = pskIds.find((id) => id.psktype === pskTypes.resumption);\n if (resumptionPsk !== undefined) {\n if (resumingFromState === undefined)\n throw new ValidationError(\"No prior state passed for resumption\");\n if (resumptionPsk.pskEpoch !== resumingFromState.groupContext.epoch)\n throw new ValidationError(\"Epoch mismatch\");\n if (!constantTimeEqual(resumptionPsk.pskGroupId, resumingFromState.groupContext.groupId))\n throw new ValidationError(\"old groupId mismatch\");\n if (gi.groupContext.epoch !== 1n)\n throw new ValidationError(\"Resumption must be started at epoch 1\");\n if (resumptionPsk.usage === resumptionPSKUsages.reinit) {\n if (resumingFromState.groupActiveState.kind !== \"suspendedPendingReinit\")\n throw new ValidationError(\"Found reinit psk but no old suspended clientState\");\n if (!constantTimeEqual(resumingFromState.groupActiveState.reinit.groupId, gi.groupContext.groupId))\n throw new ValidationError(\"new groupId mismatch\");\n if (resumingFromState.groupActiveState.reinit.version !== gi.groupContext.version)\n throw new ValidationError(\"Version mismatch\");\n if (resumingFromState.groupActiveState.reinit.cipherSuite !== gi.groupContext.cipherSuite)\n throw new ValidationError(\"Ciphersuite mismatch\");\n if (!extensionsEqual(resumingFromState.groupActiveState.reinit.extensions, gi.groupContext.extensions))\n throw new ValidationError(\"Extensions mismatch\");\n }\n }\n const allExtensionsSupported = extensionsSupportedByCapabilities(gi.groupContext.extensions, keyPackage.leafNode.capabilities);\n if (!allExtensionsSupported)\n throw new UsageError(\"client does not support every extension in the GroupContext\");\n const tree = ratchetTreeFromExtension(gi) ?? ratchetTree;\n if (tree === undefined)\n throw new UsageError(\"No RatchetTree passed and no ratchet_tree extension\");\n const signerNode = tree[leafToNodeIndex(toLeafIndex(gi.signer))];\n if (signerNode === undefined) {\n throw new ValidationError(\"Could not find signer leafNode\");\n }\n if (signerNode.nodeType === nodeTypes.parent)\n throw new ValidationError(\"Expected non blank leaf node\");\n const credentialVerified = await authService.validateCredential(signerNode.leaf.credential, signerNode.leaf.signaturePublicKey);\n if (!credentialVerified)\n throw new ValidationError(\"Could not validate credential\");\n const groupInfoSignatureVerified = await verifyGroupInfoSignature(gi, signerNode.leaf.signaturePublicKey, cs.signature);\n if (!groupInfoSignatureVerified)\n throw new CryptoVerificationError(\"Could not verify groupInfo signature\");\n if (gi.groupContext.cipherSuite !== keyPackage.cipherSuite)\n throw new ValidationError(\"cipher suite in the GroupInfo does not match the cipher_suite in the KeyPackage\");\n throwIfDefined(await validateRatchetTree(tree, gi.groupContext, clientConfig.lifetimeConfig, authService, gi.groupContext.treeHash, cs));\n const newLeaf = findLeafIndex(tree, keyPackage.leafNode);\n if (newLeaf === undefined)\n throw new ValidationError(\"Could not find own leaf when processing welcome\");\n const privateKeyPath = {\n leafIndex: newLeaf,\n privateKeys: { [leafToNodeIndex(newLeaf)]: privateKeys.hpkePrivateKey },\n };\n const ancestorNodeIndex = firstCommonAncestor(tree, newLeaf, toLeafIndex(gi.signer));\n const updatedPkp = groupSecrets.pathSecret === undefined\n ? privateKeyPath\n : mergePrivateKeyPaths(await toPrivateKeyPath(await pathToRoot(tree, ancestorNodeIndex, groupSecrets.pathSecret, cs.kdf), newLeaf, cs), privateKeyPath);\n const [keySchedule, encryptionSecret] = await deriveKeySchedule(groupSecrets.joinerSecret, pskSecret, gi.groupContext, cs.kdf);\n const confirmationTagVerified = await verifyGroupInfoConfirmationTag(gi, groupSecrets.joinerSecret, pskSecret, cs);\n if (!confirmationTagVerified)\n throw new CryptoVerificationError(\"Could not verify confirmation tag\");\n const secretTree = createSecretTree(leafWidth(tree.length), encryptionSecret);\n zeroOutUint8Array(groupSecrets.joinerSecret);\n return {\n state: {\n groupContext: gi.groupContext,\n ratchetTree: tree,\n privatePath: updatedPkp,\n signaturePrivateKey: privateKeys.signaturePrivateKey,\n confirmationTag: gi.confirmationTag,\n unappliedProposals: {},\n keySchedule,\n secretTree,\n historicalReceiverData: new Map(),\n groupActiveState: { kind: \"active\" },\n },\n groupInfoExtensions: gi.extensions,\n };\n}\n/** @public */\nexport async function joinGroupWithExtensions(params) {\n return joinGroupInternal(params);\n}\n/** @public */\nexport async function createGroup(params) {\n const { context, groupId, keyPackage, privateKeyPackage } = params;\n const extensions = params.extensions ?? [];\n const authService = context.authService;\n const cs = context.cipherSuite;\n const ratchetTree = [{ nodeType: nodeTypes.leaf, leaf: keyPackage.leafNode }];\n const privatePath = {\n leafIndex: 0,\n privateKeys: { [0]: privateKeyPackage.hpkePrivateKey },\n };\n const confirmedTranscriptHash = new Uint8Array();\n const groupContext = {\n version: protocolVersions.mls10,\n cipherSuite: cs.id,\n epoch: 0n,\n treeHash: await treeHashRoot(ratchetTree, cs.hash),\n groupId,\n extensions,\n confirmedTranscriptHash,\n };\n throwIfDefined(await validateExternalSenders(extensions, authService));\n const epochSecret = cs.rng.randomBytes(cs.kdf.size);\n const keySchedule = await initializeKeySchedule(epochSecret, cs.kdf);\n const confirmationTag = await createConfirmationTag(keySchedule.confirmationKey, confirmedTranscriptHash, cs.hash);\n const encryptionSecret = await deriveSecret(epochSecret, \"encryption\", cs.kdf);\n const secretTree = createSecretTree(1, encryptionSecret);\n zeroOutUint8Array(epochSecret);\n return {\n ratchetTree,\n keySchedule,\n secretTree,\n privatePath,\n signaturePrivateKey: privateKeyPackage.signaturePrivateKey,\n unappliedProposals: {},\n historicalReceiverData: new Map(),\n groupContext,\n confirmationTag,\n groupActiveState: { kind: \"active\" },\n };\n}\nexport async function exportSecret(publicKey, cs) {\n return cs.hpke.exportSecret(await cs.hpke.importPublicKey(publicKey), new TextEncoder().encode(\"MLS 1.0 external init secret\"), cs.kdf.size, new Uint8Array());\n}\nasync function importSecret(privateKey, kemOutput, cs) {\n return cs.hpke.importSecret(await cs.hpke.importPrivateKey(privateKey), new TextEncoder().encode(\"MLS 1.0 external init secret\"), kemOutput, cs.kdf.size, new Uint8Array());\n}\nasync function applyTreeMutations(mutableTree, grouped, gc, sentByClient, authService, lifetimeConfig, s) {\n for (const { senderLeafIndex, proposal } of grouped[defaultProposalTypes.update]) {\n if (senderLeafIndex === undefined)\n throw new InternalError(\"No sender index found for update proposal\");\n throwIfDefined(await validateLeafNodeUpdateOrCommit(proposal.update.leafNode, senderLeafIndex, gc, authService, s));\n throwIfDefined(await validateLeafNodeCredentialAndKeyUniqueness(mutableTree, proposal.update.leafNode, senderLeafIndex));\n updateLeafNodeMutable(mutableTree, proposal.update.leafNode, toLeafIndex(senderLeafIndex));\n }\n grouped[defaultProposalTypes.remove].forEach(({ proposal }) => {\n throwIfDefined(validateRemove(proposal.remove, mutableTree));\n removeLeafNodeMutable(mutableTree, toLeafIndex(proposal.remove.removed));\n });\n const addedLNs = new Array(grouped[defaultProposalTypes.add].length);\n for (const [index, { proposal }] of grouped[defaultProposalTypes.add].entries()) {\n throwIfDefined(await validateKeyPackage(proposal.add.keyPackage, gc, mutableTree, sentByClient, lifetimeConfig, authService, s));\n const leafNodeIndex = addLeafNodeMutable(mutableTree, proposal.add.keyPackage.leafNode);\n addedLNs[index] = [nodeToLeafIndex(leafNodeIndex), proposal.add.keyPackage];\n }\n return addedLNs;\n}\nexport async function processProposal(state, content, proposal, h) {\n const ref = await makeProposalRef(content, h);\n return {\n ...state,\n unappliedProposals: addUnappliedProposal(ref, state.unappliedProposals, proposal, getSenderLeafNodeIndex(content.content.sender)),\n };\n}\nexport function addHistoricalReceiverData(state, clientConfig) {\n const withNew = addToMap(state.historicalReceiverData, state.groupContext.epoch, {\n secretTree: state.secretTree,\n ratchetTree: state.ratchetTree,\n senderDataSecret: state.keySchedule.senderDataSecret,\n groupContext: state.groupContext,\n resumptionPsk: state.keySchedule.resumptionPsk,\n });\n const epochs = [...withNew.keys()];\n const result = epochs.length >= clientConfig.keyRetentionConfig.retainKeysForEpochs\n ? removeOldHistoricalReceiverData(withNew, clientConfig.keyRetentionConfig.retainKeysForEpochs)\n : [withNew, []];\n return result;\n}\nfunction removeOldHistoricalReceiverData(historicalReceiverData, max) {\n const sortedEpochs = [...historicalReceiverData.keys()].sort((a, b) => (a < b ? -1 : 1));\n const cutoff = sortedEpochs.length - max;\n const toBeDeleted = new Array();\n const map = new Map();\n for (const [n, epoch] of sortedEpochs.entries()) {\n const data = historicalReceiverData.get(epoch);\n if (n < cutoff) {\n toBeDeleted.push(...allSecretTreeValues(data.secretTree));\n }\n else {\n map.set(epoch, data);\n }\n }\n return [new Map(sortedEpochs.slice(-max).map((epoch) => [epoch, historicalReceiverData.get(epoch)])), []];\n}\n//# sourceMappingURL=clientState.js.map","import { uint64Decoder, uint64Encoder } from \"./codec/number.js\";\nimport { mapDecoders } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encode } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenDataEncoder } from \"./codec/variableLength.js\";\nimport { commitDecoder, commitEncoder } from \"./commit.js\";\nimport { contentTypes, contentTypeEncoder, contentTypeDecoder } from \"./contentType.js\";\nimport { framedContentAuthDataCommitDecoder, framedContentAuthDataEncoder, } from \"./framedContent.js\";\nimport { byteLengthToPad } from \"./paddingConfig.js\";\nimport { proposalDecoder, proposalEncoder } from \"./proposal.js\";\nimport { senderDataDecoder, senderDataEncoder, senderDataAADEncoder, expandSenderDataKey, expandSenderDataNonce, senderTypes, } from \"./sender.js\";\nimport { wireformats } from \"./wireformat.js\";\nexport const privateMessageEncoder = contramapBufferEncoders([varLenDataEncoder, uint64Encoder, contentTypeEncoder, varLenDataEncoder, varLenDataEncoder, varLenDataEncoder], (msg) => [msg.groupId, msg.epoch, msg.contentType, msg.authenticatedData, msg.encryptedSenderData, msg.ciphertext]);\nexport const privateMessageDecoder = mapDecoders([varLenDataDecoder, uint64Decoder, contentTypeDecoder, varLenDataDecoder, varLenDataDecoder, varLenDataDecoder], (groupId, epoch, contentType, authenticatedData, encryptedSenderData, ciphertext) => ({\n groupId,\n epoch,\n contentType,\n authenticatedData,\n encryptedSenderData,\n ciphertext,\n}));\nexport const privateContentAADEncoder = contramapBufferEncoders([varLenDataEncoder, uint64Encoder, contentTypeEncoder, varLenDataEncoder], (aad) => [aad.groupId, aad.epoch, aad.contentType, aad.authenticatedData]);\nexport const privateContentAADDecoder = mapDecoders([varLenDataDecoder, uint64Decoder, contentTypeDecoder, varLenDataDecoder], (groupId, epoch, contentType, authenticatedData) => ({\n groupId,\n epoch,\n contentType,\n authenticatedData,\n}));\nexport function privateMessageContentDecoder(contentType) {\n switch (contentType) {\n case contentTypes.application:\n return rWithPaddingDecoder(mapDecoders([varLenDataDecoder, varLenDataDecoder], (applicationData, signature) => ({\n contentType,\n applicationData,\n auth: { contentType, signature },\n })));\n case contentTypes.proposal:\n return rWithPaddingDecoder(mapDecoders([proposalDecoder, varLenDataDecoder], (proposal, signature) => ({\n contentType,\n proposal,\n auth: { contentType, signature },\n })));\n case contentTypes.commit:\n return rWithPaddingDecoder(mapDecoders([commitDecoder, varLenDataDecoder, framedContentAuthDataCommitDecoder], (commit, signature, auth) => ({\n contentType,\n commit,\n auth: { ...auth, signature, contentType },\n })));\n }\n}\nexport function privateMessageContentEncoder(config) {\n return (msg) => {\n switch (msg.contentType) {\n case contentTypes.application:\n return encoderWithPadding(contramapBufferEncoders([varLenDataEncoder, framedContentAuthDataEncoder], (m) => [m.applicationData, m.auth]), config)(msg);\n case contentTypes.proposal:\n return encoderWithPadding(contramapBufferEncoders([proposalEncoder, framedContentAuthDataEncoder], (m) => [m.proposal, m.auth]), config)(msg);\n case contentTypes.commit:\n return encoderWithPadding(contramapBufferEncoders([commitEncoder, framedContentAuthDataEncoder], (m) => [m.commit, m.auth]), config)(msg);\n }\n };\n}\nexport async function decryptSenderData(msg, senderDataSecret, cs) {\n const key = await expandSenderDataKey(cs, senderDataSecret, msg.ciphertext);\n const nonce = await expandSenderDataNonce(cs, senderDataSecret, msg.ciphertext);\n const aad = {\n groupId: msg.groupId,\n epoch: msg.epoch,\n contentType: msg.contentType,\n };\n const decrypted = await cs.hpke.decryptAead(key, nonce, encode(senderDataAADEncoder, aad), msg.encryptedSenderData);\n return senderDataDecoder(decrypted, 0)?.[0];\n}\nexport async function encryptSenderData(senderDataSecret, senderData, aad, ciphertext, cs) {\n const key = await expandSenderDataKey(cs, senderDataSecret, ciphertext);\n const nonce = await expandSenderDataNonce(cs, senderDataSecret, ciphertext);\n return await cs.hpke.encryptAead(key, nonce, encode(senderDataAADEncoder, aad), encode(senderDataEncoder, senderData));\n}\nexport function toAuthenticatedContent(content, msg, senderLeafIndex) {\n return {\n wireformat: wireformats.mls_private_message,\n content: {\n groupId: msg.groupId,\n epoch: msg.epoch,\n sender: {\n senderType: senderTypes.member,\n leafIndex: senderLeafIndex,\n },\n authenticatedData: msg.authenticatedData,\n ...content,\n },\n auth: content.auth,\n };\n}\nfunction encoderWithPadding(encoder, config) {\n return (t) => {\n const [len, write] = encoder(t);\n const totalLength = len + byteLengthToPad(len, config);\n return [\n totalLength,\n (offset, buffer) => {\n write(offset, buffer);\n },\n ];\n };\n}\nfunction rWithPaddingDecoder(decoder) {\n return (bytes, offset) => {\n const result = decoder(bytes, offset);\n if (result === undefined)\n return undefined;\n const [decoded, innerOffset] = result;\n const paddingBytes = bytes.subarray(offset + innerOffset, bytes.length);\n const allZeroes = paddingBytes.every((byte) => byte === 0);\n if (!allZeroes)\n return undefined;\n return [decoded, bytes.length];\n };\n}\n//# sourceMappingURL=privateMessage.js.map","import { makeProposalRef } from \"./authenticatedContent.js\";\nimport { signFramedContentApplicationOrProposal, verifyFramedContentSignature, } from \"./framedContent.js\";\nimport { privateMessageContentDecoder, decryptSenderData, encryptSenderData, privateContentAADEncoder, privateMessageContentEncoder, toAuthenticatedContent, } from \"./privateMessage.js\";\nimport { consumeRatchet, ratchetToGeneration } from \"./secretTree.js\";\nimport { getSignaturePublicKeyFromLeafIndex } from \"./ratchetTree.js\";\nimport { senderTypes } from \"./sender.js\";\nimport { leafToNodeIndex, toLeafIndex } from \"./treemath.js\";\nimport { CryptoVerificationError, CodecError, ValidationError } from \"./mlsError.js\";\nimport { encode } from \"./codec/tlsEncoder.js\";\nimport { nodeTypes } from \"./nodeType.js\";\nimport { contentTypes } from \"./contentType.js\";\nimport { wireformats } from \"./wireformat.js\";\nexport async function protectApplicationData(signKey, senderDataSecret, applicationData, authenticatedData, groupContext, secretTree, leafIndex, paddingConfig, cs) {\n const tbs = {\n protocolVersion: groupContext.version,\n wireformat: wireformats.mls_private_message,\n content: {\n contentType: contentTypes.application,\n applicationData,\n groupId: groupContext.groupId,\n epoch: groupContext.epoch,\n sender: {\n senderType: senderTypes.member,\n leafIndex: leafIndex,\n },\n authenticatedData,\n },\n senderType: senderTypes.member,\n context: groupContext,\n };\n const auth = await signFramedContentApplicationOrProposal(signKey, tbs, cs);\n const content = {\n ...tbs.content,\n auth,\n };\n const result = await protect(senderDataSecret, authenticatedData, groupContext, secretTree, content, leafIndex, paddingConfig, cs);\n return { newSecretTree: result.tree, privateMessage: result.privateMessage, consumed: result.consumed };\n}\nexport async function protectProposal(signKey, senderDataSecret, p, authenticatedData, groupContext, secretTree, leafIndex, paddingConfig, cs) {\n const tbs = {\n protocolVersion: groupContext.version,\n wireformat: wireformats.mls_private_message,\n content: {\n contentType: contentTypes.proposal,\n proposal: p,\n groupId: groupContext.groupId,\n epoch: groupContext.epoch,\n sender: {\n senderType: senderTypes.member,\n leafIndex,\n },\n authenticatedData,\n },\n senderType: senderTypes.member,\n context: groupContext,\n };\n const auth = await signFramedContentApplicationOrProposal(signKey, tbs, cs);\n const content = { ...tbs.content, auth };\n const protectResult = await protect(senderDataSecret, authenticatedData, groupContext, secretTree, content, leafIndex, paddingConfig, cs);\n const newSecretTree = protectResult.tree;\n const authenticatedContent = {\n wireformat: wireformats.mls_private_message,\n content,\n auth,\n };\n const proposalRef = await makeProposalRef(authenticatedContent, cs.hash);\n return { privateMessage: protectResult.privateMessage, newSecretTree, proposalRef, consumed: protectResult.consumed };\n}\nexport async function protect(senderDataSecret, authenticatedData, groupContext, secretTree, content, leafIndex, config, cs) {\n const { newTree, generation, reuseGuard, nonce, key, consumed } = await consumeRatchet(secretTree, toLeafIndex(leafIndex), content.contentType, cs);\n const aad = {\n groupId: groupContext.groupId,\n epoch: groupContext.epoch,\n contentType: content.contentType,\n authenticatedData: authenticatedData,\n };\n const ciphertext = await cs.hpke.encryptAead(key, nonce, encode(privateContentAADEncoder, aad), encode(privateMessageContentEncoder(config), content));\n const senderData = {\n leafIndex,\n generation,\n reuseGuard,\n };\n const senderAad = {\n groupId: groupContext.groupId,\n epoch: groupContext.epoch,\n contentType: content.contentType,\n };\n const encryptedSenderData = await encryptSenderData(senderDataSecret, senderData, senderAad, ciphertext, cs);\n return {\n privateMessage: {\n groupId: groupContext.groupId,\n epoch: groupContext.epoch,\n encryptedSenderData,\n contentType: content.contentType,\n authenticatedData,\n ciphertext,\n },\n tree: newTree,\n consumed,\n };\n}\nexport async function unprotectPrivateMessage(senderDataSecret, msg, secretTree, ratchetTree, groupContext, config, cs, overrideSignatureKey) {\n const senderData = await decryptSenderData(msg, senderDataSecret, cs);\n if (senderData === undefined)\n throw new CodecError(\"Could not decode senderdata\");\n validateSenderData(senderData, ratchetTree);\n const { key, nonce, newTree, consumed } = await ratchetToGeneration(secretTree, senderData, msg.contentType, config, cs);\n const aad = {\n groupId: msg.groupId,\n epoch: msg.epoch,\n contentType: msg.contentType,\n authenticatedData: msg.authenticatedData,\n };\n const decrypted = await cs.hpke.decryptAead(key, nonce, encode(privateContentAADEncoder, aad), msg.ciphertext);\n const pmc = privateMessageContentDecoder(msg.contentType)(decrypted, 0)?.[0];\n if (pmc === undefined)\n throw new CodecError(\"Could not decode PrivateMessageContent\");\n const content = toAuthenticatedContent(pmc, msg, senderData.leafIndex);\n const signaturePublicKey = overrideSignatureKey !== undefined\n ? overrideSignatureKey\n : getSignaturePublicKeyFromLeafIndex(ratchetTree, toLeafIndex(senderData.leafIndex));\n const signatureValid = await verifyFramedContentSignature(signaturePublicKey, wireformats.mls_private_message, content.content, content.auth, groupContext, cs.signature);\n if (!signatureValid)\n throw new CryptoVerificationError(\"Signature invalid\");\n return { tree: newTree, content, consumed };\n}\nfunction validateSenderData(senderData, tree) {\n if (tree[leafToNodeIndex(toLeafIndex(senderData.leafIndex))]?.nodeType !== nodeTypes.leaf)\n return new ValidationError(\"SenderData did not point to a non-blank leaf node\");\n}\n//# sourceMappingURL=messageProtection.js.map","import { flatMapDecoder, mapDecoder, mapDecoders, succeedDecoder } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders, encVoid } from \"./codec/tlsEncoder.js\";\nimport { varLenDataDecoder, varLenDataEncoder } from \"./codec/variableLength.js\";\nimport { framedContentDecoder, framedContentAuthDataDecoder, framedContentEncoder, framedContentAuthDataEncoder, } from \"./framedContent.js\";\nimport { ValidationError } from \"./mlsError.js\";\nimport { defaultProposalTypes } from \"./defaultProposalType.js\";\nimport { defaultExtensionTypes } from \"./defaultExtensionType.js\";\nimport { getSignaturePublicKeyFromLeafIndex } from \"./ratchetTree.js\";\nimport { senderTypes } from \"./sender.js\";\nimport { toLeafIndex } from \"./treemath.js\";\nimport { isDefaultProposal } from \"./proposal.js\";\nimport { contentTypes } from \"./contentType.js\";\nconst publicMessageInfoEncoder = (info) => {\n switch (info.senderType) {\n case senderTypes.member:\n return varLenDataEncoder(info.membershipTag);\n case senderTypes.external:\n case senderTypes.new_member_proposal:\n case senderTypes.new_member_commit:\n return encVoid;\n }\n};\nfunction publicMessageInfoDecoder(senderType) {\n switch (senderType) {\n case senderTypes.member:\n return mapDecoder(varLenDataDecoder, (membershipTag) => ({\n senderType,\n membershipTag,\n }));\n case senderTypes.external:\n case senderTypes.new_member_proposal:\n case senderTypes.new_member_commit:\n return succeedDecoder({ senderType });\n }\n}\nexport const publicMessageEncoder = contramapBufferEncoders([framedContentEncoder, framedContentAuthDataEncoder, publicMessageInfoEncoder], (msg) => [msg.content, msg.auth, msg]);\nexport const publicMessageDecoder = flatMapDecoder(framedContentDecoder, (content) => mapDecoders([framedContentAuthDataDecoder(content.contentType), publicMessageInfoDecoder(content.sender.senderType)], (auth, info) => ({\n ...info,\n content,\n auth,\n})));\nexport function findSignaturePublicKey(ratchetTree, groupContext, framedContent) {\n switch (framedContent.sender.senderType) {\n case senderTypes.member:\n return getSignaturePublicKeyFromLeafIndex(ratchetTree, toLeafIndex(framedContent.sender.leafIndex));\n case senderTypes.external: {\n const sender = senderFromExtension(groupContext.extensions, framedContent.sender.senderIndex);\n if (sender === undefined)\n throw new ValidationError(\"Received external but no external_sender extension\");\n return sender.signaturePublicKey;\n }\n case senderTypes.new_member_proposal:\n if (framedContent.contentType !== contentTypes.proposal)\n throw new ValidationError(\"Received new_member_proposal but contentType is not proposal\");\n if (!isDefaultProposal(framedContent.proposal) ||\n framedContent.proposal.proposalType !== defaultProposalTypes.add)\n throw new ValidationError(\"Received new_member_proposal but proposalType was not add\");\n return framedContent.proposal.add.keyPackage.leafNode.signaturePublicKey;\n case senderTypes.new_member_commit: {\n if (framedContent.contentType !== contentTypes.commit)\n throw new ValidationError(\"Received new_member_commit but contentType is not commit\");\n if (framedContent.commit.path === undefined)\n throw new ValidationError(\"Commit contains no update path\");\n return framedContent.commit.path.leafNode.signaturePublicKey;\n }\n }\n}\nfunction senderFromExtension(extensions, senderIndex) {\n const externalSenderExtensions = extensions.filter((ex) => ex.extensionType === defaultExtensionTypes.external_senders);\n const externalSenderExtension = externalSenderExtensions[senderIndex];\n if (externalSenderExtension !== undefined) {\n return externalSenderExtension.extensionData;\n }\n}\n//# sourceMappingURL=publicMessage.js.map","import { createMembershipTag, verifyMembershipTag, } from \"./authenticatedContent.js\";\nimport { signFramedContentApplicationOrProposal, toTbs, verifyFramedContentSignature, } from \"./framedContent.js\";\nimport { CryptoVerificationError, UsageError } from \"./mlsError.js\";\nimport { findSignaturePublicKey } from \"./publicMessage.js\";\nimport { senderTypes } from \"./sender.js\";\nimport { contentTypes } from \"./contentType.js\";\nimport { wireformats } from \"./wireformat.js\";\nexport async function protectProposalPublic(signKey, membershipKey, groupContext, authenticatedData, proposal, leafIndex, cs) {\n const framedContent = {\n groupId: groupContext.groupId,\n epoch: groupContext.epoch,\n sender: { senderType: senderTypes.member, leafIndex },\n contentType: contentTypes.proposal,\n authenticatedData,\n proposal,\n };\n const tbs = {\n protocolVersion: groupContext.version,\n wireformat: wireformats.mls_public_message,\n content: framedContent,\n senderType: senderTypes.member,\n context: groupContext,\n };\n const auth = await signFramedContentApplicationOrProposal(signKey, tbs, cs);\n const authenticatedContent = {\n wireformat: wireformats.mls_public_message,\n content: framedContent,\n auth,\n };\n const msg = await protectPublicMessage(membershipKey, groupContext, authenticatedContent, cs);\n return { publicMessage: msg };\n}\nexport async function protectExternalProposalPublic(signKey, groupContext, authenticatedData, proposal, sender, cs) {\n const framedContent = {\n groupId: groupContext.groupId,\n epoch: groupContext.epoch,\n sender,\n contentType: contentTypes.proposal,\n authenticatedData,\n proposal,\n };\n const tbs = {\n protocolVersion: groupContext.version,\n wireformat: wireformats.mls_public_message,\n content: framedContent,\n senderType: sender.senderType,\n context: groupContext,\n };\n const auth = await signFramedContentApplicationOrProposal(signKey, tbs, cs);\n const msg = {\n content: framedContent,\n auth,\n senderType: sender.senderType,\n };\n return { publicMessage: msg };\n}\nexport async function protectPublicMessage(membershipKey, groupContext, content, cs) {\n if (content.content.contentType === contentTypes.application)\n throw new UsageError(\"Can't make an application message public\");\n if (content.content.sender.senderType === senderTypes.member) {\n const authenticatedContent = {\n contentTbs: toTbs(content.content, wireformats.mls_public_message, groupContext),\n auth: content.auth,\n };\n const tag = await createMembershipTag(membershipKey, authenticatedContent, cs.hash);\n return {\n content: content.content,\n auth: content.auth,\n senderType: senderTypes.member,\n membershipTag: tag,\n };\n }\n return {\n content: content.content,\n auth: content.auth,\n senderType: content.content.sender.senderType,\n };\n}\nexport async function unprotectPublicMessage(membershipKey, groupContext, ratchetTree, msg, cs, overrideSignatureKey) {\n if (msg.content.contentType === contentTypes.application)\n throw new UsageError(\"Can't make an application message public\");\n if (msg.senderType === senderTypes.member) {\n const authenticatedContent = {\n contentTbs: toTbs(msg.content, wireformats.mls_public_message, groupContext),\n auth: msg.auth,\n };\n if (!(await verifyMembershipTag(membershipKey, authenticatedContent, msg.membershipTag, cs.hash)))\n throw new CryptoVerificationError(\"Could not verify membership\");\n }\n const signaturePublicKey = overrideSignatureKey !== undefined\n ? overrideSignatureKey\n : findSignaturePublicKey(ratchetTree, groupContext, msg.content);\n const signatureValid = await verifyFramedContentSignature(signaturePublicKey, wireformats.mls_public_message, msg.content, msg.auth, groupContext, cs.signature);\n if (!signatureValid)\n throw new CryptoVerificationError(\"Signature invalid\");\n return {\n wireformat: wireformats.mls_public_message,\n content: msg.content,\n auth: msg.auth,\n };\n}\n//# sourceMappingURL=messageProtectionPublic.js.map","import { addHistoricalReceiverData, makePskIndex, throwIfDefined, validateRatchetTree } from \"./clientState.js\";\nimport { applyProposals, nextEpochContext, exportSecret, checkCanSendHandshakeMessages, } from \"./clientState.js\";\nimport { protocolVersions } from \"./protocolVersion.js\";\nimport { decryptWithLabel } from \"./crypto/hpke.js\";\nimport { deriveSecret } from \"./crypto/kdf.js\";\nimport { createContentCommitSignature, createConfirmationTag, } from \"./framedContent.js\";\nimport { contentTypes } from \"./contentType.js\";\nimport { senderTypes } from \"./sender.js\";\nimport { groupContextEncoder } from \"./groupContext.js\";\nimport { ratchetTreeFromExtension, signGroupInfo, verifyGroupInfoSignature, } from \"./groupInfo.js\";\nimport { makeKeyPackageRef } from \"./keyPackage.js\";\nimport { initializeEpoch } from \"./keySchedule.js\";\nimport { protect } from \"./messageProtection.js\";\nimport { protectPublicMessage } from \"./messageProtectionPublic.js\";\nimport { pathToPathSecrets } from \"./pathSecrets.js\";\nimport { mergePrivateKeyPaths, updateLeafKey, toPrivateKeyPath } from \"./privateKeyPath.js\";\nimport { defaultProposalTypes } from \"./defaultProposalType.js\";\nimport { defaultExtensionTypes } from \"./defaultExtensionType.js\";\nimport { proposalOrRefTypes } from \"./proposalOrRefType.js\";\nimport { nodeTypes } from \"./nodeType.js\";\nimport { ratchetTreeEncoder, getCredentialFromLeafIndex, getSignaturePublicKeyFromLeafIndex, removeLeafNodeMutable, addLeafNodeMutable, } from \"./ratchetTree.js\";\nimport { createSecretTree } from \"./secretTree.js\";\nimport { treeHashRoot } from \"./treeHash.js\";\nimport { leafWidth, nodeToLeafIndex, toLeafIndex, toNodeIndex } from \"./treemath.js\";\nimport { createUpdatePath, firstCommonAncestor, firstMatchAncestor } from \"./updatePath.js\";\nimport { base64ToBytes, zeroOutUint8Array } from \"./util/byteArray.js\";\nimport { encryptGroupInfo, encryptGroupSecrets } from \"./welcome.js\";\nimport { CryptoVerificationError, InternalError, UsageError, ValidationError } from \"./mlsError.js\";\nimport { defaultClientConfig } from \"./clientConfig.js\";\nimport { extensionsSupportedByCapabilities } from \"./extension.js\";\nimport { encode } from \"./codec/tlsEncoder.js\";\nimport { wireformats } from \"./wireformat.js\";\nexport async function createCommitInternal(params) {\n const { context, state, resumingFromState: pskState, ...options } = params;\n const { cipherSuite } = context;\n const pskIndex = makePskIndex(pskState, context.externalPsks ?? {});\n const clientConfig = context.clientConfig ?? defaultClientConfig;\n const { wireAsPublicMessage = false, extraProposals = [], ratchetTreeExtension = false, authenticatedData = new Uint8Array(), groupInfoExtensions = [], } = options;\n checkCanSendHandshakeMessages(state);\n const wireformat = wireAsPublicMessage ? \"mls_public_message\" : \"mls_private_message\";\n const allProposals = bundleAllProposals(state, extraProposals);\n const mutableTree = state.ratchetTree.slice();\n const res = await applyProposals(state, mutableTree, allProposals, toLeafIndex(state.privatePath.leafIndex), pskIndex, true, clientConfig, context.authService, cipherSuite);\n if (res.additionalResult.kind === \"externalCommit\")\n throw new UsageError(\"Cannot create externalCommit as a member\");\n const suspendedPendingReinit = res.additionalResult.kind === \"reinit\" ? res.additionalResult.reinit : undefined;\n const [tree, updatePath, pathSecrets, newPrivateKey] = res.needsUpdatePath\n ? await createUpdatePath(state.ratchetTree, mutableTree, toLeafIndex(state.privatePath.leafIndex), state.groupContext, state.signaturePrivateKey, cipherSuite)\n : [mutableTree, undefined, [], undefined];\n const updatedExtensions = res.additionalResult.kind === \"memberCommit\" && res.additionalResult.extensions.length > 0\n ? res.additionalResult.extensions\n : state.groupContext.extensions;\n const groupContextWithExtensions = { ...state.groupContext, extensions: updatedExtensions };\n const privateKeys = mergePrivateKeyPaths(newPrivateKey !== undefined\n ? updateLeafKey(state.privatePath, await cipherSuite.hpke.exportPrivateKey(newPrivateKey))\n : state.privatePath, await toPrivateKeyPath(pathToPathSecrets(pathSecrets), state.privatePath.leafIndex, cipherSuite));\n const lastPathSecret = pathSecrets.at(-1);\n const commitSecret = lastPathSecret === undefined\n ? new Uint8Array(cipherSuite.kdf.size)\n : await deriveSecret(lastPathSecret.secret, \"path\", cipherSuite.kdf);\n const { signature, framedContent } = await createContentCommitSignature(state.groupContext, wireformat, { proposals: allProposals, path: updatePath }, { senderType: senderTypes.member, leafIndex: state.privatePath.leafIndex }, authenticatedData, state.signaturePrivateKey, cipherSuite.signature);\n const treeHash = await treeHashRoot(tree, cipherSuite.hash);\n const updatedGroupContext = await nextEpochContext(groupContextWithExtensions, wireformat, framedContent, signature, treeHash, state.confirmationTag, cipherSuite.hash);\n const epochSecrets = await initializeEpoch(state.keySchedule.initSecret, commitSecret, updatedGroupContext, res.pskSecret, cipherSuite.kdf);\n const confirmationTag = await createConfirmationTag(epochSecrets.keySchedule.confirmationKey, updatedGroupContext.confirmedTranscriptHash, cipherSuite.hash);\n const authData = {\n contentType: framedContent.contentType,\n signature,\n confirmationTag,\n };\n const [commit, _newTree, consumedSecrets] = await protectCommit(wireAsPublicMessage, state, clientConfig, authenticatedData, framedContent, authData, cipherSuite);\n const welcome = await createWelcome(ratchetTreeExtension, updatedGroupContext, confirmationTag, state, tree, cipherSuite, epochSecrets, res, pathSecrets, groupInfoExtensions);\n const groupActiveState = res.selfRemoved\n ? { kind: \"removedFromGroup\" }\n : suspendedPendingReinit !== undefined\n ? { kind: \"suspendedPendingReinit\", reinit: suspendedPendingReinit }\n : { kind: \"active\" };\n const [historicalReceiverData, consumedEpochData] = addHistoricalReceiverData(state, clientConfig);\n const newState = {\n groupContext: updatedGroupContext,\n ratchetTree: tree,\n secretTree: createSecretTree(leafWidth(tree.length), epochSecrets.encryptionSecret),\n keySchedule: epochSecrets.keySchedule,\n privatePath: privateKeys,\n unappliedProposals: {},\n historicalReceiverData,\n confirmationTag,\n signaturePrivateKey: state.signaturePrivateKey,\n groupActiveState,\n };\n zeroOutUint8Array(commitSecret);\n zeroOutUint8Array(epochSecrets.joinerSecret);\n const consumed = [...consumedSecrets, ...consumedEpochData, state.keySchedule.initSecret];\n const mlsWelcome = welcome\n ? { welcome, wireformat: wireformats.mls_welcome, version: protocolVersions.mls10 }\n : undefined;\n return { newState, welcome: mlsWelcome, commit, consumed };\n}\n/** @public */\nexport async function createCommit(params) {\n return createCommitInternal(params);\n}\nfunction bundleAllProposals(state, extraProposals) {\n const refs = Object.keys(state.unappliedProposals).map((p) => ({\n proposalOrRefType: proposalOrRefTypes.reference,\n reference: base64ToBytes(p),\n }));\n const proposals = extraProposals.map((p) => ({\n proposalOrRefType: proposalOrRefTypes.proposal,\n proposal: p,\n }));\n return [...refs, ...proposals];\n}\nasync function createWelcome(ratchetTreeExtension, groupContext, confirmationTag, state, tree, cs, epochSecrets, res, pathSecrets, extensions) {\n const groupInfo = ratchetTreeExtension\n ? await createGroupInfoWithRatchetTree(groupContext, confirmationTag, state, tree, extensions, cs)\n : await createGroupInfo(groupContext, confirmationTag, state, extensions, cs);\n const encryptedGroupInfo = await encryptGroupInfo(groupInfo, epochSecrets.welcomeSecret, cs);\n const encryptedGroupSecrets = res.additionalResult.kind === \"memberCommit\"\n ? await Promise.all(res.additionalResult.addedLeafNodes.map(([leafNodeIndex, keyPackage]) => {\n return createEncryptedGroupSecrets(tree, leafNodeIndex, state, pathSecrets, cs, keyPackage, encryptedGroupInfo, epochSecrets, res);\n }))\n : [];\n return encryptedGroupSecrets.length > 0\n ? {\n cipherSuite: groupContext.cipherSuite,\n secrets: encryptedGroupSecrets,\n encryptedGroupInfo,\n }\n : undefined;\n}\nasync function createEncryptedGroupSecrets(tree, leafNodeIndex, state, pathSecrets, cs, keyPackage, encryptedGroupInfo, epochSecrets, res) {\n const nodeIndex = firstCommonAncestor(tree, leafNodeIndex, toLeafIndex(state.privatePath.leafIndex));\n const pathSecret = pathSecrets.find((ps) => ps.nodeIndex === nodeIndex);\n const pk = await cs.hpke.importPublicKey(keyPackage.initKey);\n const egs = await encryptGroupSecrets(pk, encryptedGroupInfo, { joinerSecret: epochSecrets.joinerSecret, pathSecret: pathSecret?.secret, psks: res.pskIds }, cs.hpke);\n const ref = await makeKeyPackageRef(keyPackage, cs.hash);\n return { newMember: ref, encryptedGroupSecrets: { kemOutput: egs.enc, ciphertext: egs.ct } };\n}\nasync function createGroupInfo(groupContext, confirmationTag, state, extensions, cs) {\n const groupInfoTbs = {\n groupContext: groupContext,\n extensions: extensions,\n confirmationTag,\n signer: state.privatePath.leafIndex,\n };\n return signGroupInfo(groupInfoTbs, state.signaturePrivateKey, cs.signature);\n}\nasync function createGroupInfoWithRatchetTree(groupContext, confirmationTag, state, tree, extensions, cs) {\n const gi = await createGroupInfo(groupContext, confirmationTag, state, [\n ...extensions,\n { extensionType: defaultExtensionTypes.ratchet_tree, extensionData: encode(ratchetTreeEncoder, tree) },\n ], cs);\n return gi;\n}\n/** @public */\nexport async function createGroupInfoWithExternalPub(state, extensions, cs) {\n const externalKeyPair = await cs.hpke.deriveKeyPair(state.keySchedule.externalSecret);\n const externalPub = await cs.hpke.exportPublicKey(externalKeyPair.publicKey);\n const gi = await createGroupInfo(state.groupContext, state.confirmationTag, state, [...extensions, { extensionType: defaultExtensionTypes.external_pub, extensionData: externalPub }], cs);\n return gi;\n}\n/** @public */\nexport async function createGroupInfoWithExternalPubAndRatchetTree(state, extensions, cs) {\n const encodedTree = encode(ratchetTreeEncoder, state.ratchetTree);\n const externalKeyPair = await cs.hpke.deriveKeyPair(state.keySchedule.externalSecret);\n const externalPub = await cs.hpke.exportPublicKey(externalKeyPair.publicKey);\n const gi = await createGroupInfo(state.groupContext, state.confirmationTag, state, [\n ...extensions,\n { extensionType: defaultExtensionTypes.external_pub, extensionData: externalPub },\n { extensionType: defaultExtensionTypes.ratchet_tree, extensionData: encodedTree },\n ], cs);\n return gi;\n}\nasync function protectCommit(publicMessage, state, clientConfig, authenticatedData, content, authData, cs) {\n const wireformat = publicMessage ? wireformats.mls_public_message : wireformats.mls_private_message;\n const authenticatedContent = {\n wireformat,\n content,\n auth: authData,\n };\n if (publicMessage) {\n const msg = await protectPublicMessage(state.keySchedule.membershipKey, state.groupContext, authenticatedContent, cs);\n return [\n { version: protocolVersions.mls10, wireformat: wireformats.mls_public_message, publicMessage: msg },\n state.secretTree,\n [],\n ];\n }\n else {\n const res = await protect(state.keySchedule.senderDataSecret, authenticatedData, state.groupContext, state.secretTree, { ...content, auth: authData }, state.privatePath.leafIndex, clientConfig.paddingConfig, cs);\n return [\n {\n version: protocolVersions.mls10,\n wireformat: wireformats.mls_private_message,\n privateMessage: res.privateMessage,\n },\n res.tree,\n res.consumed,\n ];\n }\n}\nexport async function applyUpdatePathSecret(tree, privatePath, senderLeafIndex, gc, path, excludeNodes, cs) {\n const { nodeIndex: ancestorNodeIndex, resolution, updateNode, } = firstMatchAncestor(tree, toLeafIndex(privatePath.leafIndex), senderLeafIndex, path);\n for (const [i, nodeIndex] of filterNewLeaves(resolution, excludeNodes).entries()) {\n if (privatePath.privateKeys[nodeIndex] !== undefined) {\n const key = await cs.hpke.importPrivateKey(privatePath.privateKeys[nodeIndex]);\n const ct = updateNode.encryptedPathSecret[i];\n const pathSecret = await decryptWithLabel(key, \"UpdatePathNode\", encode(groupContextEncoder, gc), ct.kemOutput, ct.ciphertext, cs.hpke);\n return { nodeIndex: ancestorNodeIndex, pathSecret };\n }\n }\n throw new InternalError(\"No overlap between provided private keys and update path\");\n}\n/** @public */\nexport async function joinGroupExternal(params) {\n const context = params.context;\n const groupInfo = params.groupInfo;\n const keyPackage = params.keyPackage;\n const privateKeys = params.privateKeys;\n const resync = params.resync;\n const authService = context.authService;\n const cs = context.cipherSuite;\n const clientConfig = context.clientConfig ?? defaultClientConfig;\n const tree = params.tree;\n const authenticatedData = params.authenticatedData ?? new Uint8Array();\n const externalPub = groupInfo.extensions.find((ex) => ex.extensionType === defaultExtensionTypes.external_pub);\n if (externalPub === undefined)\n throw new UsageError(\"Could not find external_pub extension\");\n const allExtensionsSupported = extensionsSupportedByCapabilities(groupInfo.groupContext.extensions, keyPackage.leafNode.capabilities);\n if (!allExtensionsSupported)\n throw new UsageError(\"client does not support every extension in the GroupContext\");\n const { enc, secret: initSecret } = await exportSecret(externalPub.extensionData, cs);\n //copy tree if not\n const ratchetTree = ratchetTreeFromExtension(groupInfo) ?? tree?.slice();\n if (ratchetTree === undefined)\n throw new UsageError(\"No RatchetTree passed and no ratchet_tree extension\");\n const mutableTree = ratchetTree;\n throwIfDefined(await validateRatchetTree(ratchetTree, groupInfo.groupContext, clientConfig.lifetimeConfig, authService, groupInfo.groupContext.treeHash, cs));\n const signaturePublicKey = getSignaturePublicKeyFromLeafIndex(ratchetTree, toLeafIndex(groupInfo.signer));\n const signerCredential = getCredentialFromLeafIndex(ratchetTree, toLeafIndex(groupInfo.signer));\n const credentialVerified = await authService.validateCredential(signerCredential, signaturePublicKey);\n if (!credentialVerified)\n throw new ValidationError(\"Could not validate credential\");\n const groupInfoSignatureVerified = await verifyGroupInfoSignature(groupInfo, signaturePublicKey, cs.signature);\n if (!groupInfoSignatureVerified)\n throw new CryptoVerificationError(\"Could not verify groupInfo Signature\");\n const formerLeafIndex = resync\n ? nodeToLeafIndex(toNodeIndex(ratchetTree.findIndex((n) => {\n if (n !== undefined && n.nodeType === nodeTypes.leaf) {\n return clientConfig.keyPackageEqualityConfig.compareKeyPackageToLeafNode(keyPackage, n.leaf);\n }\n return false;\n })))\n : undefined;\n if (formerLeafIndex !== undefined)\n removeLeafNodeMutable(mutableTree, formerLeafIndex);\n const newLeafNodeIndex = addLeafNodeMutable(mutableTree, keyPackage.leafNode);\n const [newTree, updatePath, pathSecrets, newPrivateKey] = await createUpdatePath(ratchetTree, mutableTree, nodeToLeafIndex(newLeafNodeIndex), groupInfo.groupContext, privateKeys.signaturePrivateKey, cs);\n const privateKeyPath = updateLeafKey(await toPrivateKeyPath(pathToPathSecrets(pathSecrets), nodeToLeafIndex(newLeafNodeIndex), cs), await cs.hpke.exportPrivateKey(newPrivateKey));\n const lastPathSecret = pathSecrets.at(-1);\n const commitSecret = lastPathSecret === undefined\n ? new Uint8Array(cs.kdf.size)\n : await deriveSecret(lastPathSecret.secret, \"path\", cs.kdf);\n const externalInitProposal = {\n proposalType: defaultProposalTypes.external_init,\n externalInit: { kemOutput: enc },\n };\n const proposals = formerLeafIndex !== undefined\n ? [{ proposalType: defaultProposalTypes.remove, remove: { removed: formerLeafIndex } }, externalInitProposal]\n : [externalInitProposal];\n const pskSecret = new Uint8Array(cs.kdf.size);\n const { signature, framedContent } = await createContentCommitSignature(groupInfo.groupContext, \"mls_public_message\", {\n proposals: proposals.map((p) => ({ proposalOrRefType: proposalOrRefTypes.proposal, proposal: p })),\n path: updatePath,\n }, {\n senderType: senderTypes.new_member_commit,\n }, authenticatedData, privateKeys.signaturePrivateKey, cs.signature);\n const treeHash = await treeHashRoot(newTree, cs.hash);\n const groupContext = await nextEpochContext(groupInfo.groupContext, \"mls_public_message\", framedContent, signature, treeHash, groupInfo.confirmationTag, cs.hash);\n const epochSecrets = await initializeEpoch(initSecret, commitSecret, groupContext, pskSecret, cs.kdf);\n const confirmationTag = await createConfirmationTag(epochSecrets.keySchedule.confirmationKey, groupContext.confirmedTranscriptHash, cs.hash);\n const state = {\n ratchetTree: newTree,\n groupContext: groupContext,\n secretTree: createSecretTree(leafWidth(newTree.length), epochSecrets.encryptionSecret),\n privatePath: privateKeyPath,\n confirmationTag,\n historicalReceiverData: new Map(),\n signaturePrivateKey: privateKeys.signaturePrivateKey,\n keySchedule: epochSecrets.keySchedule,\n unappliedProposals: {},\n groupActiveState: { kind: \"active\" },\n };\n const authenticatedContent = {\n content: framedContent,\n auth: { signature, confirmationTag, contentType: contentTypes.commit },\n wireformat: wireformats.mls_public_message,\n };\n const msg = await protectPublicMessage(epochSecrets.keySchedule.membershipKey, groupContext, authenticatedContent, cs);\n zeroOutUint8Array(commitSecret);\n zeroOutUint8Array(initSecret);\n zeroOutUint8Array(epochSecrets.joinerSecret);\n return { publicMessage: msg, newState: state };\n}\nfunction filterNewLeaves(resolution, excludeNodes) {\n const set = new Set(excludeNodes);\n return resolution.filter((i) => !set.has(i));\n}\n//# sourceMappingURL=createCommit.js.map","import { checkCanSendApplicationMessages, processProposal } from \"./clientState.js\";\nimport { protectProposal, protectApplicationData } from \"./messageProtection.js\";\nimport { protectProposalPublic } from \"./messageProtectionPublic.js\";\nimport { addUnappliedProposal } from \"./unappliedProposals.js\";\nimport { protocolVersions } from \"./protocolVersion.js\";\nimport { wireformats } from \"./wireformat.js\";\nimport { defaultClientConfig } from \"./clientConfig.js\";\n/** @public */\nexport async function createProposal(params) {\n const context = params.context;\n const state = params.state;\n const cs = context.cipherSuite;\n const ad = params.authenticatedData ?? new Uint8Array();\n const clientConfig = context.clientConfig ?? defaultClientConfig;\n const publicMessage = params.wireAsPublicMessage ?? false;\n const proposal = params.proposal;\n if (publicMessage) {\n const result = await protectProposalPublic(state.signaturePrivateKey, state.keySchedule.membershipKey, state.groupContext, ad, proposal, state.privatePath.leafIndex, cs);\n const newState = await processProposal(state, {\n content: result.publicMessage.content,\n auth: result.publicMessage.auth,\n wireformat: wireformats.mls_public_message,\n }, proposal, cs.hash);\n return {\n newState,\n message: {\n wireformat: wireformats.mls_public_message,\n version: protocolVersions.mls10,\n publicMessage: result.publicMessage,\n },\n consumed: [],\n };\n }\n else {\n const result = await protectProposal(state.signaturePrivateKey, state.keySchedule.senderDataSecret, proposal, ad, state.groupContext, state.secretTree, state.privatePath.leafIndex, clientConfig.paddingConfig, cs);\n const newState = {\n ...state,\n secretTree: result.newSecretTree,\n unappliedProposals: addUnappliedProposal(result.proposalRef, state.unappliedProposals, proposal, state.privatePath.leafIndex),\n };\n return {\n newState,\n message: {\n wireformat: wireformats.mls_private_message,\n version: protocolVersions.mls10,\n privateMessage: result.privateMessage,\n },\n consumed: result.consumed,\n };\n }\n}\n/** @public */\nexport async function createApplicationMessage(params) {\n const context = params.context;\n const state = params.state;\n const cs = context.cipherSuite;\n const ad = params.authenticatedData ?? new Uint8Array();\n const clientConfig = context.clientConfig ?? defaultClientConfig;\n const message = params.message;\n checkCanSendApplicationMessages(state);\n const result = await protectApplicationData(state.signaturePrivateKey, state.keySchedule.senderDataSecret, message, ad, state.groupContext, state.secretTree, state.privatePath.leafIndex, clientConfig.paddingConfig, cs);\n return {\n newState: { ...state, secretTree: result.newSecretTree },\n message: {\n version: protocolVersions.mls10,\n wireformat: wireformats.mls_private_message,\n privateMessage: result.privateMessage,\n },\n consumed: result.consumed,\n };\n}\n//# sourceMappingURL=createMessage.js.map","/** @public */\nexport const acceptAll = () => \"accept\";\n//# sourceMappingURL=incomingMessageAction.js.map","import { addHistoricalReceiverData, applyProposals, makePskIndex, nextEpochContext, processProposal, throwIfDefined, validateLeafNodeCredentialAndKeyUniqueness, validateLeafNodeUpdateOrCommit, } from \"./clientState.js\";\nimport { applyUpdatePathSecret } from \"./createCommit.js\";\nimport { deriveSecret } from \"./crypto/kdf.js\";\nimport { verifyConfirmationTag } from \"./framedContent.js\";\nimport { acceptAll } from \"./incomingMessageAction.js\";\nimport { initializeEpoch } from \"./keySchedule.js\";\nimport { unprotectPrivateMessage } from \"./messageProtection.js\";\nimport { unprotectPublicMessage } from \"./messageProtectionPublic.js\";\nimport { CryptoVerificationError, InternalError, ValidationError } from \"./mlsError.js\";\nimport { pathToRoot } from \"./pathSecrets.js\";\nimport { mergePrivateKeyPaths, toPrivateKeyPath } from \"./privateKeyPath.js\";\nimport { findBlankLeafNodeIndex, addLeafNodeMutable } from \"./ratchetTree.js\";\nimport { createSecretTree } from \"./secretTree.js\";\nimport { getSenderLeafNodeIndex, senderTypes } from \"./sender.js\";\nimport { treeHashRoot } from \"./treeHash.js\";\nimport { leafToNodeIndex, leafWidth, nodeToLeafIndex, root, toLeafIndex, toNodeIndex, } from \"./treemath.js\";\nimport { applyUpdatePath } from \"./updatePath.js\";\nimport { addToMap } from \"./util/addToMap.js\";\nimport { wireformats } from \"./wireformat.js\";\nimport { zeroOutUint8Array } from \"./util/byteArray.js\";\nimport { contentTypes } from \"./contentType.js\";\nimport { defaultClientConfig } from \"./clientConfig.js\";\n/**\n * Process private message and apply proposal or commit and return the updated ClientState or return an application message\n *\n * @public\n */\nexport async function processPrivateMessage(params) {\n const context = params.context;\n const state = params.state;\n const cipherSuite = context.cipherSuite;\n const pskSearch = makePskIndex(state, context.externalPsks ?? {});\n const auth = context.authService;\n const cb = params.callback ?? acceptAll;\n const clientConfig = context.clientConfig ?? defaultClientConfig;\n const pm = params.privateMessage;\n if (pm.epoch < state.groupContext.epoch) {\n const receiverData = state.historicalReceiverData.get(pm.epoch);\n if (receiverData !== undefined) {\n const result = await unprotectPrivateMessage(receiverData.senderDataSecret, pm, receiverData.secretTree, receiverData.ratchetTree, receiverData.groupContext, clientConfig.keyRetentionConfig, cipherSuite);\n const newHistoricalReceiverData = addToMap(state.historicalReceiverData, pm.epoch, {\n ...receiverData,\n secretTree: result.tree,\n });\n const newState = { ...state, historicalReceiverData: newHistoricalReceiverData };\n if (result.content.content.contentType === contentTypes.application) {\n return {\n kind: \"applicationMessage\",\n message: result.content.content.applicationData,\n newState,\n consumed: result.consumed,\n aad: result.content.content.authenticatedData,\n };\n }\n else {\n throw new ValidationError(\"Cannot process commit or proposal from former epoch\");\n }\n }\n else {\n throw new ValidationError(\"Cannot process message, epoch too old\");\n }\n }\n const result = await unprotectPrivateMessage(state.keySchedule.senderDataSecret, pm, state.secretTree, state.ratchetTree, state.groupContext, clientConfig.keyRetentionConfig, cipherSuite);\n const updatedState = { ...state, secretTree: result.tree };\n if (result.content.content.contentType === contentTypes.application) {\n return {\n kind: \"applicationMessage\",\n message: result.content.content.applicationData,\n newState: updatedState,\n consumed: result.consumed,\n aad: result.content.content.authenticatedData,\n };\n }\n else if (result.content.content.contentType === contentTypes.commit) {\n if (result.content.auth.contentType !== result.content.content.contentType)\n throw new ValidationError(\"Received content as commit, but not auth\");\n const { newState, actionTaken, consumed } = await processCommit(updatedState, result.content.content, result.content.auth, \"mls_private_message\", pskSearch, cb, auth, clientConfig, cipherSuite);\n return {\n kind: \"newState\",\n newState,\n actionTaken,\n consumed: [...result.consumed, ...consumed],\n aad: result.content.content.authenticatedData,\n };\n }\n else {\n const action = cb({\n kind: \"proposal\",\n proposal: {\n proposal: result.content.content.proposal,\n senderLeafIndex: getSenderLeafNodeIndex(result.content.content.sender),\n },\n });\n if (action === \"reject\")\n return {\n kind: \"newState\",\n newState: updatedState,\n actionTaken: action,\n consumed: result.consumed,\n aad: result.content.content.authenticatedData,\n };\n else\n return {\n kind: \"newState\",\n newState: await processProposal(updatedState, result.content, result.content.content.proposal, cipherSuite.hash),\n actionTaken: action,\n consumed: result.consumed,\n aad: result.content.content.authenticatedData,\n };\n }\n}\n/** @public */\nexport async function processPublicMessage(params) {\n const context = params.context;\n const state = params.state;\n const cipherSuite = context.cipherSuite;\n const pskSearch = makePskIndex(state, context.externalPsks ?? {});\n const auth = context.authService;\n const clientConfig = context.clientConfig ?? defaultClientConfig;\n const pm = params.publicMessage;\n const callback = params.callback ?? acceptAll;\n if (pm.content.epoch < state.groupContext.epoch)\n throw new ValidationError(\"Cannot process message, epoch too old\");\n const content = await unprotectPublicMessage(state.keySchedule.membershipKey, state.groupContext, state.ratchetTree, pm, cipherSuite);\n if (content.content.contentType === contentTypes.proposal) {\n const action = callback({\n kind: \"proposal\",\n proposal: { proposal: content.content.proposal, senderLeafIndex: getSenderLeafNodeIndex(content.content.sender) },\n });\n if (action === \"reject\")\n return {\n newState: state,\n actionTaken: action,\n consumed: [],\n aad: content.content.authenticatedData,\n };\n else\n return {\n newState: await processProposal(state, content, content.content.proposal, cipherSuite.hash),\n actionTaken: action,\n consumed: [],\n aad: content.content.authenticatedData,\n };\n }\n else {\n if (content.auth.contentType !== content.content.contentType)\n throw new ValidationError(\"Received content as commit, but not auth\");\n return processCommit(state, content.content, content.auth, \"mls_public_message\", pskSearch, callback, auth, clientConfig, cipherSuite);\n }\n}\nasync function processCommit(state, content, auth, wireformat, pskSearch, callback, authService, clientConfig, cs) {\n if (content.epoch !== state.groupContext.epoch)\n throw new ValidationError(\"Could not validate epoch\");\n const senderLeafIndex = content.sender.senderType === senderTypes.member ? toLeafIndex(content.sender.leafIndex) : undefined;\n const mutableTree = state.ratchetTree.slice();\n const result = await applyProposals(state, mutableTree, content.commit.proposals, senderLeafIndex, pskSearch, false, clientConfig, authService, cs);\n const action = callback({ kind: \"commit\", senderLeafIndex, proposals: result.allProposals });\n if (action === \"reject\") {\n return { newState: state, actionTaken: action, consumed: [], aad: content.authenticatedData };\n }\n if (content.commit.path !== undefined) {\n const committerLeafIndex = senderLeafIndex ??\n (result.additionalResult.kind === \"externalCommit\" ? result.additionalResult.newMemberLeafIndex : undefined);\n if (committerLeafIndex === undefined)\n throw new ValidationError(\"Cannot verify commit leaf node because no commiter leaf index found\");\n throwIfDefined(await validateLeafNodeUpdateOrCommit(content.commit.path.leafNode, committerLeafIndex, state.groupContext, authService, cs.signature));\n throwIfDefined(await validateLeafNodeCredentialAndKeyUniqueness(mutableTree, content.commit.path.leafNode, committerLeafIndex));\n }\n if (result.needsUpdatePath && content.commit.path === undefined)\n throw new ValidationError(\"Update path is required\");\n const groupContextWithExtensions = result.additionalResult.kind === \"memberCommit\" && result.additionalResult.extensions.length > 0\n ? { ...state.groupContext, extensions: result.additionalResult.extensions }\n : state.groupContext;\n const [pkp, commitSecret, newTreeHash] = await applyTreeUpdate(content.commit.path, content.sender, mutableTree, cs, state, groupContextWithExtensions, result.additionalResult.kind === \"memberCommit\"\n ? result.additionalResult.addedLeafNodes.map((l) => leafToNodeIndex(toLeafIndex(l[0])))\n : [findBlankLeafNodeIndex(mutableTree) ?? toNodeIndex(mutableTree.length + 1)], cs.kdf);\n const updatedGroupContext = await nextEpochContext(groupContextWithExtensions, wireformat, content, auth.signature, newTreeHash, state.confirmationTag, cs.hash);\n const initSecret = result.additionalResult.kind === \"externalCommit\"\n ? result.additionalResult.externalInitSecret\n : state.keySchedule.initSecret;\n const epochSecrets = await initializeEpoch(initSecret, commitSecret, updatedGroupContext, result.pskSecret, cs.kdf);\n const confirmationTagValid = await verifyConfirmationTag(epochSecrets.keySchedule.confirmationKey, auth.confirmationTag, updatedGroupContext.confirmedTranscriptHash, cs.hash);\n if (!confirmationTagValid)\n throw new CryptoVerificationError(\"Could not verify confirmation tag\");\n const secretTree = createSecretTree(leafWidth(mutableTree.length), epochSecrets.encryptionSecret);\n const suspendedPendingReinit = result.additionalResult.kind === \"reinit\" ? result.additionalResult.reinit : undefined;\n const groupActiveState = result.selfRemoved\n ? { kind: \"removedFromGroup\" }\n : suspendedPendingReinit !== undefined\n ? { kind: \"suspendedPendingReinit\", reinit: suspendedPendingReinit }\n : { kind: \"active\" };\n const [historicalReceiverData, consumedEpochData] = addHistoricalReceiverData(state, clientConfig);\n zeroOutUint8Array(commitSecret);\n zeroOutUint8Array(epochSecrets.joinerSecret);\n const consumed = [...consumedEpochData, initSecret];\n return {\n newState: {\n ...state,\n secretTree,\n ratchetTree: mutableTree,\n privatePath: pkp,\n groupContext: updatedGroupContext,\n keySchedule: epochSecrets.keySchedule,\n confirmationTag: auth.confirmationTag,\n historicalReceiverData,\n unappliedProposals: {},\n groupActiveState,\n },\n actionTaken: action,\n consumed,\n aad: content.authenticatedData,\n };\n}\nasync function applyTreeUpdate(path, sender, mutableTree, cs, state, groupContext, excludeNodes, kdf) {\n if (path === undefined)\n return [state.privatePath, new Uint8Array(kdf.size), await treeHashRoot(mutableTree, cs.hash)]; // can we reuse existing hash here?\n if (sender.senderType === senderTypes.member) {\n await applyUpdatePath(mutableTree, toLeafIndex(sender.leafIndex), path, cs.hash);\n const newTreeHash = await treeHashRoot(mutableTree, cs.hash);\n const [pkp, commitSecret] = await updatePrivateKeyPath(mutableTree, state, toLeafIndex(sender.leafIndex), { ...groupContext, treeHash: newTreeHash, epoch: groupContext.epoch + 1n }, path, excludeNodes, cs);\n return [pkp, commitSecret, newTreeHash];\n }\n else {\n const leafNodeIndex = addLeafNodeMutable(mutableTree, path.leafNode);\n const senderLeafIndex = nodeToLeafIndex(leafNodeIndex);\n await applyUpdatePath(mutableTree, senderLeafIndex, path, cs.hash, true);\n const newTreeHash = await treeHashRoot(mutableTree, cs.hash);\n const [pkp, commitSecret] = await updatePrivateKeyPath(mutableTree, state, senderLeafIndex, { ...groupContext, treeHash: newTreeHash, epoch: groupContext.epoch + 1n }, path, excludeNodes, cs);\n return [pkp, commitSecret, newTreeHash];\n }\n}\nasync function updatePrivateKeyPath(tree, state, leafNodeIndex, groupContext, path, excludeNodes, cs) {\n const secret = await applyUpdatePathSecret(tree, state.privatePath, leafNodeIndex, groupContext, path, excludeNodes, cs);\n const pathSecrets = await pathToRoot(tree, toNodeIndex(secret.nodeIndex), secret.pathSecret, cs.kdf);\n const newPkp = mergePrivateKeyPaths(state.privatePath, await toPrivateKeyPath(pathSecrets, state.privatePath.leafIndex, cs));\n const rootIndex = root(leafWidth(tree.length));\n const rootSecret = pathSecrets[rootIndex];\n if (rootSecret === undefined)\n throw new InternalError(\"Could not find secret for root\");\n const commitSecret = await deriveSecret(rootSecret, \"path\", cs.kdf);\n return [newPkp, commitSecret];\n}\n/** @public */\nexport async function processMessage(params) {\n const context = params.context;\n const state = params.state;\n const authService = context.authService;\n const cs = context.cipherSuite;\n const externalPsks = context.externalPsks ?? {};\n const clientConfig = context.clientConfig ?? defaultClientConfig;\n const message = params.message;\n const action = params.callback ?? acceptAll;\n if (message.wireformat === wireformats.mls_public_message) {\n const result = await processPublicMessage({\n context: { cipherSuite: cs, authService, externalPsks, clientConfig },\n state,\n publicMessage: message.publicMessage,\n callback: action,\n });\n return { ...result, kind: \"newState\" };\n }\n else\n return processPrivateMessage({\n context: { cipherSuite: cs, authService, externalPsks: {}, clientConfig },\n state,\n privateMessage: message.privateMessage,\n callback: action,\n });\n}\n//# sourceMappingURL=processMessages.js.map","import { toBufferSource } from \"../../../util/byteArray.js\";\nexport function makeHashImpl(sc, h) {\n return {\n async digest(data) {\n const result = await sc.digest(h, toBufferSource(data));\n return new Uint8Array(result);\n },\n async mac(key, data) {\n const result = await sc.sign(\"HMAC\", await importMacKey(key, h), toBufferSource(data));\n return new Uint8Array(result);\n },\n async verifyMac(key, mac, data) {\n return sc.verify(\"HMAC\", await importMacKey(key, h), toBufferSource(mac), toBufferSource(data));\n },\n };\n}\nfunction importMacKey(rawKey, h) {\n return crypto.subtle.importKey(\"raw\", toBufferSource(rawKey), {\n name: \"HMAC\",\n hash: { name: h },\n }, false, [\"sign\", \"verify\"]);\n}\n//# sourceMappingURL=makeHashImpl.js.map","/**\n * The base error class of hpke-js.\n * @group Errors\n */\nexport class HpkeError extends Error {\n constructor(e) {\n let message;\n if (e instanceof Error) {\n message = e.message;\n }\n else if (typeof e === \"string\") {\n message = e;\n }\n else {\n message = \"\";\n }\n super(message);\n this.name = this.constructor.name;\n }\n}\n/**\n * Invalid parameter.\n * @group Errors\n */\nexport class InvalidParamError extends HpkeError {\n}\n/**\n * KEM input or output validation failure.\n * @group Errors\n */\nexport class ValidationError extends HpkeError {\n}\n/**\n * Public or private key serialization failure.\n * @group Errors\n */\nexport class SerializeError extends HpkeError {\n}\n/**\n * Public or private key deserialization failure.\n * @group Errors\n */\nexport class DeserializeError extends HpkeError {\n}\n/**\n * encap() failure.\n * @group Errors\n */\nexport class EncapError extends HpkeError {\n}\n/**\n * decap() failure.\n * @group Errors\n */\nexport class DecapError extends HpkeError {\n}\n/**\n * Secret export failure.\n * @group Errors\n */\nexport class ExportError extends HpkeError {\n}\n/**\n * seal() failure.\n * @group Errors\n */\nexport class SealError extends HpkeError {\n}\n/**\n * open() failure.\n * @group Errors\n */\nexport class OpenError extends HpkeError {\n}\n/**\n * Sequence number overflow on the encryption context.\n * @group Errors\n */\nexport class MessageLimitReachedError extends HpkeError {\n}\n/**\n * Key pair derivation failure.\n * @group Errors\n */\nexport class DeriveKeyPairError extends HpkeError {\n}\n/**\n * Not supported failure.\n * @group Errors\n */\nexport class NotSupportedError extends HpkeError {\n}\n","const dntGlobals = {};\nexport const dntGlobalThis = createMergeProxy(globalThis, dntGlobals);\nfunction createMergeProxy(baseObj, extObj) {\n return new Proxy(baseObj, {\n get(_target, prop, _receiver) {\n if (prop in extObj) {\n return extObj[prop];\n }\n else {\n return baseObj[prop];\n }\n },\n set(_target, prop, value) {\n if (prop in extObj) {\n delete extObj[prop];\n }\n baseObj[prop] = value;\n return true;\n },\n deleteProperty(_target, prop) {\n let success = false;\n if (prop in extObj) {\n delete extObj[prop];\n success = true;\n }\n if (prop in baseObj) {\n delete baseObj[prop];\n success = true;\n }\n return success;\n },\n ownKeys(_target) {\n const baseKeys = Reflect.ownKeys(baseObj);\n const extKeys = Reflect.ownKeys(extObj);\n const extKeysSet = new Set(extKeys);\n return [...baseKeys.filter((k) => !extKeysSet.has(k)), ...extKeys];\n },\n defineProperty(_target, prop, desc) {\n if (prop in extObj) {\n delete extObj[prop];\n }\n Reflect.defineProperty(baseObj, prop, desc);\n return true;\n },\n getOwnPropertyDescriptor(_target, prop) {\n if (prop in extObj) {\n return Reflect.getOwnPropertyDescriptor(extObj, prop);\n }\n else {\n return Reflect.getOwnPropertyDescriptor(baseObj, prop);\n }\n },\n has(_target, prop) {\n return prop in extObj || prop in baseObj;\n },\n });\n}\n","import * as dntShim from \"../_dnt.shims.js\";\nimport { NotSupportedError } from \"./errors.js\";\nasync function loadSubtleCrypto() {\n if (dntShim.dntGlobalThis !== undefined && globalThis.crypto !== undefined) {\n // Browsers, Node.js >= v19, Cloudflare Workers, Bun, etc.\n return globalThis.crypto.subtle;\n }\n // Node.js <= v18\n try {\n // @ts-ignore: to ignore \"crypto\"\n const { webcrypto } = await import(\"crypto\"); // node:crypto\n return webcrypto.subtle;\n }\n catch (e) {\n throw new NotSupportedError(e);\n }\n}\nexport class NativeAlgorithm {\n constructor() {\n Object.defineProperty(this, \"_api\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: undefined\n });\n }\n async _setup() {\n if (this._api !== undefined) {\n return;\n }\n this._api = await loadSubtleCrypto();\n }\n}\n","/**\n * The supported HPKE modes.\n */\nexport const Mode = {\n Base: 0x00,\n Psk: 0x01,\n Auth: 0x02,\n AuthPsk: 0x03,\n};\n/**\n * The supported Key Encapsulation Mechanism (KEM) identifiers.\n */\nexport const KemId = {\n NotAssigned: 0x0000,\n DhkemP256HkdfSha256: 0x0010,\n DhkemP384HkdfSha384: 0x0011,\n DhkemP521HkdfSha512: 0x0012,\n DhkemSecp256k1HkdfSha256: 0x0013,\n DhkemX25519HkdfSha256: 0x0020,\n DhkemX448HkdfSha512: 0x0021,\n HybridkemX25519Kyber768: 0x0030,\n MlKem512: 0x0040,\n MlKem768: 0x0041,\n MlKem1024: 0x0042,\n XWing: 0x647a,\n};\n/**\n * The supported Key Derivation Function (KDF) identifiers.\n */\nexport const KdfId = {\n HkdfSha256: 0x0001,\n HkdfSha384: 0x0002,\n HkdfSha512: 0x0003,\n Sha3256: 0x0004,\n Sha3384: 0x0005,\n Sha3512: 0x0006,\n Shake128: 0x0010,\n Shake256: 0x0011,\n TurboShake128: 0x0012,\n TurboShake256: 0x0013,\n};\n/**\n * The supported Authenticated Encryption with Associated Data (AEAD) identifiers.\n */\nexport const AeadId = {\n Aes128Gcm: 0x0001,\n Aes256Gcm: 0x0002,\n Chacha20Poly1305: 0x0003,\n ExportOnly: 0xFFFF,\n};\n","// The input length limit (psk, psk_id, info, exporter_context, ikm).\nexport const INPUT_LENGTH_LIMIT = 8192;\nexport const INFO_LENGTH_LIMIT = 268435456;\n// The minimum length of a PSK.\nexport const MINIMUM_PSK_LENGTH = 32;\n// b\"\"\nexport const EMPTY = /* @__PURE__ */ new Uint8Array(0);\n// Common BigInt constants\nexport const N_0 = 0n;\nexport const N_1 = 1n;\nexport const N_2 = 2n;\nexport const N_7 = 7n;\nexport const N_32 = 32n;\nexport const N_256 = 256n;\nexport const N_0x71 = 0x71n;\nexport const BYTE_TO_BIGINT_256 = /* @__PURE__ */ (() => {\n const out = new Array(256);\n let i = 0;\n let value = 0n;\n while (i < 256) {\n out[i] = value;\n i++;\n value += 1n;\n }\n return out;\n})();\n","// b\"KEM\"\nexport const SUITE_ID_HEADER_KEM = /* @__PURE__ */ new Uint8Array([\n 75,\n 69,\n 77,\n 0,\n 0,\n]);\n","import { EMPTY } from \"../consts.js\";\nimport { InvalidParamError } from \"../errors.js\";\nimport { KdfId } from \"../identifiers.js\";\nimport { NativeAlgorithm } from \"../algorithm.js\";\n// b\"HPKE-v1\"\nconst HPKE_VERSION = /* @__PURE__ */ new Uint8Array([\n 72,\n 80,\n 75,\n 69,\n 45,\n 118,\n 49,\n]);\nexport function toUint8Array(input) {\n return new Uint8Array(toArrayBuffer(input));\n}\nexport function toArrayBuffer(input) {\n if (input instanceof ArrayBuffer) {\n return input;\n }\n if (ArrayBuffer.isView(input)) {\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength)\n .slice().buffer;\n }\n return new Uint8Array(input).slice().buffer;\n}\nexport class HkdfNative extends NativeAlgorithm {\n constructor() {\n super();\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: KdfId.HkdfSha256\n });\n Object.defineProperty(this, \"hashSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 0\n });\n Object.defineProperty(this, \"_suiteId\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: EMPTY\n });\n Object.defineProperty(this, \"algHash\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {\n name: \"HMAC\",\n hash: \"SHA-256\",\n length: 256,\n }\n });\n }\n init(suiteId) {\n this._suiteId = suiteId;\n }\n buildLabeledIkm(label, ikm) {\n this._checkInit();\n const ret = new Uint8Array(7 + this._suiteId.byteLength + label.byteLength + ikm.byteLength);\n ret.set(HPKE_VERSION, 0);\n ret.set(this._suiteId, 7);\n ret.set(label, 7 + this._suiteId.byteLength);\n ret.set(ikm, 7 + this._suiteId.byteLength + label.byteLength);\n return ret;\n }\n buildLabeledInfo(label, info, len) {\n this._checkInit();\n const ret = new Uint8Array(9 + this._suiteId.byteLength + label.byteLength + info.byteLength);\n ret.set(new Uint8Array([0, len]), 0);\n ret.set(HPKE_VERSION, 2);\n ret.set(this._suiteId, 9);\n ret.set(label, 9 + this._suiteId.byteLength);\n ret.set(info, 9 + this._suiteId.byteLength + label.byteLength);\n return ret;\n }\n async extract(salt, ikm) {\n await this._setup();\n const saltBuf = salt.byteLength === 0\n ? new ArrayBuffer(this.hashSize)\n : toArrayBuffer(salt);\n if (saltBuf.byteLength !== this.hashSize) {\n throw new InvalidParamError(\"The salt length must be the same as the hashSize\");\n }\n const ikmBuf = toArrayBuffer(ikm);\n const key = await this._api.importKey(\"raw\", saltBuf, this.algHash, false, [\n \"sign\",\n ]);\n return await this._api.sign(\"HMAC\", key, ikmBuf);\n }\n async expand(prk, info, len) {\n await this._setup();\n const prkBuf = toArrayBuffer(prk);\n const key = await this._api.importKey(\"raw\", prkBuf, this.algHash, false, [\n \"sign\",\n ]);\n const okm = new ArrayBuffer(len);\n const okmBytes = new Uint8Array(okm);\n let prev = EMPTY;\n const mid = toUint8Array(info);\n const tail = new Uint8Array(1);\n if (len > 255 * this.hashSize) {\n throw new Error(\"Entropy limit reached\");\n }\n const tmp = new Uint8Array(this.hashSize + mid.length + 1);\n for (let i = 1, cur = 0; cur < okmBytes.length; i++) {\n tail[0] = i;\n tmp.set(prev, 0);\n tmp.set(mid, prev.length);\n tmp.set(tail, prev.length + mid.length);\n prev = new Uint8Array(await this._api.sign(\"HMAC\", key, tmp.slice(0, prev.length + mid.length + 1)));\n if (okmBytes.length - cur >= prev.length) {\n okmBytes.set(prev, cur);\n cur += prev.length;\n }\n else {\n okmBytes.set(prev.slice(0, okmBytes.length - cur), cur);\n cur += okmBytes.length - cur;\n }\n }\n return okm;\n }\n async extractAndExpand(salt, ikm, info, len) {\n await this._setup();\n const ikmBuf = toArrayBuffer(ikm);\n const baseKey = await this._api.importKey(\"raw\", ikmBuf, \"HKDF\", false, [\"deriveBits\"]);\n return await this._api.deriveBits({\n name: \"HKDF\",\n hash: this.algHash.hash,\n salt: toArrayBuffer(salt),\n info: toArrayBuffer(info),\n }, baseKey, len * 8);\n }\n async labeledExtract(salt, label, ikm) {\n return await this.extract(salt, this.buildLabeledIkm(label, ikm));\n }\n async labeledExpand(prk, label, info, len) {\n return await this.expand(prk, this.buildLabeledInfo(label, info, len), len);\n }\n _checkInit() {\n if (this._suiteId === EMPTY) {\n throw new Error(\"Not initialized. Call init()\");\n }\n }\n}\nexport class HkdfSha256Native extends HkdfNative {\n constructor() {\n super(...arguments);\n /** KdfId.HkdfSha256 (0x0001) */\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: KdfId.HkdfSha256\n });\n /** 32 */\n Object.defineProperty(this, \"hashSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 32\n });\n /** The parameters for Web Cryptography API */\n Object.defineProperty(this, \"algHash\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {\n name: \"HMAC\",\n hash: \"SHA-256\",\n length: 256,\n }\n });\n }\n}\nexport class HkdfSha384Native extends HkdfNative {\n constructor() {\n super(...arguments);\n /** KdfId.HkdfSha384 (0x0002) */\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: KdfId.HkdfSha384\n });\n /** 48 */\n Object.defineProperty(this, \"hashSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 48\n });\n /** The parameters for Web Cryptography API */\n Object.defineProperty(this, \"algHash\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {\n name: \"HMAC\",\n hash: \"SHA-384\",\n length: 384,\n }\n });\n }\n}\nexport class HkdfSha512Native extends HkdfNative {\n constructor() {\n super(...arguments);\n /** KdfId.HkdfSha512 (0x0003) */\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: KdfId.HkdfSha512\n });\n /** 64 */\n Object.defineProperty(this, \"hashSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 64\n });\n /** The parameters for Web Cryptography API */\n Object.defineProperty(this, \"algHash\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {\n name: \"HMAC\",\n hash: \"SHA-512\",\n length: 512,\n }\n });\n }\n}\n","import * as dntShim from \"../../_dnt.shims.js\";\nimport { KemId } from \"../identifiers.js\";\nexport const isDenoV1 = () => \n// deno-lint-ignore no-explicit-any\ndntShim.dntGlobalThis.process === undefined;\n/**\n * Checks whether the runtime is Deno or not (Node.js).\n * @returns boolean - true if the runtime is Deno, false Node.js.\n */\nexport function isDeno() {\n // deno-lint-ignore no-explicit-any\n if (dntShim.dntGlobalThis.process === undefined) {\n return true;\n }\n // deno-lint-ignore no-explicit-any\n return dntShim.dntGlobalThis.process?.versions?.deno !== undefined;\n}\n/**\n * Checks whetehr the type of input is CryptoKeyPair or not.\n */\nexport const isCryptoKeyPair = (x) => typeof x === \"object\" &&\n x !== null &&\n typeof x.privateKey === \"object\" &&\n typeof x.publicKey === \"object\";\n/**\n * Converts integer to octet string. I2OSP implementation.\n */\nexport function i2Osp(n, w) {\n if (w <= 0) {\n throw new Error(\"i2Osp: too small size\");\n }\n if (n >= 256 ** w) {\n throw new Error(\"i2Osp: too large integer\");\n }\n const ret = new Uint8Array(w);\n for (let i = 0; i < w && n; i++) {\n ret[w - (i + 1)] = n % 256;\n n = Math.floor(n / 256);\n }\n return ret;\n}\n/**\n * Concatenates two Uint8Arrays.\n * @param a Uint8Array\n * @param b Uint8Array\n * @returns Concatenated Uint8Array\n */\nexport function concat(a, b) {\n const ret = new Uint8Array(a.length + b.length);\n ret.set(a, 0);\n ret.set(b, a.length);\n return ret;\n}\n/**\n * Decodes Base64Url-encoded data.\n * @param v Base64Url-encoded string\n * @returns Uint8Array\n */\nexport function base64UrlToBytes(v) {\n const base64 = v.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const byteString = atob(base64);\n const ret = new Uint8Array(byteString.length);\n for (let i = 0; i < byteString.length; i++) {\n ret[i] = byteString.charCodeAt(i);\n }\n return ret;\n}\n/**\n * Encodes Uint8Array to Base64Url.\n * @param v Uint8Array\n * @returns Base64Url-encoded string\n */\nexport function bytesToBase64Url(v) {\n return btoa(String.fromCharCode(...v))\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=*$/g, \"\");\n}\n/**\n * Decodes hex string to Uint8Array.\n * @param v Hex string\n * @returns Uint8Array\n * @throws Error if the input is not a hex string.\n */\nexport function hexToBytes(v) {\n if (v.length === 0) {\n return new Uint8Array([]);\n }\n const res = v.match(/[\\da-f]{2}/gi);\n if (res == null) {\n throw new Error(\"Not hex string.\");\n }\n return new Uint8Array(res.map(function (h) {\n return parseInt(h, 16);\n }));\n}\n/**\n * Encodes Uint8Array to hex string.\n * @param v Uint8Array\n * @returns Hex string\n */\nexport function bytesToHex(v) {\n return [...v].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\");\n}\n/**\n * Converts KemId to KeyAlgorithm.\n * @param kem KemId\n * @returns KeyAlgorithm\n */\nexport function kemToKeyGenAlgorithm(kem) {\n switch (kem) {\n case KemId.DhkemP256HkdfSha256:\n return {\n name: \"ECDH\",\n namedCurve: \"P-256\",\n };\n case KemId.DhkemP384HkdfSha384:\n return {\n name: \"ECDH\",\n namedCurve: \"P-384\",\n };\n case KemId.DhkemP521HkdfSha512:\n return {\n name: \"ECDH\",\n namedCurve: \"P-521\",\n };\n default:\n // case KemId.DhkemX25519HkdfSha256\n return {\n name: \"X25519\",\n };\n }\n}\nexport async function loadSubtleCrypto() {\n if (dntShim.dntGlobalThis !== undefined && globalThis.crypto !== undefined) {\n // Browsers, Node.js >= v19, Cloudflare Workers, Bun, etc.\n return globalThis.crypto.subtle;\n }\n // Node.js <= v18\n try {\n // @ts-ignore: to ignore \"crypto\"\n const { webcrypto } = await import(\"crypto\"); // node:crypto\n return webcrypto.subtle;\n }\n catch (_e) {\n throw new Error(\"Failed to load SubtleCrypto\");\n }\n}\nexport async function loadCrypto() {\n if (typeof dntShim.dntGlobalThis !== \"undefined\" && globalThis.crypto !== undefined) {\n // Browsers, Node.js >= v19, Cloudflare Workers, Bun, etc.\n return globalThis.crypto;\n }\n // Node.js <= v18\n try {\n // @ts-ignore: to ignore \"crypto\"\n const { webcrypto } = await import(\"crypto\"); // node:crypto\n return webcrypto;\n }\n catch (_e) {\n throw new Error(\"failed to load Crypto\");\n }\n}\n/**\n * XOR for Uint8Array.\n */\nexport function xor(a, b) {\n if (a.byteLength !== b.byteLength) {\n throw new Error(\"xor: different length inputs\");\n }\n const buf = new Uint8Array(a.byteLength);\n for (let i = 0; i < a.byteLength; i++) {\n buf[i] = a[i] ^ b[i];\n }\n return buf;\n}\n","import { EMPTY, INPUT_LENGTH_LIMIT } from \"../consts.js\";\nimport { DecapError, EncapError, InvalidParamError } from \"../errors.js\";\nimport { SUITE_ID_HEADER_KEM } from \"../interfaces/kemInterface.js\";\nimport { toArrayBuffer } from \"../kdfs/hkdf.js\";\nimport { concat, i2Osp, isCryptoKeyPair } from \"../utils/misc.js\";\n// b\"eae_prk\"\nconst LABEL_EAE_PRK = /* @__PURE__ */ new Uint8Array([\n 101,\n 97,\n 101,\n 95,\n 112,\n 114,\n 107,\n]);\n// b\"shared_secret\"\n// deno-fmt-ignore\nconst LABEL_SHARED_SECRET = /* @__PURE__ */ new Uint8Array([\n 115, 104, 97, 114, 101, 100, 95, 115, 101, 99,\n 114, 101, 116,\n]);\nfunction concat3(a, b, c) {\n const ret = new Uint8Array(a.length + b.length + c.length);\n ret.set(a, 0);\n ret.set(b, a.length);\n ret.set(c, a.length + b.length);\n return ret;\n}\nexport class Dhkem {\n constructor(id, prim, kdf) {\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"secretSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 0\n });\n Object.defineProperty(this, \"encSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 0\n });\n Object.defineProperty(this, \"publicKeySize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 0\n });\n Object.defineProperty(this, \"privateKeySize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 0\n });\n Object.defineProperty(this, \"_prim\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_kdf\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.id = id;\n this._prim = prim;\n this._kdf = kdf;\n const suiteId = new Uint8Array(SUITE_ID_HEADER_KEM);\n suiteId.set(i2Osp(this.id, 2), 3);\n this._kdf.init(suiteId);\n }\n async serializePublicKey(key) {\n return await this._prim.serializePublicKey(key);\n }\n async deserializePublicKey(key) {\n return await this._prim.deserializePublicKey(toArrayBuffer(key));\n }\n async serializePrivateKey(key) {\n return await this._prim.serializePrivateKey(key);\n }\n async deserializePrivateKey(key) {\n return await this._prim.deserializePrivateKey(toArrayBuffer(key));\n }\n async importKey(format, key, isPublic = true) {\n return await this._prim.importKey(format, key, isPublic);\n }\n async generateKeyPair() {\n return await this._prim.generateKeyPair();\n }\n async deriveKeyPair(ikm) {\n const rawIkm = toArrayBuffer(ikm);\n if (rawIkm.byteLength > INPUT_LENGTH_LIMIT) {\n throw new InvalidParamError(\"Too long ikm\");\n }\n return await this._prim.deriveKeyPair(rawIkm);\n }\n async encap(params) {\n let ke;\n if (params.ekm === undefined) {\n ke = await this.generateKeyPair();\n }\n else if (isCryptoKeyPair(params.ekm)) {\n // params.ekm is only used for testing.\n ke = params.ekm;\n }\n else {\n // params.ekm is only used for testing.\n ke = await this.deriveKeyPair(params.ekm);\n }\n const enc = await this._prim.serializePublicKey(ke.publicKey);\n const pkrm = await this._prim.serializePublicKey(params.recipientPublicKey);\n try {\n let dh;\n if (params.senderKey === undefined) {\n dh = new Uint8Array(await this._prim.dh(ke.privateKey, params.recipientPublicKey));\n }\n else {\n const sks = isCryptoKeyPair(params.senderKey)\n ? params.senderKey.privateKey\n : params.senderKey;\n const dh1 = new Uint8Array(await this._prim.dh(ke.privateKey, params.recipientPublicKey));\n const dh2 = new Uint8Array(await this._prim.dh(sks, params.recipientPublicKey));\n dh = concat(dh1, dh2);\n }\n let kemContext;\n if (params.senderKey === undefined) {\n kemContext = concat(new Uint8Array(enc), new Uint8Array(pkrm));\n }\n else {\n const pks = isCryptoKeyPair(params.senderKey)\n ? params.senderKey.publicKey\n : await this._prim.derivePublicKey(params.senderKey);\n const pksm = await this._prim.serializePublicKey(pks);\n kemContext = concat3(new Uint8Array(enc), new Uint8Array(pkrm), new Uint8Array(pksm));\n }\n const sharedSecret = await this._generateSharedSecret(dh, kemContext);\n return {\n enc: enc,\n sharedSecret: sharedSecret,\n };\n }\n catch (e) {\n throw new EncapError(e);\n }\n }\n async decap(params) {\n const enc = toArrayBuffer(params.enc);\n const pke = await this._prim.deserializePublicKey(enc);\n const skr = isCryptoKeyPair(params.recipientKey)\n ? params.recipientKey.privateKey\n : params.recipientKey;\n const pkr = isCryptoKeyPair(params.recipientKey)\n ? params.recipientKey.publicKey\n : await this._prim.derivePublicKey(params.recipientKey);\n const pkrm = await this._prim.serializePublicKey(pkr);\n try {\n let dh;\n if (params.senderPublicKey === undefined) {\n dh = new Uint8Array(await this._prim.dh(skr, pke));\n }\n else {\n const dh1 = new Uint8Array(await this._prim.dh(skr, pke));\n const dh2 = new Uint8Array(await this._prim.dh(skr, params.senderPublicKey));\n dh = concat(dh1, dh2);\n }\n let kemContext;\n if (params.senderPublicKey === undefined) {\n kemContext = concat(new Uint8Array(enc), new Uint8Array(pkrm));\n }\n else {\n const pksm = await this._prim.serializePublicKey(params.senderPublicKey);\n kemContext = new Uint8Array(enc.byteLength + pkrm.byteLength + pksm.byteLength);\n kemContext.set(new Uint8Array(enc), 0);\n kemContext.set(new Uint8Array(pkrm), enc.byteLength);\n kemContext.set(new Uint8Array(pksm), enc.byteLength + pkrm.byteLength);\n }\n return await this._generateSharedSecret(dh, kemContext);\n }\n catch (e) {\n throw new DecapError(e);\n }\n }\n async _generateSharedSecret(dh, kemContext) {\n const labeledIkm = this._kdf.buildLabeledIkm(LABEL_EAE_PRK, dh);\n const labeledInfo = this._kdf.buildLabeledInfo(LABEL_SHARED_SECRET, kemContext, this.secretSize);\n return await this._kdf.extractAndExpand(EMPTY, labeledIkm, labeledInfo, this.secretSize);\n }\n}\n","// The key usages for KEM.\nexport const KEM_USAGES = [\"deriveBits\"];\n// b\"dkp_prk\"\nexport const LABEL_DKP_PRK = /* @__PURE__ */ new Uint8Array([\n 100,\n 107,\n 112,\n 95,\n 112,\n 114,\n 107,\n]);\n// b\"sk\"\nexport const LABEL_SK = /* @__PURE__ */ new Uint8Array([115, 107]);\n","/**\n * The minimum inplementation of bignum to derive an EC key pair.\n */\nexport class Bignum {\n constructor(size) {\n Object.defineProperty(this, \"_num\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this._num = new Uint8Array(size);\n }\n val() {\n return this._num;\n }\n reset() {\n this._num.fill(0);\n }\n set(src) {\n if (src.length !== this._num.length) {\n throw new Error(\"Bignum.set: invalid argument\");\n }\n this._num.set(src);\n }\n isZero() {\n for (let i = 0; i < this._num.length; i++) {\n if (this._num[i] !== 0) {\n return false;\n }\n }\n return true;\n }\n lessThan(v) {\n if (v.length !== this._num.length) {\n throw new Error(\"Bignum.lessThan: invalid argument\");\n }\n for (let i = 0; i < this._num.length; i++) {\n if (this._num[i] < v[i]) {\n return true;\n }\n if (this._num[i] > v[i]) {\n return false;\n }\n }\n return false;\n }\n}\n","import { NativeAlgorithm } from \"../../algorithm.js\";\nimport { BYTE_TO_BIGINT_256, EMPTY } from \"../../consts.js\";\nimport { toArrayBuffer } from \"../../kdfs/hkdf.js\";\nimport { DeriveKeyPairError, DeserializeError, NotSupportedError, SerializeError, } from \"../../errors.js\";\nimport { KemId } from \"../../identifiers.js\";\nimport { KEM_USAGES, LABEL_DKP_PRK } from \"../../interfaces/dhkemPrimitives.js\";\nimport { Bignum } from \"../../utils/bignum.js\";\nimport { base64UrlToBytes, i2Osp } from \"../../utils/misc.js\";\n// b\"candidate\"\n// deno-fmt-ignore\nconst LABEL_CANDIDATE = /* @__PURE__ */ new Uint8Array([\n 99, 97, 110, 100, 105, 100, 97, 116, 101,\n]);\n// the order of the curve being used.\n// deno-fmt-ignore\nconst ORDER_P_256 = /* @__PURE__ */ new Uint8Array([\n 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17, 0x9e, 0x84,\n 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x51,\n]);\n// deno-fmt-ignore\nconst ORDER_P_384 = /* @__PURE__ */ new Uint8Array([\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n 0xc7, 0x63, 0x4d, 0x81, 0xf4, 0x37, 0x2d, 0xdf,\n 0x58, 0x1a, 0x0d, 0xb2, 0x48, 0xb0, 0xa7, 0x7a,\n 0xec, 0xec, 0x19, 0x6a, 0xcc, 0xc5, 0x29, 0x73,\n]);\n// deno-fmt-ignore\nconst ORDER_P_521 = /* @__PURE__ */ new Uint8Array([\n 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n 0xff, 0xfa, 0x51, 0x86, 0x87, 0x83, 0xbf, 0x2f,\n 0x96, 0x6b, 0x7f, 0xcc, 0x01, 0x48, 0xf7, 0x09,\n 0xa5, 0xd0, 0x3b, 0xb5, 0xc9, 0xb8, 0x89, 0x9c,\n 0x47, 0xae, 0xbb, 0x6f, 0xb7, 0x1e, 0x91, 0x38,\n 0x64, 0x09,\n]);\n// deno-fmt-ignore\nconst PKCS8_ALG_ID_P_256 = /* @__PURE__ */ new Uint8Array([\n 48, 65, 2, 1, 0, 48, 19, 6, 7, 42,\n 134, 72, 206, 61, 2, 1, 6, 8, 42, 134,\n 72, 206, 61, 3, 1, 7, 4, 39, 48, 37,\n 2, 1, 1, 4, 32,\n]);\n// deno-fmt-ignore\nconst PKCS8_ALG_ID_P_384 = /* @__PURE__ */ new Uint8Array([\n 48, 78, 2, 1, 0, 48, 16, 6, 7, 42,\n 134, 72, 206, 61, 2, 1, 6, 5, 43, 129,\n 4, 0, 34, 4, 55, 48, 53, 2, 1, 1,\n 4, 48,\n]);\n// deno-fmt-ignore\nconst PKCS8_ALG_ID_P_521 = /* @__PURE__ */ new Uint8Array([\n 48, 96, 2, 1, 0, 48, 16, 6, 7, 42,\n 134, 72, 206, 61, 2, 1, 6, 5, 43, 129,\n 4, 0, 35, 4, 73, 48, 71, 2, 1, 1,\n 4, 66,\n]);\nconst EC_P_256_PARAMS = {\n p: 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffffn,\n b: 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604bn,\n gx: 0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296n,\n gy: 0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5n,\n coordinateSize: 32,\n};\nconst EC_P_384_PARAMS = {\n p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffffn,\n b: 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aefn,\n gx: 0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7n,\n gy: 0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5fn,\n coordinateSize: 48,\n};\nconst EC_P_521_PARAMS = {\n p: (1n << 521n) - 1n,\n b: 0x0051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00n,\n gx: 0x00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66n,\n gy: 0x011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650n,\n coordinateSize: 66,\n};\nfunction mod(a, p) {\n const r = a % p;\n return r >= 0n ? r : r + p;\n}\nfunction modPow(base, exponent, p) {\n let result = 1n;\n let b = mod(base, p);\n let e = exponent;\n while (e > 0n) {\n if ((e & 1n) === 1n) {\n result = mod(result * b, p);\n }\n b = mod(b * b, p);\n e >>= 1n;\n }\n return result;\n}\nfunction modSqrt(rhs, p) {\n // P-256/P-384/P-521 primes satisfy p % 4 == 3.\n const y = modPow(rhs, (p + 1n) >> 2n, p);\n if (mod(y * y, p) !== mod(rhs, p)) {\n throw new Error(\"Invalid ECDH point\");\n }\n return y;\n}\nfunction bytesToBigInt(bytes) {\n let v = 0n;\n for (const b of bytes) {\n v = (v << 8n) | BYTE_TO_BIGINT_256[b];\n }\n return v;\n}\nfunction bigIntToBytes(v, len) {\n const out = new Uint8Array(len);\n let n = v;\n for (let i = len - 1; i >= 0; i--) {\n out[i] = Number(n & 0xffn);\n n >>= 8n;\n }\n if (n !== 0n) {\n throw new Error(\"Invalid coordinate length\");\n }\n return out;\n}\nfunction buildRawUncompressedPublicKey(x, y, coordinateSize) {\n const out = new Uint8Array(1 + coordinateSize * 2);\n out[0] = 0x04;\n out.set(bigIntToBytes(x, coordinateSize), 1);\n out.set(bigIntToBytes(y, coordinateSize), 1 + coordinateSize);\n return out;\n}\nexport class Ec extends NativeAlgorithm {\n constructor(kem, hkdf) {\n super();\n Object.defineProperty(this, \"_hkdf\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_alg\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_nPk\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_nSk\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_nDh\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n // EC specific arguments for deriving key pair.\n Object.defineProperty(this, \"_order\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_bitmask\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_pkcs8AlgId\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_curveParams\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this._hkdf = hkdf;\n switch (kem) {\n case KemId.DhkemP256HkdfSha256:\n this._alg = { name: \"ECDH\", namedCurve: \"P-256\" };\n this._nPk = 65;\n this._nSk = 32;\n this._nDh = 32;\n this._order = ORDER_P_256;\n this._bitmask = 0xFF;\n this._pkcs8AlgId = PKCS8_ALG_ID_P_256;\n this._curveParams = EC_P_256_PARAMS;\n break;\n case KemId.DhkemP384HkdfSha384:\n this._alg = { name: \"ECDH\", namedCurve: \"P-384\" };\n this._nPk = 97;\n this._nSk = 48;\n this._nDh = 48;\n this._order = ORDER_P_384;\n this._bitmask = 0xFF;\n this._pkcs8AlgId = PKCS8_ALG_ID_P_384;\n this._curveParams = EC_P_384_PARAMS;\n break;\n default:\n // case KemId.DhkemP521HkdfSha512:\n this._alg = { name: \"ECDH\", namedCurve: \"P-521\" };\n this._nPk = 133;\n this._nSk = 66;\n this._nDh = 66;\n this._order = ORDER_P_521;\n this._bitmask = 0x01;\n this._pkcs8AlgId = PKCS8_ALG_ID_P_521;\n this._curveParams = EC_P_521_PARAMS;\n break;\n }\n }\n async serializePublicKey(key) {\n await this._setup();\n try {\n return await this._api.exportKey(\"raw\", key);\n }\n catch (e) {\n throw new SerializeError(e);\n }\n }\n async deserializePublicKey(key) {\n await this._setup();\n try {\n return await this._importRawKey(toArrayBuffer(key), true);\n }\n catch (e) {\n throw new DeserializeError(e);\n }\n }\n async serializePrivateKey(key) {\n await this._setup();\n try {\n const jwk = await this._api.exportKey(\"jwk\", key);\n if (!(\"d\" in jwk)) {\n throw new Error(\"Not private key\");\n }\n return base64UrlToBytes(jwk[\"d\"]).buffer;\n }\n catch (e) {\n throw new SerializeError(e);\n }\n }\n async deserializePrivateKey(key) {\n await this._setup();\n try {\n return await this._importRawKey(toArrayBuffer(key), false);\n }\n catch (e) {\n throw new DeserializeError(e);\n }\n }\n async importKey(format, key, isPublic) {\n await this._setup();\n try {\n if (format === \"raw\") {\n return await this._importRawKey(key, isPublic);\n }\n // jwk\n if (key instanceof ArrayBuffer) {\n throw new Error(\"Invalid jwk key format\");\n }\n return await this._importJWK(key, isPublic);\n }\n catch (e) {\n throw new DeserializeError(e);\n }\n }\n async generateKeyPair() {\n await this._setup();\n try {\n return await this._api.generateKey(this._alg, true, KEM_USAGES);\n }\n catch (e) {\n throw new NotSupportedError(e);\n }\n }\n async deriveKeyPair(ikm) {\n await this._setup();\n try {\n const rawIkm = toArrayBuffer(ikm);\n const dkpPrk = await this._hkdf.labeledExtract(EMPTY, LABEL_DKP_PRK, new Uint8Array(rawIkm));\n const bn = new Bignum(this._nSk);\n for (let counter = 0; bn.isZero() || !bn.lessThan(this._order); counter++) {\n if (counter > 255) {\n throw new Error(\"Faild to derive a key pair\");\n }\n const bytes = new Uint8Array(await this._hkdf.labeledExpand(dkpPrk, LABEL_CANDIDATE, i2Osp(counter, 1), this._nSk));\n bytes[0] = bytes[0] & this._bitmask;\n bn.set(bytes);\n }\n const sk = await this._deserializePkcs8Key(bn.val());\n bn.reset();\n return {\n privateKey: sk,\n publicKey: await this.derivePublicKey(sk),\n };\n }\n catch (e) {\n throw new DeriveKeyPairError(e);\n }\n }\n async derivePublicKey(key) {\n await this._setup();\n try {\n const jwk = await this._api.exportKey(\"jwk\", key);\n delete jwk[\"d\"];\n delete jwk[\"key_ops\"];\n return await this._api.importKey(\"jwk\", jwk, this._alg, true, []);\n }\n catch {\n try {\n // Firefox fails to export JWK from some imported ECDH private keys.\n return await this._derivePublicKeyWithoutJwkExport(key);\n }\n catch (e) {\n throw new DeserializeError(e);\n }\n }\n }\n async dh(sk, pk) {\n try {\n await this._setup();\n const bits = await this._api.deriveBits({\n name: \"ECDH\",\n public: pk,\n }, sk, this._nDh * 8);\n return bits;\n }\n catch (e) {\n throw new SerializeError(e);\n }\n }\n async _importRawKey(key, isPublic) {\n if (isPublic && key.byteLength !== this._nPk) {\n throw new Error(\"Invalid public key for the ciphersuite\");\n }\n if (!isPublic && key.byteLength !== this._nSk) {\n throw new Error(\"Invalid private key for the ciphersuite\");\n }\n if (isPublic) {\n return await this._api.importKey(\"raw\", key, this._alg, true, []);\n }\n return await this._deserializePkcs8Key(new Uint8Array(key));\n }\n async _importJWK(key, isPublic) {\n if (typeof key.crv === \"undefined\" || key.crv !== this._alg.namedCurve) {\n throw new Error(`Invalid crv: ${key.crv}`);\n }\n if (isPublic) {\n if (typeof key.d !== \"undefined\") {\n throw new Error(\"Invalid key: `d` should not be set\");\n }\n return await this._api.importKey(\"jwk\", key, this._alg, true, []);\n }\n if (typeof key.d === \"undefined\") {\n throw new Error(\"Invalid key: `d` not found\");\n }\n return await this._api.importKey(\"jwk\", key, this._alg, true, KEM_USAGES);\n }\n async _deserializePkcs8Key(k) {\n const pkcs8Key = new Uint8Array(this._pkcs8AlgId.length + k.length);\n pkcs8Key.set(this._pkcs8AlgId, 0);\n pkcs8Key.set(k, this._pkcs8AlgId.length);\n return await this._api.importKey(\"pkcs8\", pkcs8Key, this._alg, true, KEM_USAGES);\n }\n async _derivePublicKeyWithoutJwkExport(key) {\n const basePointRaw = buildRawUncompressedPublicKey(this._curveParams.gx, this._curveParams.gy, this._curveParams.coordinateSize);\n const basePoint = await this._api.importKey(\"raw\", basePointRaw.buffer, this._alg, true, []);\n const xBytes = new Uint8Array(await this._api.deriveBits({\n name: \"ECDH\",\n public: basePoint,\n }, key, this._nDh * 8));\n const p = this._curveParams.p;\n const x = bytesToBigInt(xBytes);\n const rhs = mod(modPow(x, 3n, p) - 3n * x + this._curveParams.b, p);\n let y = modSqrt(rhs, p);\n // Canonicalize sign so the encoded point is deterministic.\n if ((y & 1n) === 1n) {\n y = p - y;\n }\n const pubRaw = buildRawUncompressedPublicKey(x, y, this._curveParams.coordinateSize);\n return await this._api.importKey(\"raw\", pubRaw.buffer, this._alg, true, []);\n }\n}\n","// The key usages for AEAD.\nexport const AEAD_USAGES = [\"encrypt\", \"decrypt\"];\n","import { AEAD_USAGES, AeadId, NativeAlgorithm, toArrayBuffer, } from \"@hpke/common\";\nexport class AesGcmContext extends NativeAlgorithm {\n constructor(key) {\n super();\n Object.defineProperty(this, \"_rawKey\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_key\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: undefined\n });\n this._rawKey = toArrayBuffer(key);\n }\n async seal(iv, data, aad) {\n await this._setupKey();\n const alg = {\n name: \"AES-GCM\",\n iv: toArrayBuffer(iv),\n additionalData: toArrayBuffer(aad),\n };\n const ct = await this._api.encrypt(alg, this._key, toArrayBuffer(data));\n return ct;\n }\n async open(iv, data, aad) {\n await this._setupKey();\n const alg = {\n name: \"AES-GCM\",\n iv: toArrayBuffer(iv),\n additionalData: toArrayBuffer(aad),\n };\n const pt = await this._api.decrypt(alg, this._key, toArrayBuffer(data));\n return pt;\n }\n async _setupKey() {\n if (this._key !== undefined) {\n return;\n }\n await this._setup();\n const key = await this._importKey(this._rawKey);\n (new Uint8Array(this._rawKey)).fill(0);\n this._key = key;\n return;\n }\n async _importKey(key) {\n return await this._api.importKey(\"raw\", key, { name: \"AES-GCM\" }, true, AEAD_USAGES);\n }\n}\n/**\n * The AES-128-GCM for HPKE AEAD implementing {@link AeadInterface}.\n *\n * When using `@hpke/core`, the instance of this class must be specified\n * to the `aead` parameter of {@link CipherSuiteParams} instead of `AeadId.Aes128Gcm`.\n *\n * @example\n *\n * ```ts\n * import {\n * Aes128Gcm,\n * CipherSuite,\n * DhkemP256HkdfSha256,\n * HkdfSha256,\n * } from \"@hpke/core\";\n *\n * const suite = new CipherSuite({\n * kem: new DhkemP256HkdfSha256(),\n * kdf: new HkdfSha256(),\n * aead: new Aes128Gcm(),\n * });\n * ```\n */\nexport class Aes128Gcm {\n constructor() {\n /** AeadId.Aes128Gcm (0x0001) */\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: AeadId.Aes128Gcm\n });\n /** 16 */\n Object.defineProperty(this, \"keySize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 16\n });\n /** 12 */\n Object.defineProperty(this, \"nonceSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 12\n });\n /** 16 */\n Object.defineProperty(this, \"tagSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 16\n });\n }\n createEncryptionContext(key) {\n return new AesGcmContext(key);\n }\n}\n/**\n * The AES-256-GCM for HPKE AEAD implementing {@link AeadInterface}.\n *\n * When using `@hpke/core`, the instance of this class must be specified\n * to the `aead` parameter of {@link CipherSuiteParams} instead of `AeadId.Aes256Gcm`\n * as follows:\n *\n * @example\n *\n * ```ts\n * import {\n * Aes256Gcm,\n * CipherSuite,\n * DhkemP256HkdfSha256,\n * HkdfSha256,\n * } from \"@hpke/core\";\n *\n * const suite = new CipherSuite({\n * kem: new DhkemP256HkdfSha256(),\n * kdf: new HkdfSha256(),\n * aead: new Aes256Gcm(),\n * });\n * ```\n */\nexport class Aes256Gcm extends Aes128Gcm {\n constructor() {\n super(...arguments);\n /** AeadId.Aes256Gcm (0x0002) */\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: AeadId.Aes256Gcm\n });\n /** 32 */\n Object.defineProperty(this, \"keySize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 32\n });\n /** 12 */\n Object.defineProperty(this, \"nonceSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 12\n });\n /** 16 */\n Object.defineProperty(this, \"tagSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 16\n });\n }\n}\n","import { NotSupportedError } from \"@hpke/common\";\nexport function emitNotSupported() {\n return new Promise((_resolve, reject) => {\n reject(new NotSupportedError(\"Not supported\"));\n });\n}\n","import { ExportError, INPUT_LENGTH_LIMIT, InvalidParamError, toArrayBuffer, } from \"@hpke/common\";\nimport { emitNotSupported } from \"./utils/emitNotSupported.js\";\n// b\"sec\"\nconst LABEL_SEC = new Uint8Array([115, 101, 99]);\nexport class ExporterContextImpl {\n constructor(api, kdf, exporterSecret) {\n Object.defineProperty(this, \"_api\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"exporterSecret\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_kdf\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this._api = api;\n this._kdf = kdf;\n this.exporterSecret = exporterSecret;\n }\n async seal(_data, _aad) {\n return await emitNotSupported();\n }\n async open(_data, _aad) {\n return await emitNotSupported();\n }\n async export(exporterContext, len) {\n const rawExporterContext = toArrayBuffer(exporterContext);\n if (rawExporterContext.byteLength > INPUT_LENGTH_LIMIT) {\n throw new InvalidParamError(\"Too long exporter context\");\n }\n try {\n return await this._kdf.labeledExpand(this.exporterSecret, LABEL_SEC, new Uint8Array(rawExporterContext), len);\n }\n catch (e) {\n throw new ExportError(e);\n }\n }\n}\nexport class RecipientExporterContextImpl extends ExporterContextImpl {\n}\nexport class SenderExporterContextImpl extends ExporterContextImpl {\n constructor(api, kdf, exporterSecret, enc) {\n super(api, kdf, exporterSecret);\n Object.defineProperty(this, \"enc\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.enc = enc;\n return;\n }\n}\n","import { i2Osp, MessageLimitReachedError, xor } from \"@hpke/common\";\nimport { ExporterContextImpl } from \"./exporterContext.js\";\nexport class EncryptionContextImpl extends ExporterContextImpl {\n constructor(api, kdf, params) {\n super(api, kdf, params.exporterSecret);\n // AEAD id.\n Object.defineProperty(this, \"_aead\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n // The length in bytes of a key for the algorithm.\n Object.defineProperty(this, \"_nK\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n // The length in bytes of a nonce for the algorithm.\n Object.defineProperty(this, \"_nN\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n // The length in bytes of an authentication tag for the algorithm.\n Object.defineProperty(this, \"_nT\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n // The end-to-end encryption key information.\n Object.defineProperty(this, \"_ctx\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n if (params.key === undefined || params.baseNonce === undefined ||\n params.seq === undefined) {\n throw new Error(\"Required parameters are missing\");\n }\n this._aead = params.aead;\n this._nK = this._aead.keySize;\n this._nN = this._aead.nonceSize;\n this._nT = this._aead.tagSize;\n const key = this._aead.createEncryptionContext(params.key);\n this._ctx = {\n key: key,\n baseNonce: params.baseNonce,\n seq: params.seq,\n };\n }\n computeNonce(k) {\n const seqBytes = i2Osp(k.seq, k.baseNonce.byteLength);\n return xor(k.baseNonce, seqBytes).buffer;\n }\n incrementSeq(k) {\n // if (this.seq >= (1 << (8 * this.baseNonce.byteLength)) - 1) {\n if (k.seq > Number.MAX_SAFE_INTEGER) {\n throw new MessageLimitReachedError(\"Message limit reached\");\n }\n k.seq += 1;\n return;\n }\n}\n","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _Mutex_locked;\nexport class Mutex {\n constructor() {\n _Mutex_locked.set(this, Promise.resolve());\n }\n async lock() {\n let releaseLock;\n const nextLock = new Promise((resolve) => {\n releaseLock = resolve;\n });\n const previousLock = __classPrivateFieldGet(this, _Mutex_locked, \"f\");\n __classPrivateFieldSet(this, _Mutex_locked, nextLock, \"f\");\n await previousLock;\n return releaseLock;\n }\n}\n_Mutex_locked = new WeakMap();\n","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _RecipientContextImpl_mutex;\nimport { EMPTY, OpenError, toArrayBuffer } from \"@hpke/common\";\nimport { EncryptionContextImpl } from \"./encryptionContext.js\";\nimport { Mutex } from \"./mutex.js\";\nexport class RecipientContextImpl extends EncryptionContextImpl {\n constructor() {\n super(...arguments);\n _RecipientContextImpl_mutex.set(this, void 0);\n }\n async open(data, aad = EMPTY.buffer) {\n __classPrivateFieldSet(this, _RecipientContextImpl_mutex, __classPrivateFieldGet(this, _RecipientContextImpl_mutex, \"f\") ?? new Mutex(), \"f\");\n const release = await __classPrivateFieldGet(this, _RecipientContextImpl_mutex, \"f\").lock();\n let pt;\n try {\n pt = await this._ctx.key.open(this.computeNonce(this._ctx), toArrayBuffer(data), toArrayBuffer(aad));\n }\n catch (e) {\n throw new OpenError(e);\n }\n finally {\n release();\n }\n this.incrementSeq(this._ctx);\n return pt;\n }\n}\n_RecipientContextImpl_mutex = new WeakMap();\n","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _SenderContextImpl_mutex;\nimport { EMPTY, SealError, toArrayBuffer } from \"@hpke/common\";\nimport { EncryptionContextImpl } from \"./encryptionContext.js\";\nimport { Mutex } from \"./mutex.js\";\nexport class SenderContextImpl extends EncryptionContextImpl {\n constructor(api, kdf, params, enc) {\n super(api, kdf, params);\n Object.defineProperty(this, \"enc\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n _SenderContextImpl_mutex.set(this, void 0);\n this.enc = enc;\n }\n async seal(data, aad = EMPTY.buffer) {\n __classPrivateFieldSet(this, _SenderContextImpl_mutex, __classPrivateFieldGet(this, _SenderContextImpl_mutex, \"f\") ?? new Mutex(), \"f\");\n const release = await __classPrivateFieldGet(this, _SenderContextImpl_mutex, \"f\").lock();\n let ct;\n try {\n ct = await this._ctx.key.seal(this.computeNonce(this._ctx), toArrayBuffer(data), toArrayBuffer(aad));\n }\n catch (e) {\n throw new SealError(e);\n }\n finally {\n release();\n }\n this.incrementSeq(this._ctx);\n return ct;\n }\n}\n_SenderContextImpl_mutex = new WeakMap();\n","import { AeadId, EMPTY, i2Osp, INFO_LENGTH_LIMIT, INPUT_LENGTH_LIMIT, InvalidParamError, MINIMUM_PSK_LENGTH, Mode, NativeAlgorithm, toUint8Array, } from \"@hpke/common\";\nimport { RecipientExporterContextImpl, SenderExporterContextImpl, } from \"./exporterContext.js\";\nimport { RecipientContextImpl } from \"./recipientContext.js\";\nimport { SenderContextImpl } from \"./senderContext.js\";\n// b\"base_nonce\"\n// deno-fmt-ignore\nconst LABEL_BASE_NONCE = new Uint8Array([\n 98, 97, 115, 101, 95, 110, 111, 110, 99, 101,\n]);\n// b\"exp\"\nconst LABEL_EXP = new Uint8Array([101, 120, 112]);\n// b\"info_hash\"\n// deno-fmt-ignore\nconst LABEL_INFO_HASH = new Uint8Array([\n 105, 110, 102, 111, 95, 104, 97, 115, 104,\n]);\n// b\"key\"\nconst LABEL_KEY = new Uint8Array([107, 101, 121]);\n// b\"psk_id_hash\"\n// deno-fmt-ignore\nconst LABEL_PSK_ID_HASH = new Uint8Array([\n 112, 115, 107, 95, 105, 100, 95, 104, 97, 115, 104,\n]);\n// b\"secret\"\nconst LABEL_SECRET = new Uint8Array([115, 101, 99, 114, 101, 116]);\n// b\"HPKE\"\n// deno-fmt-ignore\nconst SUITE_ID_HEADER_HPKE = new Uint8Array([\n 72, 80, 75, 69, 0, 0, 0, 0, 0, 0,\n]);\n/**\n * The Hybrid Public Key Encryption (HPKE) ciphersuite,\n * which is implemented using only\n * {@link https://www.w3.org/TR/WebCryptoAPI/ | Web Cryptography API}.\n *\n * This is the super class of {@link CipherSuite} and the same as\n * {@link https://jsr.io/@hpke/core/doc/~/CipherSuite | @hpke/core#CipherSuite} as follows:\n * which supports only the ciphersuites that can be implemented on the native\n * {@link https://www.w3.org/TR/WebCryptoAPI/ | Web Cryptography API}.\n * Therefore, the following cryptographic algorithms are not supported for now:\n * - DHKEM(X25519, HKDF-SHA256)\n * - DHKEM(X448, HKDF-SHA512)\n * - ChaCha20Poly1305\n *\n * In addtion, the HKDF functions contained in this class can only derive\n * keys of the same length as the `hashSize`.\n *\n * If you want to use the unsupported cryptographic algorithms\n * above or derive keys longer than the `hashSize`,\n * please use {@link CipherSuite}.\n *\n * This class provides following functions:\n *\n * - Creates encryption contexts both for senders and recipients.\n * - {@link createSenderContext}\n * - {@link createRecipientContext}\n * - Provides single-shot encryption API.\n * - {@link seal}\n * - {@link open}\n *\n * The calling of the constructor of this class is the starting\n * point for HPKE operations for both senders and recipients.\n *\n * @example Use only ciphersuites supported by Web Cryptography API.\n *\n * ```ts\n * import {\n * Aes128Gcm,\n * DhkemP256HkdfSha256,\n * HkdfSha256,\n * CipherSuite,\n * } from \"@hpke/core\";\n *\n * const suite = new CipherSuite({\n * kem: new DhkemP256HkdfSha256(),\n * kdf: new HkdfSha256(),\n * aead: new Aes128Gcm(),\n * });\n * ```\n *\n * @example Use a ciphersuite which is currently not supported by Web Cryptography API.\n *\n * ```ts\n * import { Aes128Gcm, HkdfSha256, CipherSuite } from \"@hpke/core\";\n * // Use an extension module.\n * import { DhkemX25519HkdfSha256 } from \"@hpke/dhkem-x25519\";\n *\n * const suite = new CipherSuite({\n * kem: new DhkemX25519HkdfSha256(),\n * kdf: new HkdfSha256(),\n * aead: new Aes128Gcm(),\n * });\n * ```\n */\nexport class CipherSuiteNative extends NativeAlgorithm {\n /**\n * @param params A set of parameters for building a cipher suite.\n *\n * If the error occurred, throws {@link InvalidParamError}.\n *\n * @throws {@link InvalidParamError}\n */\n constructor(params) {\n super();\n Object.defineProperty(this, \"_kem\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_kdf\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_aead\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_suiteId\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n // KEM\n if (typeof params.kem === \"number\") {\n throw new InvalidParamError(\"KemId cannot be used\");\n }\n this._kem = params.kem;\n // KDF\n if (typeof params.kdf === \"number\") {\n throw new InvalidParamError(\"KdfId cannot be used\");\n }\n this._kdf = params.kdf;\n // AEAD\n if (typeof params.aead === \"number\") {\n throw new InvalidParamError(\"AeadId cannot be used\");\n }\n this._aead = params.aead;\n this._suiteId = new Uint8Array(SUITE_ID_HEADER_HPKE);\n this._suiteId.set(i2Osp(this._kem.id, 2), 4);\n this._suiteId.set(i2Osp(this._kdf.id, 2), 6);\n this._suiteId.set(i2Osp(this._aead.id, 2), 8);\n this._kdf.init(this._suiteId);\n }\n /**\n * Gets the KEM context of the ciphersuite.\n */\n get kem() {\n return this._kem;\n }\n /**\n * Gets the KDF context of the ciphersuite.\n */\n get kdf() {\n return this._kdf;\n }\n /**\n * Gets the AEAD context of the ciphersuite.\n */\n get aead() {\n return this._aead;\n }\n /**\n * Creates an encryption context for a sender.\n *\n * If the error occurred, throws {@link DecapError} | {@link ValidationError}.\n *\n * @param params A set of parameters for the sender encryption context.\n * @returns A sender encryption context.\n * @throws {@link EncapError}, {@link ValidationError}\n */\n async createSenderContext(params) {\n this._validateInputLength(params);\n await this._setup();\n const dh = await this._kem.encap(params);\n let mode;\n if (params.psk !== undefined) {\n mode = params.senderKey !== undefined ? Mode.AuthPsk : Mode.Psk;\n }\n else {\n mode = params.senderKey !== undefined ? Mode.Auth : Mode.Base;\n }\n return await this._keyScheduleS(mode, dh.sharedSecret, dh.enc, params);\n }\n /**\n * Creates an encryption context for a recipient.\n *\n * If the error occurred, throws {@link DecapError}\n * | {@link DeserializeError} | {@link ValidationError}.\n *\n * @param params A set of parameters for the recipient encryption context.\n * @returns A recipient encryption context.\n * @throws {@link DecapError}, {@link DeserializeError}, {@link ValidationError}\n */\n async createRecipientContext(params) {\n this._validateInputLength(params);\n await this._setup();\n const sharedSecret = await this._kem.decap(params);\n let mode;\n if (params.psk !== undefined) {\n mode = params.senderPublicKey !== undefined ? Mode.AuthPsk : Mode.Psk;\n }\n else {\n mode = params.senderPublicKey !== undefined ? Mode.Auth : Mode.Base;\n }\n return await this._keyScheduleR(mode, sharedSecret, params);\n }\n /**\n * Encrypts a message to a recipient.\n *\n * If the error occurred, throws `EncapError` | `MessageLimitReachedError` | `SealError` | `ValidationError`.\n *\n * @param params A set of parameters for building a sender encryption context.\n * @param pt A plain text as bytes to be encrypted.\n * @param aad Additional authenticated data as bytes fed by an application.\n * @returns A cipher text and an encapsulated key as bytes.\n * @throws {@link EncapError}, {@link MessageLimitReachedError}, {@link SealError}, {@link ValidationError}\n */\n async seal(params, pt, aad = EMPTY.buffer) {\n const ctx = await this.createSenderContext(params);\n return {\n ct: await ctx.seal(pt, aad),\n enc: ctx.enc,\n };\n }\n /**\n * Decrypts a message from a sender.\n *\n * If the error occurred, throws `DecapError` | `DeserializeError` | `OpenError` | `ValidationError`.\n *\n * @param params A set of parameters for building a recipient encryption context.\n * @param ct An encrypted text as bytes to be decrypted.\n * @param aad Additional authenticated data as bytes fed by an application.\n * @returns A decrypted plain text as bytes.\n * @throws {@link DecapError}, {@link DeserializeError}, {@link OpenError}, {@link ValidationError}\n */\n async open(params, ct, aad = EMPTY.buffer) {\n const ctx = await this.createRecipientContext(params);\n return await ctx.open(ct, aad);\n }\n // private verifyPskInputs(mode: Mode, params: KeyScheduleParams) {\n // const gotPsk = (params.psk !== undefined);\n // const gotPskId = (params.psk !== undefined && params.psk.id.byteLength > 0);\n // if (gotPsk !== gotPskId) {\n // throw new Error('Inconsistent PSK inputs');\n // }\n // if (gotPsk && (mode === Mode.Base || mode === Mode.Auth)) {\n // throw new Error('PSK input provided when not needed');\n // }\n // if (!gotPsk && (mode === Mode.Psk || mode === Mode.AuthPsk)) {\n // throw new Error('Missing required PSK input');\n // }\n // return;\n // }\n async _keySchedule(mode, sharedSecret, params) {\n // Currently, there is no point in executing this function\n // because this hpke library does not allow users to explicitly specify the mode.\n //\n // this.verifyPskInputs(mode, params);\n const pskId = params.psk === undefined\n ? EMPTY\n : toUint8Array(params.psk.id);\n const pskIdHash = await this._kdf.labeledExtract(EMPTY, LABEL_PSK_ID_HASH, pskId);\n const info = params.info === undefined ? EMPTY : toUint8Array(params.info);\n const infoHash = await this._kdf.labeledExtract(EMPTY, LABEL_INFO_HASH, info);\n const keyScheduleContext = new Uint8Array(1 + pskIdHash.byteLength + infoHash.byteLength);\n keyScheduleContext.set(new Uint8Array([mode]), 0);\n keyScheduleContext.set(new Uint8Array(pskIdHash), 1);\n keyScheduleContext.set(new Uint8Array(infoHash), 1 + pskIdHash.byteLength);\n const psk = params.psk === undefined ? EMPTY : toUint8Array(params.psk.key);\n const ikm = this._kdf.buildLabeledIkm(LABEL_SECRET, psk);\n const exporterSecretInfo = this._kdf.buildLabeledInfo(LABEL_EXP, keyScheduleContext, this._kdf.hashSize);\n const exporterSecret = await this._kdf.extractAndExpand(sharedSecret, ikm, exporterSecretInfo, this._kdf.hashSize);\n if (this._aead.id === AeadId.ExportOnly) {\n return { aead: this._aead, exporterSecret: exporterSecret };\n }\n const keyInfo = this._kdf.buildLabeledInfo(LABEL_KEY, keyScheduleContext, this._aead.keySize);\n const key = await this._kdf.extractAndExpand(sharedSecret, ikm, keyInfo, this._aead.keySize);\n const baseNonceInfo = this._kdf.buildLabeledInfo(LABEL_BASE_NONCE, keyScheduleContext, this._aead.nonceSize);\n const baseNonce = await this._kdf.extractAndExpand(sharedSecret, ikm, baseNonceInfo, this._aead.nonceSize);\n return {\n aead: this._aead,\n exporterSecret: exporterSecret,\n key: key,\n baseNonce: new Uint8Array(baseNonce),\n seq: 0,\n };\n }\n async _keyScheduleS(mode, sharedSecret, enc, params) {\n const res = await this._keySchedule(mode, sharedSecret, params);\n if (res.key === undefined) {\n return new SenderExporterContextImpl(this._api, this._kdf, res.exporterSecret, enc);\n }\n return new SenderContextImpl(this._api, this._kdf, res, enc);\n }\n async _keyScheduleR(mode, sharedSecret, params) {\n const res = await this._keySchedule(mode, sharedSecret, params);\n if (res.key === undefined) {\n return new RecipientExporterContextImpl(this._api, this._kdf, res.exporterSecret);\n }\n return new RecipientContextImpl(this._api, this._kdf, res);\n }\n _validateInputLength(params) {\n if (params.info !== undefined &&\n params.info.byteLength > INFO_LENGTH_LIMIT) {\n throw new InvalidParamError(\"Too long info\");\n }\n if (params.psk !== undefined) {\n if (params.psk.key.byteLength < MINIMUM_PSK_LENGTH) {\n throw new InvalidParamError(`PSK must have at least ${MINIMUM_PSK_LENGTH} bytes`);\n }\n if (params.psk.key.byteLength > INPUT_LENGTH_LIMIT) {\n throw new InvalidParamError(\"Too long psk.key\");\n }\n if (params.psk.id.byteLength > INPUT_LENGTH_LIMIT) {\n throw new InvalidParamError(\"Too long psk.id\");\n }\n }\n return;\n }\n}\n","import { Dhkem, Ec, HkdfSha256Native, HkdfSha384Native, HkdfSha512Native, KemId, } from \"@hpke/common\";\nexport class DhkemP256HkdfSha256Native extends Dhkem {\n constructor() {\n const kdf = new HkdfSha256Native();\n const prim = new Ec(KemId.DhkemP256HkdfSha256, kdf);\n super(KemId.DhkemP256HkdfSha256, prim, kdf);\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: KemId.DhkemP256HkdfSha256\n });\n Object.defineProperty(this, \"secretSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 32\n });\n Object.defineProperty(this, \"encSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 65\n });\n Object.defineProperty(this, \"publicKeySize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 65\n });\n Object.defineProperty(this, \"privateKeySize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 32\n });\n }\n}\nexport class DhkemP384HkdfSha384Native extends Dhkem {\n constructor() {\n const kdf = new HkdfSha384Native();\n const prim = new Ec(KemId.DhkemP384HkdfSha384, kdf);\n super(KemId.DhkemP384HkdfSha384, prim, kdf);\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: KemId.DhkemP384HkdfSha384\n });\n Object.defineProperty(this, \"secretSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 48\n });\n Object.defineProperty(this, \"encSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 97\n });\n Object.defineProperty(this, \"publicKeySize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 97\n });\n Object.defineProperty(this, \"privateKeySize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 48\n });\n }\n}\nexport class DhkemP521HkdfSha512Native extends Dhkem {\n constructor() {\n const kdf = new HkdfSha512Native();\n const prim = new Ec(KemId.DhkemP521HkdfSha512, kdf);\n super(KemId.DhkemP521HkdfSha512, prim, kdf);\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: KemId.DhkemP521HkdfSha512\n });\n Object.defineProperty(this, \"secretSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 64\n });\n Object.defineProperty(this, \"encSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 133\n });\n Object.defineProperty(this, \"publicKeySize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 133\n });\n Object.defineProperty(this, \"privateKeySize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 64\n });\n }\n}\n","import { HkdfSha256Native, HkdfSha384Native, HkdfSha512Native, } from \"@hpke/common\";\nimport { CipherSuiteNative } from \"./cipherSuiteNative.js\";\nimport { DhkemP256HkdfSha256Native, DhkemP384HkdfSha384Native, DhkemP521HkdfSha512Native, } from \"./kems/dhkemNative.js\";\n/**\n * The Hybrid Public Key Encryption (HPKE) ciphersuite,\n * which is implemented using only\n * {@link https://www.w3.org/TR/WebCryptoAPI/ | Web Cryptography API}.\n *\n * This class is the same as\n * {@link https://jsr.io/@hpke/core/doc/~/CipherSuiteNative | @hpke/core#CipherSuiteNative} as follows:\n * which supports only the ciphersuites that can be implemented on the native\n * {@link https://www.w3.org/TR/WebCryptoAPI/ | Web Cryptography API}.\n * Therefore, the following cryptographic algorithms are not supported for now:\n * - `DHKEM(X448, HKDF-SHA512)`\n * - `ChaCha20Poly1305`\n *\n * In addtion, the HKDF functions contained in this `CipherSuiteNative`\n * class can only derive keys of the same length as the `hashSize`.\n *\n * If you want to use the unsupported cryptographic algorithms\n * above or derive keys longer than the `hashSize`,\n * please use {@link https://jsr.io/@hpke/hpke-js/doc/~/CipherSuite | hpke-js#CipherSuite}.\n *\n * This class provides following functions:\n *\n * - Creates encryption contexts both for senders and recipients.\n * - {@link createSenderContext}\n * - {@link createRecipientContext}\n * - Provides single-shot encryption API.\n * - {@link seal}\n * - {@link open}\n *\n * The calling of the constructor of this class is the starting\n * point for HPKE operations for both senders and recipients.\n *\n * @example Use only ciphersuites supported by Web Cryptography API.\n *\n * ```ts\n * import {\n * Aes128Gcm,\n * DhkemP256HkdfSha256,\n * HkdfSha256,\n * CipherSuite,\n * } from \"@hpke/core\";\n *\n * const suite = new CipherSuite({\n * kem: new DhkemP256HkdfSha256(),\n * kdf: new HkdfSha256(),\n * aead: new Aes128Gcm(),\n * });\n * ```\n *\n * @example Use DHKEM(X25519, HKDF-SHA256).\n *\n * ```ts\n * import {\n * Aes128Gcm,\n * CipherSuite,\n * DhkemX25519HkdfSha256,\n * HkdfSha256,\n * } from \"@hpke/core\";\n * const suite = new CipherSuite({\n * kem: new DhkemX25519HkdfSha256(),\n * kdf: new HkdfSha256(),\n * aead: new Aes128Gcm(),\n * });\n * ```\n */\nexport class CipherSuite extends CipherSuiteNative {\n}\n/**\n * The DHKEM(P-256, HKDF-SHA256) for HPKE KEM implementing {@link KemInterface}.\n *\n * When using `@hpke/core`, the instance of this class must be specified\n * to the `kem` parameter of {@link CipherSuiteParams} instead of `KemId.DhkemP256HkdfSha256`\n * as follows:\n *\n * @example\n *\n * ```ts\n * import {\n * Aes128Gcm,\n * CipherSuite,\n * DhkemP256HkdfSha256,\n * HkdfSha256,\n * } from \"@hpke/core\";\n *\n * const suite = new CipherSuite({\n * kem: new DhkemP256HkdfSha256(),\n * kdf: new HkdfSha256(),\n * aead: new Aes128Gcm(),\n * });\n * ```\n */\nexport class DhkemP256HkdfSha256 extends DhkemP256HkdfSha256Native {\n}\n/**\n * The DHKEM(P-384, HKDF-SHA384) for HPKE KEM implementing {@link KemInterface}.\n *\n * When using `@hpke/core`, the instance of this class must be specified\n * to the `kem` parameter of {@link CipherSuiteParams} instead of `KemId.DhkemP384HkdfSha384`\n * as follows:\n *\n * @example\n *\n * ```ts\n * import {\n * Aes128Gcm,\n * CipherSuite,\n * DhkemP384HkdfSha384,\n * HkdfSha384,\n * } from \"@hpke/core\";\n *\n * const suite = new CipherSuite({\n * kem: new DhkemP384HkdfSha384(),\n * kdf: new HkdfSha384(),\n * aead: new Aes128Gcm(),\n * });\n * ```\n */\nexport class DhkemP384HkdfSha384 extends DhkemP384HkdfSha384Native {\n}\n/**\n * The DHKEM(P-521, HKDF-SHA512) for HPKE KEM implementing {@link KemInterface}.\n *\n * When using `@hpke/core`, the instance of this class must be specified\n * to the `kem` parameter of {@link CipherSuiteParams} instead of `KemId.DhkemP521HkdfSha512`\n * as follows:\n *\n * @example\n *\n * ```ts\n * import {\n * Aes256Gcm,\n * CipherSuite,\n * DhkemP521HkdfSha512,\n * HkdfSha512,\n * } from \"@hpke/core\";\n *\n * const suite = new CipherSuite({\n * kem: new DhkemP521HkdfSha512(),\n * kdf: new HkdfSha512(),\n * aead: new Aes256Gcm(),\n * });\n * ```\n */\nexport class DhkemP521HkdfSha512 extends DhkemP521HkdfSha512Native {\n}\n/**\n * The HKDF-SHA256 for HPKE KDF implementing {@link KdfInterface}.\n *\n * When using `@hpke/core`, the instance of this class must be specified\n * to the `kem` parameter of {@link CipherSuiteParams} instead of `KdfId.HkdfSha256`.\n *\n * The KDF class can only derive keys of the same length as the `hashSize`.\n * If you want to derive keys longer than the `hashSize`,\n * please use {@link https://jsr.io/@hpke/hpke-js/doc/~/CipherSuite | hpke-js#CipherSuite}.\n *\n * @example\n *\n * ```ts\n * import {\n * Aes128Gcm,\n * CipherSuite,\n * DhkemP256HkdfSha256,\n * HkdfSha256,\n * } from \"@hpke/core\";\n *\n * const suite = new CipherSuite({\n * kem: new DhkemP256HkdfSha256(),\n * kdf: new HkdfSha256(),\n * aead: new Aes128Gcm(),\n * });\n * ```\n */\nexport class HkdfSha256 extends HkdfSha256Native {\n}\n/**\n * The HKDF-SHA384 for HPKE KDF implementing {@link KdfInterface}.\n *\n * When using `@hpke/core`, the instance of this class must be specified\n * to the `kem` parameter of {@link CipherSuiteParams} instead of `KdfId.HkdfSha384`.\n *\n * The KDF class can only derive keys of the same length as the `hashSize`.\n * If you want to derive keys longer than the `hashSize`,\n * please use {@link https://jsr.io/@hpke/hpke-js/doc/~/CipherSuite | hpke-js#CipherSuite}.\n *\n * @example\n *\n * ```ts\n * import {\n * Aes128Gcm,\n * CipherSuite,\n * DhkemP384HkdfSha384,\n * HkdfSha384,\n * } from \"@hpke/core\";\n *\n * const suite = new CipherSuite({\n * kem: new DhkemP384HkdfSha384(),\n * kdf: new HkdfSha384(),\n * aead: new Aes128Gcm(),\n * });\n * ```\n */\nexport class HkdfSha384 extends HkdfSha384Native {\n}\n/**\n * The HKDF-SHA512 for HPKE KDF implementing {@link KdfInterface}.\n *\n * When using `@hpke/core`, the instance of this class must be specified\n * to the `kem` parameter of {@link CipherSuiteParams} instead of `KdfId.HkdfSha512`.\n *\n * The KDF class can only derive keys of the same length as the `hashSize`.\n * If you want to derive keys longer than the `hashSize`,\n * please use {@link https://jsr.io/@hpke/hpke-js/doc/~/CipherSuite | hpke-js#CipherSuite}.\n *\n * @example\n *\n * ```ts\n * import {\n * Aes256Gcm,\n * CipherSuite,\n * DhkemP521HkdfSha512,\n * HkdfSha512,\n * } from \"@hpke/core\";\n *\n * const suite = new CipherSuite({\n * kem: new DhkemP521HkdfSha512(),\n * kdf: new HkdfSha512(),\n * aead: new Aes256Gcm(),\n * });\n * ```\n */\nexport class HkdfSha512 extends HkdfSha512Native {\n}\n","import { base64UrlToBytes, DeriveKeyPairError, DeserializeError, EMPTY, KEM_USAGES, LABEL_DKP_PRK, LABEL_SK, NativeAlgorithm, NotSupportedError, SerializeError, toArrayBuffer, } from \"@hpke/common\";\nconst ALG_NAME = \"X25519\";\n// deno-fmt-ignore\nconst PKCS8_ALG_ID_X25519 = new Uint8Array([\n 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06,\n 0x03, 0x2b, 0x65, 0x6e, 0x04, 0x22, 0x04, 0x20,\n]);\nconst BASE_POINT_X25519 = /* @__PURE__ */ (() => {\n const p = new Uint8Array(32);\n p[0] = 9;\n return p;\n})();\nexport class X25519 extends NativeAlgorithm {\n constructor(hkdf) {\n super();\n Object.defineProperty(this, \"_hkdf\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_alg\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_nPk\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_nSk\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_nDh\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"_pkcs8AlgId\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this._alg = { name: ALG_NAME };\n this._hkdf = hkdf;\n this._nPk = 32;\n this._nSk = 32;\n this._nDh = 32;\n this._pkcs8AlgId = PKCS8_ALG_ID_X25519;\n }\n async serializePublicKey(key) {\n await this._setup();\n try {\n return await this._api.exportKey(\"raw\", key);\n }\n catch (e) {\n throw new SerializeError(e);\n }\n }\n async deserializePublicKey(key) {\n await this._setup();\n try {\n return await this._importRawKey(toArrayBuffer(key), true);\n }\n catch (e) {\n throw new DeserializeError(e);\n }\n }\n async serializePrivateKey(key) {\n await this._setup();\n try {\n const jwk = await this._api.exportKey(\"jwk\", key);\n if (!(\"d\" in jwk)) {\n throw new Error(\"Not private key\");\n }\n return base64UrlToBytes(jwk[\"d\"]).buffer;\n }\n catch (e) {\n throw new SerializeError(e);\n }\n }\n async deserializePrivateKey(key) {\n await this._setup();\n try {\n return await this._importRawKey(toArrayBuffer(key), false);\n }\n catch (e) {\n throw new DeserializeError(e);\n }\n }\n async importKey(format, key, isPublic) {\n await this._setup();\n try {\n if (format === \"raw\") {\n return await this._importRawKey(key, isPublic);\n }\n // jwk\n if (key instanceof ArrayBuffer) {\n throw new Error(\"Invalid jwk key format\");\n }\n return await this._importJWK(key, isPublic);\n }\n catch (e) {\n throw new DeserializeError(e);\n }\n }\n async generateKeyPair() {\n await this._setup();\n try {\n return await this._api.generateKey(ALG_NAME, true, KEM_USAGES);\n }\n catch (e) {\n throw new NotSupportedError(e);\n }\n }\n async deriveKeyPair(ikm) {\n await this._setup();\n try {\n const rawIkm = toArrayBuffer(ikm);\n const dkpPrk = await this._hkdf.labeledExtract(EMPTY, LABEL_DKP_PRK, new Uint8Array(rawIkm));\n const rawSk = await this._hkdf.labeledExpand(dkpPrk, LABEL_SK, EMPTY, this._nSk);\n const rawSkBytes = new Uint8Array(rawSk);\n const sk = await this._deserializePkcs8Key(rawSkBytes);\n rawSkBytes.fill(0);\n return {\n privateKey: sk,\n publicKey: await this.derivePublicKey(sk),\n };\n }\n catch (e) {\n throw new DeriveKeyPairError(e);\n }\n }\n async derivePublicKey(key) {\n await this._setup();\n try {\n const jwk = await this._api.exportKey(\"jwk\", key);\n delete jwk[\"d\"];\n delete jwk[\"key_ops\"];\n return await this._api.importKey(\"jwk\", jwk, this._alg, true, []);\n }\n catch {\n try {\n // Firefox fails to export JWK from some imported X25519 private keys.\n const bp = await this._api.importKey(\"raw\", BASE_POINT_X25519.buffer, this._alg, true, []);\n const bits = await this._api.deriveBits({\n name: ALG_NAME,\n public: bp,\n }, key, this._nPk * 8);\n return await this._api.importKey(\"raw\", bits, this._alg, true, []);\n }\n catch (e) {\n throw new DeserializeError(e);\n }\n }\n }\n async dh(sk, pk) {\n await this._setup();\n try {\n const bits = await this._api.deriveBits({\n name: ALG_NAME,\n public: pk,\n }, sk, this._nDh * 8);\n return bits;\n }\n catch (e) {\n throw new SerializeError(e);\n }\n }\n async _importRawKey(key, isPublic) {\n if (isPublic && key.byteLength !== this._nPk) {\n throw new Error(\"Invalid public key for the ciphersuite\");\n }\n if (!isPublic && key.byteLength !== this._nSk) {\n throw new Error(\"Invalid private key for the ciphersuite\");\n }\n if (isPublic) {\n return await this._api.importKey(\"raw\", key, this._alg, true, []);\n }\n return await this._deserializePkcs8Key(new Uint8Array(key));\n }\n async _importJWK(key, isPublic) {\n if (typeof key.kty === \"undefined\" || key.kty !== \"OKP\") {\n throw new Error(`Invalid kty: ${key.crv}`);\n }\n if (typeof key.crv === \"undefined\" || key.crv !== ALG_NAME) {\n throw new Error(`Invalid crv: ${key.crv}`);\n }\n if (isPublic) {\n if (typeof key.d !== \"undefined\") {\n throw new Error(\"Invalid key: `d` should not be set\");\n }\n return await this._api.importKey(\"jwk\", key, this._alg, true, []);\n }\n if (typeof key.d === \"undefined\") {\n throw new Error(\"Invalid key: `d` not found\");\n }\n return await this._api.importKey(\"jwk\", key, this._alg, true, KEM_USAGES);\n }\n async _deserializePkcs8Key(k) {\n const pkcs8Key = new Uint8Array(this._pkcs8AlgId.length + k.length);\n pkcs8Key.set(this._pkcs8AlgId, 0);\n pkcs8Key.set(k, this._pkcs8AlgId.length);\n return await this._api.importKey(\"pkcs8\", pkcs8Key, this._alg, true, KEM_USAGES);\n }\n}\n","import { Dhkem, HkdfSha256Native, KemId } from \"@hpke/common\";\nimport { X25519 } from \"./dhkemPrimitives/x25519.js\";\n/**\n * The DHKEM(X25519, HKDF-SHA256) for HPKE KEM implementing {@link KemInterface}.\n *\n * The instance of this class can be specified to the\n * {@link https://jsr.io/@hpke/core/doc/~/CipherSuiteParams | CipherSuiteParams} as follows:\n *\n * @example\n *\n * ```ts\n * import {\n * Aes128Gcm,\n * CipherSuite,\n * HkdfSha256,\n * DhkemX25519HkdfSha256,\n * } from \"@hpke/core\";\n *\n * const suite = new CipherSuite({\n * kem: new DhkemX25519HkdfSha256(),\n * kdf: new HkdfSha256(),\n * aead: new Aes128Gcm(),\n * });\n * ```\n */\nexport class DhkemX25519HkdfSha256 extends Dhkem {\n constructor() {\n const kdf = new HkdfSha256Native();\n super(KemId.DhkemX25519HkdfSha256, new X25519(kdf), kdf);\n /** KemId.DhkemX25519HkdfSha256 (0x0020) */\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: KemId.DhkemX25519HkdfSha256\n });\n /** 32 */\n Object.defineProperty(this, \"secretSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 32\n });\n /** 32 */\n Object.defineProperty(this, \"encSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 32\n });\n /** 32 */\n Object.defineProperty(this, \"publicKeySize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 32\n });\n /** 32 */\n Object.defineProperty(this, \"privateKeySize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 32\n });\n }\n}\n","import { concatUint8Arrays, bytesToArrayBuffer } from \"../../util/byteArray.js\";\nimport { CryptoError } from \"../../mlsError.js\";\nexport async function makeGenericHpke(hpkealg, aead, cs) {\n return {\n async open(privateKey, kemOutput, ciphertext, info, aad) {\n try {\n const result = await cs.open({ recipientKey: privateKey, enc: bytesToArrayBuffer(kemOutput), info: bytesToArrayBuffer(info) }, bytesToArrayBuffer(ciphertext), aad ? bytesToArrayBuffer(aad) : new ArrayBuffer());\n return new Uint8Array(result);\n }\n catch (e) {\n throw new CryptoError(`${e}`);\n }\n },\n async seal(publicKey, plaintext, info, aad) {\n const result = await cs.seal({ recipientPublicKey: publicKey, info: bytesToArrayBuffer(info) }, bytesToArrayBuffer(plaintext), aad ? bytesToArrayBuffer(aad) : new ArrayBuffer());\n return {\n ct: new Uint8Array(result.ct),\n enc: new Uint8Array(result.enc),\n };\n },\n async exportSecret(publicKey, exporterContext, length, info) {\n const context = await cs.createSenderContext({ recipientPublicKey: publicKey, info: bytesToArrayBuffer(info) });\n return {\n enc: new Uint8Array(context.enc),\n secret: new Uint8Array(await context.export(bytesToArrayBuffer(exporterContext), length)),\n };\n },\n async importSecret(privateKey, exporterContext, kemOutput, length, info) {\n try {\n const context = await cs.createRecipientContext({\n recipientKey: privateKey,\n info: bytesToArrayBuffer(info),\n enc: bytesToArrayBuffer(kemOutput),\n });\n return new Uint8Array(await context.export(bytesToArrayBuffer(exporterContext), length));\n }\n catch (e) {\n throw new CryptoError(`${e}`);\n }\n },\n async importPrivateKey(k) {\n try {\n // See https://github.com/mlswg/mls-implementations/issues/176#issuecomment-1817043142\n const key = hpkealg.kem === \"DHKEM-P521-HKDF-SHA512\" ? prepadPrivateKeyP521(k) : k;\n return (await cs.kem.deserializePrivateKey(bytesToArrayBuffer(key)));\n }\n catch (e) {\n throw new CryptoError(`${e}`);\n }\n },\n async importPublicKey(k) {\n try {\n return (await cs.kem.deserializePublicKey(bytesToArrayBuffer(k)));\n }\n catch (e) {\n throw new CryptoError(`${e}`);\n }\n },\n async exportPublicKey(k) {\n return new Uint8Array(await cs.kem.serializePublicKey(k));\n },\n async exportPrivateKey(k) {\n return new Uint8Array(await cs.kem.serializePrivateKey(k));\n },\n async encryptAead(key, nonce, aad, plaintext) {\n return aead.encrypt(key, nonce, aad ? aad : new Uint8Array(), plaintext);\n },\n async decryptAead(key, nonce, aad, ciphertext) {\n try {\n return await aead.decrypt(key, nonce, aad ? aad : new Uint8Array(), ciphertext);\n }\n catch (e) {\n throw new CryptoError(`${e}`);\n }\n },\n async deriveKeyPair(ikm) {\n const kp = await cs.kem.deriveKeyPair(bytesToArrayBuffer(ikm));\n return { privateKey: kp.privateKey, publicKey: kp.publicKey };\n },\n async generateKeyPair() {\n const kp = await cs.kem.generateKeyPair();\n return { privateKey: kp.privateKey, publicKey: kp.publicKey };\n },\n keyLength: cs.aead.keySize,\n nonceLength: cs.aead.nonceSize,\n };\n}\nfunction prepadPrivateKeyP521(k) {\n const lengthDifference = 66 - k.byteLength;\n return concatUint8Arrays(new Uint8Array(lengthDifference), k);\n}\n//# sourceMappingURL=hpke.js.map","import { Aes128Gcm, Aes256Gcm } from \"@hpke/core\";\nimport { DependencyError } from \"../../../mlsError.js\";\nimport { toBufferSource } from \"../../../util/byteArray.js\";\nexport async function makeAead(aeadAlg) {\n switch (aeadAlg) {\n case \"AES128GCM\":\n return [\n {\n encrypt(key, nonce, aad, plaintext) {\n return encryptAesGcm(key, nonce, aad, plaintext);\n },\n decrypt(key, nonce, aad, ciphertext) {\n return decryptAesGcm(key, nonce, aad, ciphertext);\n },\n },\n new Aes128Gcm(),\n ];\n case \"AES256GCM\":\n return [\n {\n encrypt(key, nonce, aad, plaintext) {\n return encryptAesGcm(key, nonce, aad, plaintext);\n },\n decrypt(key, nonce, aad, ciphertext) {\n return decryptAesGcm(key, nonce, aad, ciphertext);\n },\n },\n new Aes256Gcm(),\n ];\n case \"CHACHA20POLY1305\":\n try {\n const { Chacha20Poly1305 } = await import(\"@hpke/chacha20poly1305\");\n const { chacha20poly1305 } = await import(\"@noble/ciphers/chacha.js\");\n return [\n {\n async encrypt(key, nonce, aad, plaintext) {\n return chacha20poly1305(key, nonce, aad).encrypt(plaintext);\n },\n async decrypt(key, nonce, aad, ciphertext) {\n return chacha20poly1305(key, nonce, aad).decrypt(ciphertext);\n },\n },\n new Chacha20Poly1305(),\n ];\n }\n catch (err) {\n throw new DependencyError(\"Optional dependency '@hpke/chacha20poly1305' is not installed. Please install it to use this feature.\");\n }\n }\n}\nasync function encryptAesGcm(key, nonce, aad, plaintext) {\n const cryptoKey = await crypto.subtle.importKey(\"raw\", toBufferSource(key), { name: \"AES-GCM\" }, false, [\"encrypt\"]);\n const params = {\n name: \"AES-GCM\",\n iv: toBufferSource(nonce),\n };\n if (aad.length > 0) {\n params.additionalData = toBufferSource(aad);\n }\n const result = await crypto.subtle.encrypt(params, cryptoKey, toBufferSource(plaintext));\n return new Uint8Array(result);\n}\nasync function decryptAesGcm(key, nonce, aad, ciphertext) {\n const cryptoKey = await crypto.subtle.importKey(\"raw\", toBufferSource(key), { name: \"AES-GCM\" }, false, [\"decrypt\"]);\n const params = {\n name: \"AES-GCM\",\n iv: toBufferSource(nonce),\n };\n if (aad.length > 0) {\n params.additionalData = toBufferSource(aad);\n }\n const result = await crypto.subtle.decrypt(params, cryptoKey, toBufferSource(ciphertext));\n return new Uint8Array(result);\n}\n//# sourceMappingURL=makeAead.js.map","import { HkdfSha256, HkdfSha384, HkdfSha512 } from \"@hpke/core\";\nimport { bytesToArrayBuffer } from \"../../../util/byteArray.js\";\nexport function makeKdfImpl(k) {\n return {\n async extract(salt, ikm) {\n const result = await k.extract(bytesToArrayBuffer(salt), bytesToArrayBuffer(ikm));\n return new Uint8Array(result);\n },\n async expand(prk, info, len) {\n const result = await k.expand(bytesToArrayBuffer(prk), bytesToArrayBuffer(info), len);\n return new Uint8Array(result);\n },\n size: k.hashSize,\n };\n}\nexport function makeKdf(kdfAlg) {\n switch (kdfAlg) {\n case \"HKDF-SHA256\":\n return new HkdfSha256();\n case \"HKDF-SHA384\":\n return new HkdfSha384();\n case \"HKDF-SHA512\":\n return new HkdfSha512();\n }\n}\n//# sourceMappingURL=makeKdfImpl.js.map","import { DhkemP256HkdfSha256, DhkemX25519HkdfSha256, DhkemP521HkdfSha512, DhkemP384HkdfSha384, } from \"@hpke/core\";\nimport { DependencyError } from \"../../../mlsError.js\";\nexport async function makeDhKem(kemAlg) {\n switch (kemAlg) {\n case \"DHKEM-P256-HKDF-SHA256\":\n return new DhkemP256HkdfSha256();\n case \"DHKEM-X25519-HKDF-SHA256\":\n return new DhkemX25519HkdfSha256();\n case \"DHKEM-X448-HKDF-SHA512\": {\n try {\n const { DhkemX448HkdfSha512 } = await import(\"@hpke/dhkem-x448\");\n return new DhkemX448HkdfSha512();\n }\n catch (err) {\n throw new DependencyError(\"Optional dependency '@hpke/dhkem-x448' is not installed. Please install it to use this feature.\");\n }\n }\n case \"DHKEM-P521-HKDF-SHA512\":\n return new DhkemP521HkdfSha512();\n case \"DHKEM-P384-HKDF-SHA384\":\n return new DhkemP384HkdfSha384();\n case \"ML-KEM-512\":\n try {\n const { MlKem512 } = await import(\"@hpke/ml-kem\");\n return new MlKem512();\n }\n catch (err) {\n throw new DependencyError(\"Optional dependency '@hpke/ml-kem' is not installed. Please install it to use this feature.\");\n }\n case \"ML-KEM-768\":\n try {\n const { MlKem768 } = await import(\"@hpke/ml-kem\");\n return new MlKem768();\n }\n catch (err) {\n throw new DependencyError(\"Optional dependency '@hpke/ml-kem' is not installed. Please install it to use this feature.\");\n }\n case \"ML-KEM-1024\":\n try {\n const { MlKem1024 } = await import(\"@hpke/ml-kem\");\n return new MlKem1024();\n }\n catch (err) {\n throw new DependencyError(\"Optional dependency '@hpke/ml-kem' is not installed. Please install it to use this feature.\");\n }\n case \"X-Wing\":\n try {\n const { XWing } = await import(\"@hpke/hybridkem-x-wing\");\n return new XWing();\n }\n catch (err) {\n throw new DependencyError(\"Optional dependency '@hpke/hybridkem-x-wing' is not installed. Please install it to use this feature.\");\n }\n }\n}\n//# sourceMappingURL=makeDhKem.js.map","import { CipherSuite } from \"@hpke/core\";\nimport { makeGenericHpke } from \"../hpke.js\";\nimport { makeAead } from \"./makeAead.js\";\nimport { makeKdf } from \"./makeKdfImpl.js\";\nimport { makeDhKem } from \"./makeDhKem.js\";\nexport async function makeHpke(hpkealg) {\n const [aead, aeadInterface] = await makeAead(hpkealg.aead);\n const cs = new CipherSuite({\n kem: await makeDhKem(hpkealg.kem),\n kdf: makeKdf(hpkealg.kdf),\n aead: aeadInterface,\n });\n return makeGenericHpke(hpkealg, aead, cs);\n}\n//# sourceMappingURL=makeHpke.js.map","export const defaultRng = {\n randomBytes(n) {\n return crypto.getRandomValues(new Uint8Array(n));\n },\n};\n//# sourceMappingURL=rng.js.map","import { DependencyError } from \"../../../mlsError.js\";\nimport { toBufferSource } from \"../../../util/byteArray.js\";\nfunction rawEd25519ToPKCS8(rawKey) {\n const oid = new Uint8Array([0x06, 0x03, 0x2b, 0x65, 0x70]);\n const innerOctetString = new Uint8Array([0x04, 0x20, ...rawKey]);\n const privateKeyField = new Uint8Array([0x04, 0x22, ...innerOctetString]);\n const algorithmSeq = new Uint8Array([0x30, 0x05, ...oid]);\n const version = new Uint8Array([0x02, 0x01, 0x00]);\n const content = new Uint8Array([...version, ...algorithmSeq, ...privateKeyField]);\n return new Uint8Array([0x30, content.length, ...content]);\n}\nexport async function makeNobleSignatureImpl(alg) {\n switch (alg) {\n case \"Ed25519\": {\n const subtle = globalThis.crypto?.subtle;\n if (subtle !== undefined) {\n return {\n async sign(signKey, message) {\n const keyData = signKey.length === 32 ? rawEd25519ToPKCS8(signKey) : signKey;\n const key = await subtle.importKey(\"pkcs8\", toBufferSource(keyData), \"Ed25519\", false, [\"sign\"]);\n const sig = await subtle.sign(\"Ed25519\", key, toBufferSource(message));\n return new Uint8Array(sig);\n },\n async verify(publicKey, message, signature) {\n const key = await subtle.importKey(\"raw\", toBufferSource(publicKey), \"Ed25519\", false, [\"verify\"]);\n return subtle.verify(\"Ed25519\", key, toBufferSource(signature), toBufferSource(message));\n },\n async keygen() {\n const keyPair = await subtle.generateKey(\"Ed25519\", true, [\"sign\", \"verify\"]);\n const publicKeyBuffer = await subtle.exportKey(\"raw\", keyPair.publicKey);\n const privateKeyBuffer = await subtle.exportKey(\"pkcs8\", keyPair.privateKey);\n const publicKey = new Uint8Array(publicKeyBuffer);\n const signKey = new Uint8Array(privateKeyBuffer);\n return { signKey, publicKey };\n },\n };\n }\n try {\n const { ed25519 } = await import(\"@noble/curves/ed25519.js\");\n return {\n async sign(signKey, message) {\n return ed25519.sign(message, signKey);\n },\n async verify(publicKey, message, signature) {\n return ed25519.verify(signature, message, publicKey);\n },\n async keygen() {\n const signKey = ed25519.utils.randomSecretKey();\n return { signKey, publicKey: ed25519.getPublicKey(signKey) };\n },\n };\n }\n catch (err) {\n throw new DependencyError(\"Optional dependency '@noble/curves' is not installed. Please install it to use this feature.\");\n }\n }\n case \"Ed448\":\n try {\n const { ed448 } = await import(\"@noble/curves/ed448.js\");\n return {\n async sign(signKey, message) {\n return ed448.sign(message, signKey);\n },\n async verify(publicKey, message, signature) {\n return ed448.verify(signature, message, publicKey);\n },\n async keygen() {\n const signKey = ed448.utils.randomSecretKey();\n return { signKey, publicKey: ed448.getPublicKey(signKey) };\n },\n };\n }\n catch (err) {\n throw new DependencyError(\"Optional dependency '@noble/curves' is not installed. Please install it to use this feature.\");\n }\n case \"P256\":\n try {\n const { p256 } = await import(\"@noble/curves/nist.js\");\n return {\n async sign(signKey, message) {\n return p256.sign(message, signKey, { prehash: true, format: \"der\", lowS: false });\n },\n async verify(publicKey, message, signature) {\n return p256.verify(signature, message, publicKey, { prehash: true, format: \"der\", lowS: false });\n },\n async keygen() {\n const signKey = p256.utils.randomSecretKey();\n return { signKey, publicKey: p256.getPublicKey(signKey) };\n },\n };\n }\n catch (err) {\n throw new DependencyError(\"Optional dependency '@noble/curves' is not installed. Please install it to use this feature.\");\n }\n case \"P384\":\n try {\n const { p384 } = await import(\"@noble/curves/nist.js\");\n return {\n async sign(signKey, message) {\n return p384.sign(message, signKey, { prehash: true, format: \"der\", lowS: false });\n },\n async verify(publicKey, message, signature) {\n return p384.verify(signature, message, publicKey, { prehash: true, format: \"der\", lowS: false });\n },\n async keygen() {\n const signKey = p384.utils.randomSecretKey();\n return { signKey, publicKey: p384.getPublicKey(signKey) };\n },\n };\n }\n catch (err) {\n throw new DependencyError(\"Optional dependency '@noble/curves' is not installed. Please install it to use this feature.\");\n }\n case \"P521\":\n try {\n const { p521 } = await import(\"@noble/curves/nist.js\");\n return {\n async sign(signKey, message) {\n return p521.sign(message, signKey, { prehash: true, format: \"der\", lowS: false });\n },\n async verify(publicKey, message, signature) {\n return p521.verify(signature, message, publicKey, { prehash: true, format: \"der\", lowS: false });\n },\n async keygen() {\n const signKey = p521.utils.randomSecretKey();\n return { signKey, publicKey: p521.getPublicKey(signKey) };\n },\n };\n }\n catch (err) {\n throw new DependencyError(\"Optional dependency '@noble/curves' is not installed. Please install it to use this feature.\");\n }\n case \"ML-DSA-87\":\n try {\n const { ml_dsa87 } = await import(\"@noble/post-quantum/ml-dsa.js\");\n return {\n async sign(signKey, message) {\n return ml_dsa87.sign(message, signKey);\n },\n async verify(publicKey, message, signature) {\n return ml_dsa87.verify(signature, message, publicKey);\n },\n async keygen() {\n const keys = ml_dsa87.keygen(crypto.getRandomValues(new Uint8Array(32)));\n return { signKey: keys.secretKey, publicKey: keys.publicKey };\n },\n };\n }\n catch (err) {\n throw new DependencyError(\"Optional dependency '@noble/post-quantum' is not installed. Please install it to use this feature.\");\n }\n }\n}\n//# sourceMappingURL=makeNobleSignatureImpl.js.map","import { ciphersuiteValues, isDefaultCiphersuiteId } from \"../../ciphersuite.js\";\nimport { makeHashImpl } from \"./makeHashImpl.js\";\nimport { makeHpke } from \"./makeHpke.js\";\nimport { makeKdf } from \"./makeKdfImpl.js\";\nimport { makeKdfImpl } from \"./makeKdfImpl.js\";\nimport { defaultRng } from \"./rng.js\";\nimport { makeNobleSignatureImpl } from \"./makeNobleSignatureImpl.js\";\nimport { DependencyError } from \"../../../mlsError.js\";\n/** @public */\nexport const defaultCryptoProvider = {\n async getCiphersuiteImpl(id) {\n if (isDefaultCiphersuiteId(id)) {\n const cs = ciphersuiteValues[id];\n const sc = crypto.subtle;\n return {\n kdf: makeKdfImpl(makeKdf(cs.hpke.kdf)),\n hash: makeHashImpl(sc, cs.hash),\n signature: await makeNobleSignatureImpl(cs.signature),\n hpke: await makeHpke(cs.hpke),\n rng: defaultRng,\n id: id,\n };\n }\n else {\n throw new DependencyError(`Unrecognized ciphersuite: ${id}`);\n }\n },\n};\n//# sourceMappingURL=provider.js.map","import { flatMapDecoder, mapDecoder } from \"./codec/tlsDecoder.js\";\nimport { contramapBufferEncoders } from \"./codec/tlsEncoder.js\";\nimport { groupInfoDecoder, groupInfoEncoder } from \"./groupInfo.js\";\nimport { keyPackageDecoder, keyPackageEncoder } from \"./keyPackage.js\";\nimport { privateMessageDecoder, privateMessageEncoder } from \"./privateMessage.js\";\nimport { protocolVersionDecoder, protocolVersionEncoder } from \"./protocolVersion.js\";\nimport { publicMessageDecoder, publicMessageEncoder } from \"./publicMessage.js\";\nimport { welcomeDecoder, welcomeEncoder } from \"./welcome.js\";\nimport { wireformatDecoder, wireformatEncoder, wireformats } from \"./wireformat.js\";\nconst mlsPublicMessageEncoder = contramapBufferEncoders([protocolVersionEncoder, wireformatEncoder, publicMessageEncoder], (msg) => [msg.version, msg.wireformat, msg.publicMessage]);\nconst mlsWelcomeEncoder = contramapBufferEncoders([protocolVersionEncoder, wireformatEncoder, welcomeEncoder], (wm) => [wm.version, wm.wireformat, wm.welcome]);\nconst mlsPrivateMessageEncoder = contramapBufferEncoders([protocolVersionEncoder, wireformatEncoder, privateMessageEncoder], (pm) => [pm.version, pm.wireformat, pm.privateMessage]);\nconst mlsGroupInfoEncoder = contramapBufferEncoders([protocolVersionEncoder, wireformatEncoder, groupInfoEncoder], (gi) => [gi.version, gi.wireformat, gi.groupInfo]);\nconst mlsKeyPackageEncoder = contramapBufferEncoders([protocolVersionEncoder, wireformatEncoder, keyPackageEncoder], (kp) => [kp.version, kp.wireformat, kp.keyPackage]);\n/** @public */\nexport const mlsMessageEncoder = (mc) => {\n switch (mc.wireformat) {\n case wireformats.mls_public_message:\n return mlsPublicMessageEncoder(mc);\n case wireformats.mls_welcome:\n return mlsWelcomeEncoder(mc);\n case wireformats.mls_private_message:\n return mlsPrivateMessageEncoder(mc);\n case wireformats.mls_group_info:\n return mlsGroupInfoEncoder(mc);\n case wireformats.mls_key_package:\n return mlsKeyPackageEncoder(mc);\n }\n};\n/** @public */\nexport const mlsMessageDecoder = flatMapDecoder(protocolVersionDecoder, (version) => flatMapDecoder(wireformatDecoder, (wireformat) => {\n switch (wireformat) {\n case wireformats.mls_public_message:\n return mapDecoder(publicMessageDecoder, (publicMessage) => ({ version, wireformat, publicMessage }));\n case wireformats.mls_welcome:\n return mapDecoder(welcomeDecoder, (welcome) => ({ version, wireformat, welcome }));\n case wireformats.mls_private_message:\n return mapDecoder(privateMessageDecoder, (privateMessage) => ({ version, wireformat, privateMessage }));\n case wireformats.mls_group_info:\n return mapDecoder(groupInfoDecoder, (groupInfo) => ({ version, wireformat, groupInfo }));\n case wireformats.mls_key_package:\n return mapDecoder(keyPackageDecoder, (keyPackage) => ({ version, wireformat, keyPackage }));\n }\n}));\n//# sourceMappingURL=message.js.map","import { defaultCredentialTypes, } from \"ts-mls\";\n/** Marmot credential policy (MIP-00): `basic` credential with 32-byte identity. */\nexport const marmotAuthService = {\n async validateCredential(credential, _signaturePublicKey) {\n if (credential.credentialType !== defaultCredentialTypes.basic)\n return false;\n const basic = credential;\n if (!(basic.identity instanceof Uint8Array))\n return false;\n if (basic.identity.length !== 32)\n return false;\n return true;\n },\n};\n//# sourceMappingURL=auth-service.js.map","// Constants for the Marmot protocol\nimport { defaultExtensionTypes } from \"ts-mls\";\n/** The extension id for the last_resort extension for key packages */\nexport const LAST_RESORT_EXTENSION_TYPE = 0x000a;\n/** Event kind for key package relay list events */\nexport const KEY_PACKAGE_RELAY_LIST_KIND = 10051;\n/** The name of the tag that contains relay URLs */\nexport const KEY_PACKAGE_RELAY_LIST_RELAY_TAG = \"relay\";\n/** Event kind for key package events (legacy, read/delete only — do not publish new events of this kind) */\nexport const KEY_PACKAGE_KIND = 443;\n/** Event kind for addressable key package events */\nexport const ADDRESSABLE_KEY_PACKAGE_KIND = 30443;\n/** The name of the tag that contains the MLS protocol version */\nexport const KEY_PACKAGE_MLS_VERSION_TAG = \"mls_protocol_version\";\n/** The name of the tag that contains the MLS cipher suite */\nexport const KEY_PACKAGE_CIPHER_SUITE_TAG = \"mls_ciphersuite\";\n/** The name of the tag that contains the MLS extensions */\nexport const KEY_PACKAGE_EXTENSIONS_TAG = \"mls_extensions\";\n/** The name of the tag that contains the relays */\nexport const KEY_PACKAGE_RELAYS_TAG = \"relays\";\n/** The name of the tag that contains the client */\nexport const KEY_PACKAGE_CLIENT_TAG = \"client\";\n/** The identifier for the Marmot Group Data Extension (MIP-01) */\nexport const MARMOT_GROUP_DATA_EXTENSION_TYPE = 0xf2ee;\n/** The latest supported version number for the Marmot Group Data Extension (MIP-01) */\nexport const MARMOT_GROUP_DATA_VERSION = 2;\n/** Extended extension types that include Marmot-specific extensions */\nexport const extendedExtensionTypes = {\n ...defaultExtensionTypes,\n marmot_group_data: MARMOT_GROUP_DATA_EXTENSION_TYPE,\n last_resort: LAST_RESORT_EXTENSION_TYPE,\n};\n/** Event kind for group events (commits, proposals, application messages) */\nexport const GROUP_EVENT_KIND = 445;\n/** Event kind for welcome events */\nexport const WELCOME_EVENT_KIND = 444;\n//# sourceMappingURL=protocol.js.map","import { LAST_RESORT_EXTENSION_TYPE, MARMOT_GROUP_DATA_EXTENSION_TYPE, } from \"./protocol.js\";\n/** Modifies a {@link Capabilities} object to ensure it includes the extensions required in MIP-00 */\nexport function ensureMarmotCapabilities(capabilities) {\n const extensions = Array.from(capabilities.extensions);\n // Ensure the Marmot Group Data Extension is included in the capabilities\n if (!extensions.includes(MARMOT_GROUP_DATA_EXTENSION_TYPE))\n extensions.push(MARMOT_GROUP_DATA_EXTENSION_TYPE);\n // Ensure the last_resort is included in the capabilities\n if (!extensions.includes(LAST_RESORT_EXTENSION_TYPE))\n extensions.push(LAST_RESORT_EXTENSION_TYPE);\n return {\n ...capabilities,\n extensions,\n };\n}\n//# sourceMappingURL=capabilities.js.map","import { greaseValues } from \"ts-mls\";\nexport const GREASE_VALUE_SET = new Set(greaseValues);\nexport function isGreaseValue(value) {\n return GREASE_VALUE_SET.has(value);\n}\n//# sourceMappingURL=grease.js.map","import { ciphersuites, defaultCapabilities as mlsDefaultCapabilities, defaultCredentialTypes, } from \"ts-mls\";\nimport { ensureMarmotCapabilities } from \"./capabilities.js\";\nimport { isGreaseValue } from \"./grease.js\";\n/**\n * Default capabilities for Marmot key packages.\n *\n * According to MIP-01, key packages MUST signal support for the Marmot Group Data Extension\n * and ratchet_tree in their capabilities to pass validation when being added to groups.\n */\nexport function defaultCapabilities() {\n let capabilities = mlsDefaultCapabilities();\n // Ensure capabilities include the Marmot Group Data Extension\n capabilities = ensureMarmotCapabilities(capabilities);\n // Filter ciphersuites: keep the default one (MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519)\n // and keep GREASE values (numeric IDs), but remove other MLS ciphersuites\n // In v2, ciphersuites is an object mapping names to numeric IDs\n const defaultCiphersuiteName = \"MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519\";\n capabilities.ciphersuites = Object.entries(ciphersuites)\n .filter(([name, id]) => {\n // Keep the default ciphersuite by name\n if (name === defaultCiphersuiteName)\n return true;\n // Keep canonical GREASE values published by ts-mls.\n if (isGreaseValue(id))\n return true;\n return false;\n })\n .map(([, id]) => id);\n // Only include \"basic\" credential type (remove \"x509\" since we don't support it)\n // In v2, credential types are numeric values (see defaultCredentialTypes)\n capabilities.credentials = capabilities.credentials.filter((c) => c === defaultCredentialTypes.basic);\n return capabilities;\n}\n//# sourceMappingURL=default-capabilities.js.map","/**\n * Type guard to check if a value is a Rumor\n */\nexport function isRumorLike(value) {\n if (!value || typeof value !== \"object\")\n return false;\n const r = value;\n return (typeof r.id === \"string\" &&\n typeof r.pubkey === \"string\" &&\n typeof r.kind === \"number\" &&\n typeof r.created_at === \"number\" &&\n typeof r.content === \"string\" &&\n Array.isArray(r.tags));\n}\n//# sourceMappingURL=nostr.js.map","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nfunction isBytes(a) {\n // Plain `instanceof Uint8Array` is too strict for some Buffer / proxy / cross-realm cases. The\n // fallback still requires a real ArrayBuffer view, so plain JSON-deserialized\n // `{ constructor: ... }` spoofing is rejected. `BYTES_PER_ELEMENT === 1` keeps the\n // fallback on byte-oriented views.\n return (a instanceof Uint8Array ||\n (ArrayBuffer.isView(a) &&\n a.constructor.name === 'Uint8Array' &&\n 'BYTES_PER_ELEMENT' in a &&\n a.BYTES_PER_ELEMENT === 1));\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b) {\n if (!isBytes(b))\n throw new TypeError('Uint8Array expected');\n}\nfunction isArrayOf(isString, arr) {\n if (!Array.isArray(arr))\n return false;\n if (arr.length === 0)\n return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n }\n else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\nfunction afn(input) {\n if (typeof input !== 'function')\n throw new TypeError('function expected');\n return true;\n}\nfunction astr(label, input) {\n if (typeof input !== 'string')\n throw new TypeError(`${label}: string expected`);\n return true;\n}\nfunction anumber(n) {\n if (typeof n !== 'number')\n throw new TypeError(`number expected, got ${typeof n}`);\n if (!Number.isSafeInteger(n))\n throw new RangeError(`invalid integer: ${n}`);\n}\nfunction aArr(input) {\n if (!Array.isArray(input))\n throw new TypeError('array expected');\n}\nfunction astrArr(label, input) {\n if (!isArrayOf(true, input))\n throw new TypeError(`${label}: array of strings expected`);\n}\nfunction anumArr(label, input) {\n if (!isArrayOf(false, input))\n throw new TypeError(`${label}: array of numbers expected`);\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain(...args) {\n const id = (a) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a, b) => (c) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters) {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(`alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`);\n return lettersA[i];\n });\n },\n decode: (input) => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined)\n throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = '') {\n astr('join', separator);\n // join('') is only lossless when each chunk is already unambiguous, such as single-symbol alphabets.\n // Multi-character tokens need a separator that cannot appear inside the chunks.\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits, chr = '=') {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data) {\n astrArr('padding.encode', data);\n // Mutates the intermediate token array in place while appending pad chars.\n // utils.padding callers that need to preserve their input should pass a copy.\n while ((data.length * bits) % 8)\n data.push(chr);\n return data;\n },\n decode(input) {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0)\n throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize(fn) {\n afn(fn);\n return { encode: (from) => from, decode: (to) => fn(to) };\n}\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data, from, to) {\n // base 1 is impossible\n if (from < 2)\n throw new RangeError(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2)\n throw new RangeError(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length)\n return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from)\n throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i];\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (!Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done)\n continue;\n else if (!rounded)\n pos = i;\n else\n done = false;\n }\n res.push(carry);\n if (done)\n break;\n }\n // Preserve explicit leading zero digits so callers like base58 keep zero-prefix semantics.\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++)\n res.push(0);\n return res.reverse();\n}\nconst gcd = (a, b) => (b === 0 ? a : gcd(b, a % b));\n// Maximum carry width before the `pos` cycle repeats.\n// Residues advance in gcd(from, to) steps, so the largest pre-drain width is from + (to - gcd).\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from, to) => from + (to - gcd(from, to));\nconst powers = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++)\n res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data, from, to, padding) {\n aArr(data);\n if (from <= 0 || from > 32)\n throw new RangeError(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32)\n throw new RangeError(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`);\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from];\n const mask = powers[to] - 1;\n const res = [];\n for (const n of data) {\n anumber(n);\n if (n >= max)\n throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32)\n throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to)\n res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined)\n throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n // Canonical decode paths reject leftover whole input words and non-zero pad bits.\n // For Bech32 5->8 regrouping, this is the \"4 bits or less, all zeroes\" tail rule.\n if (!padding && pos >= from)\n throw new Error('Excess padding');\n if (!padding && carry > 0)\n throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0)\n res.push(carry >>> 0);\n return res;\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num) {\n anumber(num);\n const _256 = 2 ** 8;\n // Base-range and carry-overflow checks live in convertRadix so encode/decode reject unsupported bases symmetrically.\n return {\n encode: (bytes) => {\n if (!isBytes(bytes))\n throw new TypeError('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits, revPadding = false) {\n anumber(bits);\n if (bits <= 0 || bits > 32)\n throw new RangeError('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new RangeError('radix2: carry overflow');\n // revPadding flips which direction allows a partial zero tail.\n // Default pads 8->bits and rejects extra bits on bits->8; `true` does the opposite.\n return {\n encode: (bytes) => {\n if (!isBytes(bytes))\n throw new TypeError('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\nfunction unsafeWrapper(fn) {\n afn(fn);\n return function (...args) {\n // Only for *Unsafe APIs that intentionally collapse validation failures to `undefined`.\n // Do not wrap code that needs to preserve exception details.\n try {\n return fn.apply(null, args);\n }\n catch (e) { }\n };\n}\nfunction checksum(len, fn) {\n anumber(len);\n // Reject degenerate zero-byte checksums up front so callers don't accidentally\n // build a no-op checksum stage.\n if (len <= 0)\n throw new RangeError(`checksum length must be positive: ${len}`);\n afn(fn);\n const _fn = fn;\n // Uses the first `len` bytes of fn(data) in both directions.\n // Current call sites rely on `len > 0` and checksum functions that return at least that many bytes.\n return {\n encode(data) {\n if (!isBytes(data))\n throw new TypeError('checksum.encode: input should be Uint8Array');\n const sum = _fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data) {\n if (!isBytes(data))\n throw new TypeError('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = _fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i])\n throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n// prettier-ignore\n/**\n * Low-level building blocks used by the exported codecs.\n * @example\n * Build a radix-32 coder from the low-level helpers.\n * ```ts\n * import { utils } from '@scure/base';\n * utils.radix2(5).encode(Uint8Array.from([1, 2, 3]));\n * ```\n */\nexport const utils = /* @__PURE__ */ Object.freeze({\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n});\n// RFC 4648 aka RFC 3548\n// ---------------------\n/**\n * base16 encoding from RFC 4648.\n * This codec uses RFC 4648 Table 5's uppercase alphabet directly.\n * RFC 4648 §8 calls base16 \"case-insensitive hex encoding\", but we intentionally do not case-fold decode input here.\n * Use `hex` for case-insensitive hex decoding.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16 = /* @__PURE__ */ Object.freeze(chain(radix2(4), alphabet('0123456789ABCDEF'), join('')));\n/**\n * base32 encoding from RFC 4648. Has padding.\n * RFC 4648 §6 Table 3 uses uppercase letters, and RFC 4648 §3.4 allows applications to choose\n * upper- or lowercase alphabets. We keep the published uppercase table and do not case-fold decode input.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32 = /* @__PURE__ */ Object.freeze(chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), padding(5), join('')));\n/**\n * base32 encoding from RFC 4648. No padding.\n * This variant inherits RFC 4648 base32's uppercase table and intentionally does not case-fold decode input.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad = /* @__PURE__ */ Object.freeze(chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), join('')));\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * RFC 4648 §7 Table 4 uses uppercase letters, and we intentionally keep that table without case-folding decode input.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex = /* @__PURE__ */ Object.freeze(chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), padding(5), join('')));\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * This variant inherits RFC 4648 base32hex's uppercase table and intentionally does not case-fold decode input.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad = /* @__PURE__ */ Object.freeze(chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), join('')));\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * See {@link https://www.crockford.com/base32.html | Douglas Crockford's Base32}.\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford = /* @__PURE__ */ Object.freeze(chain(radix2(5), alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'), join(''), normalize((s) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))));\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// Require both directions before taking the native fast path, so base64/base64url don't mix native and JS behavior.\n// prettier-ignore\nconst hasBase64Builtin = /* @__PURE__ */ (() => typeof Uint8Array.from([]).toBase64 === 'function' &&\n typeof Uint8Array.fromBase64 === 'function')();\n// Native `Uint8Array.fromBase64()` accepts these ASCII whitespace chars.\n// Reject them first so the native base64 path still follows RFC 4648 §3.3.\n// ASCII whitespace is U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, or U+0020 SPACE\nconst ASCII_WHITESPACE = /[\\t\\n\\f\\r ]/;\nconst decodeBase64Builtin = (s, isUrl) => {\n astr('base64', s);\n const alphabet = isUrl ? 'base64url' : 'base64';\n // Per spec, .fromBase64 already throws on any other non-alphabet symbols except ASCII whitespace\n // And checking just for whitespace makes decoding about 3x faster than a full range check.\n // lastChunkHandling: 'strict' rejects loose tails and non-zero pad bits so native decoding stays canonical.\n if (s.length > 0 && ASCII_WHITESPACE.test(s))\n throw new Error('invalid base64');\n return Uint8Array.fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64 = /* @__PURE__ */ Object.freeze(hasBase64Builtin ? {\n encode(b) { abytes(b); return b.toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), padding(6), join('')));\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad = /* @__PURE__ */ Object.freeze(chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), join('')));\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url = /* @__PURE__ */ Object.freeze(hasBase64Builtin ? {\n encode(b) { abytes(b); return b.toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), padding(6), join('')));\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad = /* @__PURE__ */ Object.freeze(chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), join('')));\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc) => chain(radix(58), alphabet(abc), join(''));\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * const text = base58.encode(Uint8Array.from([0, 1, 2]));\n * base58.decode(text);\n * // => Uint8Array.from([0, 1, 2])\n * ```\n */\nexport const base58 = /* @__PURE__ */ Object.freeze(genBase58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'));\n/**\n * base58: flickr version. Check out `base58`.\n * @example\n * Round-trip bytes with the Flickr alphabet.\n * ```ts\n * const text = base58flickr.encode(Uint8Array.from([0, 1, 2]));\n * base58flickr.decode(text);\n * ```\n */\nexport const base58flickr = /* @__PURE__ */ Object.freeze(genBase58('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'));\n/**\n * base58: XRP version. Check out `base58`.\n * @example\n * Round-trip bytes with the XRP alphabet.\n * ```ts\n * const text = base58xrp.encode(Uint8Array.from([0, 1, 2]));\n * base58xrp.decode(text);\n * ```\n */\nexport const base58xrp = /* @__PURE__ */ Object.freeze(genBase58('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'));\n// Data len (index) -> encoded block len.\n// Monero pads each 1..8-byte block to this fixed base58 width so decode can recover the tail length.\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n * @example\n * Round-trip bytes with the Monero block codec.\n * ```ts\n * const text = base58xmr.encode(Uint8Array.from([0, 1, 2]));\n * base58xmr.decode(text);\n * ```\n */\nexport const base58xmr = /* @__PURE__ */ Object.freeze({\n encode(data) {\n abytes(data);\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length], '1');\n }\n return res;\n },\n decode(str) {\n astr('base58xmr.decode', str);\n let res = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0)\n throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n});\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n * Callers must include any version bytes in `data`; this helper only applies the\n * 4-byte double-SHA256 checksum used by Bitcoin Base58Check.\n * @param sha256 - Function used to calculate the checksum hash.\n * @returns base58check codec using 4 checksum bytes.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Create a base58check codec from a SHA-256 implementation.\n * ```ts\n * import { createBase58check } from '@scure/base';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * const coder = createBase58check(sha256);\n * coder.encode(Uint8Array.from([1, 2, 3]));\n * ```\n */\nexport const createBase58check = (sha256) => {\n // Validate the hash function at construction time so wrong inputs fail before returning a coder.\n afn(sha256);\n const _sha256 = sha256;\n return chain(checksum(4, (data) => _sha256(_sha256(data))), base58);\n};\n/**\n * Use `createBase58check` instead.\n * @deprecated Use {@link createBase58check} instead.\n * Callers must include any version bytes in `data`; this alias keeps the same\n * 4-byte double-SHA256 checksum behavior as `createBase58check`.\n * @param sha256 - Function used to calculate the checksum hash.\n * @returns base58check codec using 4 checksum bytes.\n * @example\n * Create a base58check codec with the deprecated alias.\n * ```ts\n * import { base58check } from '@scure/base';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * const coder = base58check(sha256);\n * coder.encode(Uint8Array.from([1, 2, 3]));\n * ```\n */\nexport const base58check = createBase58check;\n// BIP 173 character table: data values 0..31 map to `qpzry9x8gf2tvdw0s3jn54khce6mua7l`.\nconst BECH_ALPHABET = chain(alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), join(''));\n// BIP 173 `bech32_polymod` GEN coefficients.\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\n// BIP 173 step split: this applies the polymod state transition before callers xor in the next 5-bit value.\nfunction bech32Polymod(pre) {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1)\n chk ^= POLYMOD_GENERATORS[i];\n }\n return chk;\n}\nfunction bechChecksum(prefix, words, encodingConst = 1) {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126)\n throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++)\n chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words)\n chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++)\n chk = bech32Polymod(chk);\n // BIP 173/BIP 350: xor the final checksum constant, then emit the 30-bit state as six 5-bit symbols.\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]], 30, 5, false));\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding) {\n // BIP 173 uses final xor constant 1; BIP 350 swaps in 0x2bc830a3 for Bech32m.\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n function encode(prefix, words, limit = 90) {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words))\n words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0)\n throw new TypeError(`Invalid prefix length ${plen}`);\n // Total output is hrp + `1` separator + payload words + 6 checksum chars.\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}`;\n }\n function decode(str, limit = 90) {\n astr('bech32.decode input', str);\n const slen = str.length;\n // Minimum length is 1-char hrp + `1` separator + 6-char checksum.\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6)\n throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum))\n throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n const decodeUnsafe = unsafeWrapper(decode);\n function decodeToBytes(str) {\n // Keep the byte helper unbounded; callers that need the default BIP 173 length cap should use decode(str).\n const { prefix, words } = decode(str, false);\n return {\n prefix,\n words,\n bytes: fromWords(words),\n };\n }\n function encodeFromBytes(prefix, bytes) {\n // Keep the convenience wrapper on encode()'s default 90-char cap; custom limits should call encode(prefix, toWords(bytes), limit).\n return encode(prefix, toWords(bytes));\n }\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level helpers, check out {@link https://github.com/paulmillr/scure-btc-signer | scure-btc-signer}.\n * @example\n * Convert bytes to words, encode them, then decode back.\n * ```ts\n * const words = bech32.toWords(Uint8Array.from([1, 2, 3]));\n * const text = bech32.encode('bc', words);\n * bech32.decode(text);\n * ```\n */\nexport const bech32 = /* @__PURE__ */ Object.freeze(genBech32('bech32'));\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level helpers, check out {@link https://github.com/paulmillr/scure-btc-signer | scure-btc-signer}.\n * @example\n * Convert bytes to words, encode them with bech32m, then decode back.\n * ```ts\n * const words = bech32m.toWords(Uint8Array.from([1, 2, 3]));\n * const text = bech32m.encode('bc', words);\n * bech32m.decode(text);\n * ```\n */\nexport const bech32m = /* @__PURE__ */ Object.freeze(genBech32('bech32m'));\n/**\n * ASCII-to-byte decoder. Rejects non-ASCII text and bytes instead of doing UTF-8 replacement.\n * Method names follow `BytesCoder`, so `encode(bytes)` returns a string and `decode(string)` returns bytes.\n * @example\n * ```js\n * const b = ascii.decode(\"ABC\"); // => new Uint8Array([ 65, 66, 67 ])\n * const str = ascii.encode(b); // \"ABC\"\n * ```\n */\nexport const ascii = /* @__PURE__ */ Object.freeze({\n encode(data) {\n abytes(data);\n let res = '';\n for (let i = 0; i < data.length; i++) {\n const byte = data[i];\n // ASCII is 7-bit; reject bytes outside 0x00..0x7f instead of silently widening to\n // Latin-1/UTF-8.\n if (byte > 127)\n throw new RangeError(`bytes contain non-ASCII byte ${byte} at position ${i}`);\n res += String.fromCharCode(byte);\n }\n return res;\n },\n decode(str) {\n if (typeof str !== 'string')\n throw new TypeError('ascii string expected, got ' + typeof str);\n const res = new Uint8Array(str.length);\n for (let i = 0; i < str.length; i++) {\n // Indexed access is much faster than Uint8Array.from(str, mapFn) here and keeps\n // exact error positions.\n const charCode = str.charCodeAt(i);\n if (charCode > 127) {\n throw new RangeError(`string contains non-ASCII character \"${str[i]}\" with code ${charCode} at position ${i}`);\n }\n res[i] = charCode;\n }\n return res;\n },\n});\nconst _isWellFormedShim = (str) => {\n // encodeURI rejects malformed UTF-16, giving a compact fallback that matches native\n // isWellFormed on our tests/fuzz corpus.\n try {\n return encodeURI(str) !== null;\n }\n catch {\n return false;\n }\n};\nconst _isWellFormed = /* @__PURE__ */ (() => \n// Pick the native check once so utf8.decode doesn't re-probe String.prototype on every call.\ntypeof ''.isWellFormed === 'function'\n ? (str) => str.isWellFormed()\n : _isWellFormedShim)();\n// This fallback stays small because strict UTF-8 only needs fatal decoding plus well-formed\n// UTF-16 checks, not the replacement, streaming, or legacy-encoding behavior of full platform\n// text codecs.\nconst utf8Fallback = /* @__PURE__ */ Object.freeze({\n encode(data) {\n abytes(data);\n let res = '';\n for (let i = 0; i < data.length;) {\n const a = data[i++];\n if (a < 0b1000_0000) {\n res += String.fromCharCode(a);\n continue;\n }\n if (a < 0b1100_0010 || i >= data.length)\n throw new TypeError(`invalid utf8 at byte ${i - 1}`);\n const b = data[i++];\n if ((b & 0b1100_0000) !== 0b1000_0000)\n throw new TypeError(`invalid utf8 at byte ${i - 1}`);\n let cp = ((a & 0b0001_1111) << 6) | (b & 0b0011_1111);\n if (a >= 0b1110_0000) {\n if (i >= data.length)\n throw new TypeError(`invalid utf8 at byte ${i - 1}`);\n const c = data[i++];\n if ((c & 0b1100_0000) !== 0b1000_0000 ||\n (a === 0b1110_0000 && b < 0b1010_0000) ||\n (a === 0xed && b >= 0b1010_0000))\n throw new TypeError(`invalid utf8 at byte ${i - 1}`);\n cp = ((a & 0b0000_1111) << 12) | ((b & 0b0011_1111) << 6) | (c & 0b0011_1111);\n if (a >= 0b1111_0000) {\n if (i >= data.length)\n throw new TypeError(`invalid utf8 at byte ${i - 1}`);\n const d = data[i++];\n if (a > 0b1111_0100 ||\n (d & 0b1100_0000) !== 0b1000_0000 ||\n (a === 0b1111_0000 && b < 0b1001_0000) ||\n (a === 0b1111_0100 && b >= 0b1001_0000))\n throw new TypeError(`invalid utf8 at byte ${i - 1}`);\n cp =\n ((a & 7) << 18) |\n ((b & 0b0011_1111) << 12) |\n ((c & 0b0011_1111) << 6) |\n (d & 0b0011_1111);\n }\n }\n if (cp < 0x10000)\n res += String.fromCharCode(cp);\n else {\n cp -= 0x10000;\n res += String.fromCharCode((cp >> 10) + 0xd800, (cp & 0x3ff) + 0xdc00);\n }\n }\n return res;\n },\n decode(str) {\n astr('utf8', str);\n if (!_isWellFormed(str))\n throw new TypeError('utf8 expected well-formed string');\n // Direct Uint8Array writes are much faster than number[] + Uint8Array.from on Hermes and\n // large Node inputs.\n const res = new Uint8Array(str.length * 3);\n let pos = 0;\n for (let i = 0; i < str.length; i++) {\n let c = str.charCodeAt(i);\n if (c < 0b1000_0000) {\n res[pos++] = c;\n continue;\n }\n if (c >= 0xd800 && c <= 0xdfff) {\n const d = str.charCodeAt(++i);\n c = 0x10000 + ((c - 0xd800) << 10) + d - 0xdc00;\n }\n if (c >= 0x10000) {\n res[pos++] = (c >> 18) | 0b1111_0000;\n res[pos++] = ((c >> 12) & 0b0011_1111) | 0b1000_0000;\n }\n else if (c >= 0x800)\n res[pos++] = (c >> 12) | 0b1110_0000;\n else\n res[pos++] = (c >> 6) | 0b1100_0000;\n if (c >= 0x800)\n res[pos++] = ((c >> 6) & 0b0011_1111) | 0b1000_0000;\n res[pos++] = (c & 0b0011_1111) | 0b1000_0000;\n }\n return res.subarray(0, pos);\n },\n});\n/**\n * Strict UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder when available.\n * Method names follow `BytesCoder`, so `encode(bytes)` returns a string and\n * `decode(string)` returns bytes.\n * `encode(bytes)` requires Uint8Array input, preserves an explicit leading BOM, and\n * throws on invalid UTF-8 bytes.\n * `decode(string)` requires a primitive string and throws on malformed UTF-16 strings with\n * lone surrogates.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8 = /* @__PURE__ */ (() => {\n let _utf8Encoder;\n let _utf8Decoder;\n const utf8Builtin = {\n // ignoreBOM preserves an explicit leading U+FEFF;\n // fatal rejects invalid UTF-8 bytes instead of replacing them.\n encode(data) {\n abytes(data);\n return (_utf8Decoder || (_utf8Decoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }))).decode(data);\n },\n decode(str) {\n astr('utf8', str);\n if (!_isWellFormed(str))\n throw new TypeError('utf8 expected well-formed string');\n return (_utf8Encoder || (_utf8Encoder = new TextEncoder())).encode(str);\n },\n };\n return Object.freeze({\n // Select each direction once at module init, since\n // TextEncoder and TextDecoder can exist independently.\n encode: typeof TextDecoder === 'function' ? utf8Builtin.encode : utf8Fallback.encode,\n decode: typeof TextEncoder === 'function' ? utf8Builtin.decode : utf8Fallback.decode,\n });\n})();\n// Keep fallback parity probes behind a test-only export until runtime fallback behavior is decided.\nexport const __TESTS = /* @__PURE__ */ Object.freeze({\n utf8Fallback: utf8Fallback,\n _isWellFormedShim: _isWellFormedShim,\n});\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// Require both directions before enabling the native hex path so encode/decode stay symmetric.\ntypeof Uint8Array.from([]).toHex === 'function' &&\n typeof Uint8Array.fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin = {\n // Keep local type guards so the native path preserves library-level input errors.\n // Native toHex emits lowercase hex, matching the fallback alphabet and Node's hex strings.\n encode(data) { abytes(data); return data.toHex(); },\n // Native fromHex accepts either hex case and rejects odd-length / non-hex syntax.\n decode(s) { astr('hex', s); return Uint8Array.fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * Lowercase codec; unlike `base16`, this variant accepts either hex case and emits lowercase.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex = /* @__PURE__ */ Object.freeze(hasHexBuiltin\n ? hexBuiltin\n : chain(radix2(4), alphabet('0123456789abcdef'), join(''), normalize((s) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(`hex.decode: expected string, got ${typeof s} with length ${s.length}`);\n return s.toLowerCase();\n })));\n// prettier-ignore\n// Keep this registry aligned with CoderType/coderTypeError; only byte<->string codecs belong here.\nconst CODERS = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\nconst coderTypeError = 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n/**\n * Encodes bytes with one of the built-in codecs.\n * @deprecated Use the codec directly, for example `hex.encode(bytes)`.\n * @param type - Codec name.\n * @param bytes - Bytes to encode.\n * @returns Encoded string.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * ```ts\n * bytesToString('hex', Uint8Array.from([1, 2, 255]));\n * ```\n */\nexport const bytesToString = (type, bytes) => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type))\n throw new TypeError(coderTypeError);\n if (!isBytes(bytes))\n throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n/**\n * Alias for `bytesToString`.\n * @deprecated Use {@link bytesToString} or the codec directly instead.\n * @param type - Codec name.\n * @param bytes - Bytes to encode.\n * @returns Encoded string.\n * @example\n * ```ts\n * str('hex', Uint8Array.from([1, 2, 255]));\n * ```\n */\nexport const str = bytesToString; // as in python, but for bytes only\n/**\n * Decodes a string with one of the built-in codecs.\n * @deprecated Use the codec directly, for example `hex.decode(text)`.\n * @param type - Codec name.\n * @param str - Encoded string.\n * @returns Decoded bytes.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * ```ts\n * stringToBytes('hex', '0102ff');\n * ```\n */\nexport const stringToBytes = (type, str) => {\n // Match bytesToString's selector validation so hostile `toString()` coercions can't leak custom errors.\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type))\n throw new TypeError(coderTypeError);\n if (typeof str !== 'string')\n throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/**\n * Alias for `stringToBytes`.\n * @deprecated Use {@link stringToBytes} or the codec directly instead.\n * @param type - Codec name.\n * @param str - Encoded string.\n * @returns Decoded bytes.\n * @example\n * ```ts\n * bytes('hex', '0102ff');\n * ```\n */\nexport const bytes = stringToBytes;\n//# sourceMappingURL=index.js.map","import { bytesToHex, hexToBytes } from \"@noble/hashes/utils.js\";\nimport { base64 } from \"@scure/base\";\n/**\n * Encodes binary data to a string using the specified format.\n *\n * @param bytes - The binary data to encode\n * @param format - The encoding format ('base64' or 'hex')\n * @returns The encoded string\n */\nexport function encodeContent(bytes, format) {\n if (format === \"base64\") {\n return base64.encode(bytes);\n }\n else {\n // hex format\n return bytesToHex(bytes);\n }\n}\n/**\n * Decodes a string to binary data using the specified or auto-detected format.\n *\n * @param content - The encoded string\n * @param format - Optional encoding format. If not specified, will auto-detect.\n * @returns The decoded binary data\n * @throws Error if the content cannot be decoded\n */\nexport function decodeContent(content, format) {\n const actualFormat = format ?? detectEncoding(content);\n if (actualFormat === \"base64\") {\n try {\n return base64.decode(content);\n }\n catch (error) {\n throw new Error(`Failed to decode base64 content: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n else {\n try {\n return hexToBytes(content);\n }\n catch (error) {\n throw new Error(`Failed to decode hex content: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n/**\n * Detects the encoding format of a content string.\n *\n * @param content - The encoded string to analyze\n * @returns The detected encoding format\n */\nexport function detectEncoding(content) {\n // Remove whitespace for analysis\n const cleaned = content.trim();\n // Check if it's valid hex (only contains 0-9, a-f, A-F)\n const isHex = /^[0-9a-fA-F]+$/.test(cleaned);\n // If it's valid hex and has even length, it's likely hex\n // (hex encoding always produces even-length strings)\n if (isHex && cleaned.length % 2 === 0) {\n return \"hex\";\n }\n // If it contains characters outside hex range (like +, /) or has base64 padding,\n // it's definitely base64\n if (/[+/=]/.test(cleaned) || !isHex) {\n return \"base64\";\n }\n // If it's valid hex but odd length, it's malformed hex, try base64\n if (isHex && cleaned.length % 2 !== 0) {\n return \"base64\";\n }\n // Default to base64 for ambiguous cases\n return \"base64\";\n}\n/**\n * Extracts the encoding tag from a Nostr event.\n *\n * @param event - The Nostr event to check\n * @returns The encoding format specified in the event, or undefined if not present\n */\nexport function getEncodingTag(event) {\n const encodingTag = event.tags.find((tag) => tag[0] === \"encoding\");\n if (!encodingTag || encodingTag.length < 2) {\n return undefined;\n }\n const value = encodingTag[1];\n if (value === \"base64\" || value === \"hex\") {\n return value;\n }\n return undefined;\n}\n//# sourceMappingURL=encoding.js.map","import { EventMemory } from \"applesauce-core/event-store\";\nimport { safeParse } from \"applesauce-core/helpers\";\nimport { getEncryptedContent, isEncryptedContentUnlocked, lockEncryptedContent, unlockEncryptedContent, } from \"applesauce-core/helpers/encrypted-content\";\nimport { kinds, notifyEventUpdate, verifyWrappedEvent, } from \"applesauce-core/helpers/event\";\n/**\n * An internal event set to keep track of seals and rumors\n * This is intentionally isolated from the main applications event store so to prevent seals and rumors from being leaked\n */\nexport const internalGiftWrapEvents = new EventMemory();\n/** Used to store a reference to the seal event on gift wraps (downstream) or the seal event on rumors (upstream[]) */\nexport const SealSymbol = Symbol.for(\"seal\");\n/** Used to store a reference to the rumor on seals (downstream) */\nexport const RumorSymbol = Symbol.for(\"rumor\");\n/** Used to store a reference to the parent gift wrap event on seals (upstream) */\nexport const GiftWrapSymbol = Symbol.for(\"gift-wrap\");\n/** Adds a parent reference to a seal or rumor */\nfunction addParentSealReference(rumor, seal) {\n const parents = Reflect.get(rumor, SealSymbol);\n if (!parents)\n Reflect.set(rumor, SealSymbol, new Set([seal]));\n else\n parents.add(seal);\n}\n/** Removes a parent reference from a seal or rumor */\nfunction removeParentSealReference(rumor, seal) {\n const parents = Reflect.get(rumor, SealSymbol);\n if (parents)\n parents.delete(seal);\n}\n/** Checks if an event is a rumor (normal event with \"id\" and no \"sig\") */\nexport function isRumor(event) {\n if (event === undefined || event === null)\n return false;\n return (event.id?.length === 64 &&\n !(\"sig\" in event) &&\n typeof event.pubkey === \"string\" &&\n event.pubkey.length === 64 &&\n typeof event.content === \"string\" &&\n Array.isArray(event.tags) &&\n typeof event.created_at === \"number\" &&\n event.created_at > 0);\n}\nexport function getSealGiftWrap(seal) {\n return Reflect.get(seal, GiftWrapSymbol);\n}\n/** Returns all the parent seals for a rumor event */\nexport function getRumorSeals(rumor) {\n let set = Reflect.get(rumor, SealSymbol);\n if (!set) {\n set = new Set();\n Reflect.set(rumor, SealSymbol, set);\n }\n return Array.from(set);\n}\n/** Returns all the parent gift wraps for a rumor event */\nexport function getRumorGiftWraps(rumor) {\n const giftWraps = new Set();\n const seals = getRumorSeals(rumor);\n for (const seal of seals) {\n const upstream = getSealGiftWrap(seal);\n if (upstream)\n giftWraps.add(upstream);\n }\n return Array.from(giftWraps);\n}\n/** Checks if a seal event is locked and casts it to the {@link UnlockedSeal} type */\nexport function isSealUnlocked(seal) {\n return RumorSymbol in seal || (isEncryptedContentUnlocked(seal) === true && getSealRumor(seal) !== undefined);\n}\n/** Returns if a gift-wrap event or gift-wrap seal is locked */\nexport function isGiftWrapUnlocked(gift) {\n if (isEncryptedContentUnlocked(gift) === false)\n return false;\n // Get the seal event\n const seal = getGiftWrapSeal(gift);\n if (!seal)\n return false;\n // If seal is locked, return false\n if (!isSealUnlocked(seal))\n return false;\n return true;\n}\nexport function getSealRumor(seal) {\n // Non seal events cant have rumors\n if (seal.kind !== kinds.Seal)\n return undefined;\n // If unlocked return the rumor\n if (RumorSymbol in seal)\n return seal[RumorSymbol];\n // Get the encrypted content plaintext\n const content = getEncryptedContent(seal);\n // Return undefined if the content is not found\n if (!content)\n return undefined;\n // Parse the content as a rumor event\n let rumor = safeParse(content);\n // Failed to parse rumor, save undefined and return undefined\n if (!rumor) {\n Reflect.set(seal, RumorSymbol, undefined);\n return undefined;\n }\n // Check if the rumor event already exists in the internal event set\n const existing = internalGiftWrapEvents.getEvent(rumor.id);\n if (existing)\n // Reuse the existing rumor instance\n rumor = existing;\n else\n // Add to the internal event set\n internalGiftWrapEvents.add(rumor);\n // Throw an error if the seal and rumor authors do not match\n if (rumor.pubkey !== seal.pubkey)\n throw new Error(\"Seal author does not match rumor author\");\n // Save a reference to the parent seal event\n addParentSealReference(rumor, seal);\n // Cache the rumor event\n Reflect.set(seal, RumorSymbol, rumor);\n return rumor;\n}\nexport function getGiftWrapSeal(gift) {\n // Returned cached seal if it exists (downstream)\n if (SealSymbol in gift)\n return gift[SealSymbol];\n // Get the encrypted content\n const content = getEncryptedContent(gift);\n // Return undefined if the content is not found\n if (!content)\n return undefined;\n // Parse seal as nostr event\n let seal = JSON.parse(content);\n // Check if the seal event already exists in the internal event set\n const existing = internalGiftWrapEvents.getEvent(seal.id);\n if (existing) {\n // Reuse the existing seal instance\n seal = existing;\n }\n else {\n // Verify the seal event\n verifyWrappedEvent(seal);\n // Add to the internal event set\n internalGiftWrapEvents.add(seal);\n // Set the reference to the parent gift wrap event (upstream)\n Reflect.set(seal, GiftWrapSymbol, gift);\n }\n // Save a reference to the seal on the gift wrap (downstream)\n Reflect.set(gift, SealSymbol, seal);\n return seal;\n}\nexport function getGiftWrapRumor(gift) {\n const seal = getGiftWrapSeal(gift);\n if (!seal)\n return undefined;\n return getSealRumor(seal);\n}\n/**\n * Unlocks a seal event and returns the rumor event\n * @throws {Error} If the author of the rumor event does not match the author of the seal\n */\nexport async function unlockSeal(seal, signer) {\n // If already unlocked, return the rumor\n if (isSealUnlocked(seal))\n return seal[RumorSymbol];\n // unlock encrypted content as needed\n await unlockEncryptedContent(seal, seal.pubkey, signer);\n const rumor = getSealRumor(seal);\n if (!rumor)\n throw new Error(\"Failed to read rumor in gift wrap\");\n // Notify event store\n notifyEventUpdate(seal);\n return rumor;\n}\n/**\n * Unlocks and returns the unsigned seal event in a gift-wrap\n * @throws {Error} If the author of the rumor event does not match the author of the seal\n */\nexport async function unlockGiftWrap(gift, signer) {\n // If already unlocked, return the rumor\n if (isGiftWrapUnlocked(gift))\n return getGiftWrapRumor(gift);\n // Unlock the encrypted content\n await unlockEncryptedContent(gift, gift.pubkey, signer);\n // Parse seal as nostr event\n let seal = getGiftWrapSeal(gift);\n if (!seal)\n throw new Error(\"Failed to read seal in gift wrap\");\n // Unlock the seal event\n const rumor = await unlockSeal(seal, signer);\n // if the event has been added to an event store, notify it\n notifyEventUpdate(gift);\n return rumor;\n}\n/** Locks a gift-wrap event and seals its seal event */\nexport function lockGiftWrap(gift) {\n const seal = getGiftWrapSeal(gift);\n if (seal) {\n const rumor = getSealRumor(seal);\n // Remove the rumors parent seal reference (upstream)\n if (rumor)\n removeParentSealReference(rumor, seal);\n // Remove the seal's parent gift wrap reference (upstream)\n Reflect.deleteProperty(seal, GiftWrapSymbol);\n // Remove the seal's rumor reference (downstream)\n Reflect.deleteProperty(seal, RumorSymbol);\n // Lock the seal's encrypted content\n lockEncryptedContent(seal);\n }\n // Remove the gift wrap's seal reference (downstream)\n Reflect.deleteProperty(gift, SealSymbol);\n // Lock the gift wrap's encrypted content\n lockEncryptedContent(gift);\n}\n","// Read https://github.com/nostr-protocol/nips/blob/master/59.md#overview for details on rumors and seals\n// Gift wrap (signed random key) -> seal (signed sender key) -> rumor (unsigned)\nimport { buildEvent } from \"applesauce-core/event-factory\";\nimport { EncryptedContentSymbol } from \"applesauce-core/helpers/encrypted-content\";\nimport { nip44 } from \"applesauce-core/helpers/encryption\";\nimport { finalizeEvent, getEventHash, kinds, } from \"applesauce-core/helpers/event\";\nimport { generateSecretKey } from \"applesauce-core/helpers/keys\";\nimport { eventPipe, PRESERVE_EVENT_SYMBOLS } from \"applesauce-core/helpers/pipeline\";\nimport { unixNow } from \"applesauce-core/helpers/time\";\nimport { setEncryptedContent } from \"applesauce-core/operations/encrypted-content\";\nimport { setMetaTags, stamp } from \"applesauce-core/operations/event\";\nimport { GiftWrapSymbol, RumorSymbol, SealSymbol } from \"../helpers/gift-wrap.js\";\n// Preserve gift-wrap and seal symbols when building gift-wrap events\nPRESERVE_EVENT_SYMBOLS.add(GiftWrapSymbol);\nPRESERVE_EVENT_SYMBOLS.add(SealSymbol);\nPRESERVE_EVENT_SYMBOLS.add(RumorSymbol);\n/** Create a timestamp with a random offset of an hour */\nfunction randomNow() {\n return unixNow() - Math.floor(Math.random() * 60 * 60);\n}\n/** Converts an event to a rumor. The first operation in the gift wrap pipeline */\nexport function toRumor() {\n return async (draft, ctx) => {\n // @ts-expect-error\n const rumor = { ...draft };\n // Ensure rumor has pubkey\n if (!Reflect.has(rumor, \"pubkey\")) {\n if (!ctx.signer)\n throw new Error(\"A signer is required to create a rumor\");\n rumor.pubkey = await ctx.signer.getPublicKey();\n }\n // Ensure rumor has id\n if (!Reflect.has(rumor, \"id\"))\n rumor.id = getEventHash(rumor);\n // Ensure rumor does not have signature\n Reflect.deleteProperty(rumor, \"sig\");\n return rumor;\n };\n}\n/** Seals a rumor in a NIP-59 seal. The second operation in the gift wrap pipeline */\nexport function sealRumor(pubkey) {\n return async (rumor, ctx) => {\n if (!ctx.signer)\n throw new Error(\"A signer is required to create a seal\");\n const plaintext = JSON.stringify(rumor);\n const unsigned = await buildEvent({ kind: kinds.Seal, created_at: randomNow() }, ctx, \n // Set the encrypted content\n setEncryptedContent(pubkey, plaintext), \n // Stamp the seal with the signers's pubkey\n stamp());\n const seal = await ctx.signer.signEvent(unsigned);\n // Set the downstream reference on the seal\n Reflect.set(seal, RumorSymbol, rumor);\n // Add the upstream reference to the rumor\n const seals = Reflect.get(rumor, SealSymbol);\n if (seals)\n seals.add(seal);\n else\n Reflect.set(rumor, SealSymbol, new Set([seal]));\n return seal;\n };\n}\n/** Gift wraps a seal to a pubkey. The third operation in the gift wrap pipeline */\nexport function wrapSeal(pubkey, opts) {\n return async (seal) => {\n const key = generateSecretKey();\n const plaintext = JSON.stringify(seal);\n const draft = await buildEvent({\n kind: kinds.GiftWrap,\n created_at: randomNow(),\n content: nip44.encrypt(plaintext, nip44.getConversationKey(key, pubkey)),\n tags: [[\"p\", pubkey]],\n }, \n // Pass an empty context here so here there is no chance to use the users pubkey\n {}, \n // Set meta tags on the gift wrap\n setMetaTags(opts));\n const gift = finalizeEvent(draft, key);\n // Set the upstream references on the seal\n Reflect.set(seal, GiftWrapSymbol, gift);\n // Set the downstream reference on the gift wrap\n Reflect.set(gift, SealSymbol, seal);\n // Set the encrypted content on the gift wrap\n Reflect.set(gift, EncryptedContentSymbol, plaintext);\n return gift;\n };\n}\n/** An operation that gift wraps an event to a pubkey */\nexport function giftWrap(pubkey, opts) {\n return eventPipe(toRumor(), \n // @ts-expect-error\n sealRumor(pubkey), wrapSeal(pubkey, opts));\n}\n","import { buildEvent } from \"applesauce-core/event-factory\";\nimport { giftWrap } from \"../operations/gift-wrap.js\";\n/** Creates a gift wrapped event based on a blueprint */\nexport function GiftWrapBlueprint(pubkey, blueprint, opts) {\n return async (ctx) => (await buildEvent(typeof blueprint === \"function\" ? await blueprint(ctx) : blueprint, ctx, giftWrap(pubkey, opts)));\n}\n","import { GiftWrapBlueprint } from \"applesauce-common/blueprints/gift-wrap\";\nimport { createEvent } from \"applesauce-core/event-factory\";\n/** Returns the value of a name / value tag */\nexport function getTagValue(event, name) {\n return event.tags.find((t) => t[0] === name)?.[1];\n}\n/**\n * Creates a gift wrap event (kind 1059) for a welcome message.\n *\n * Uses applesauce-factory's GiftWrapBlueprint to create the gift wrap event\n * for the recipient, providing privacy and unlinkability (NIP-59).\n *\n * @param options - Configuration for creating the gift wrap\n * @returns A signed gift wrap event ready for publishing\n */\nexport async function createGiftWrap(options) {\n const { rumor, recipient, signer, opts } = options;\n // Use the GiftWrapBlueprint to create the gift wrap\n return await createEvent({ signer }, GiftWrapBlueprint, recipient, rumor, opts);\n}\n/** Returns the current Unix timestamp in seconds */\nexport function unixNow() {\n return Math.floor(Date.now() / 1000);\n}\nexport const hasAck = (publishResult) => Object.values(publishResult).some((res) => res.ok);\n//# sourceMappingURL=nostr.js.map","/**\n * Validates a relay URL to ensure it is a valid WebSocket URL.\n *\n * @param relay - Relay URL to validate\n * @returns True if the relay URL is valid, false otherwise\n *\n * @example\n * ```typescript\n * const isValid = isValidRelayUrl(\"wss://valid.relay.com\");\n * // Returns: true\n *\n * const isValid = isValidRelayUrl(\"invalid-url\");\n * // Returns: false\n * ```\n */\nexport function isValidRelayUrl(relay) {\n if (!URL.canParse(relay))\n return false;\n try {\n const url = new URL(relay);\n return url.protocol === \"wss:\" || url.protocol === \"ws:\";\n }\n catch {\n return false;\n }\n}\n/** Normalizes a relay URL */\nexport function normalizeRelayUrl(relay) {\n const url = new URL(relay);\n return url.toString();\n}\n//# sourceMappingURL=relay-url.js.map","import { makeCustomExtension, } from \"ts-mls\";\nimport { bytesToHex, hexToBytes } from \"@noble/hashes/utils.js\";\nimport { isValidRelayUrl } from \"../utils/relay-url.js\";\nimport { MARMOT_GROUP_DATA_EXTENSION_TYPE, MARMOT_GROUP_DATA_VERSION, } from \"./protocol.js\";\n// Encoder/decoder for MarmotGroupData (MIP-01)\n//\n// CRITICAL: This MUST follow TLS presentation language encoding:\n//\n// struct {\n// uint16 version;\n// opaque nostr_group_id[32];\n// opaque name<0..2^16-1>;\n// opaque description<0..2^16-1>;\n// opaque admin_pubkeys<0..2^16-1>;\n// RelayUrl relays<0..2^16-1>;\n// opaque image_hash<0..32>;\n// opaque image_key<0..32>;\n// opaque image_nonce<0..12>;\n// opaque image_upload_key<0..32>;\n// } NostrGroupData;\nconst encodeUtf8 = (str) => new TextEncoder().encode(str);\nconst decodeUtf8 = (bytes) => new TextDecoder().decode(bytes);\nfunction assertFixed(field, value, expectedLen) {\n if (!(value instanceof Uint8Array)) {\n throw new Error(`${field} must be a Uint8Array`);\n }\n if (value.length !== expectedLen) {\n throw new Error(`${field} must be exactly ${expectedLen} bytes`);\n }\n}\nfunction assertZeroOrFixed(field, value, expectedLen) {\n if (!(value instanceof Uint8Array)) {\n throw new Error(`${field} must be a Uint8Array`);\n }\n if (value.length !== 0 && value.length !== expectedLen) {\n throw new Error(`${field} must be empty or exactly ${expectedLen} bytes`);\n }\n}\nfunction encodeUint16(value) {\n const out = new Uint8Array(2);\n const view = new DataView(out.buffer);\n view.setUint16(0, value, false);\n return out;\n}\nfunction decodeUint16(data, offset) {\n if (offset + 2 > data.length)\n return undefined;\n const view = new DataView(data.buffer, data.byteOffset);\n return [view.getUint16(offset, false), offset + 2];\n}\n// QUIC varint encoding (RFC 9000 §16)\nfunction encodeVarint(value) {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`Invalid varint value: ${value}`);\n }\n if (value <= 63) {\n return new Uint8Array([value & 0x3f]);\n }\n if (value <= 16383) {\n const out = new Uint8Array(2);\n const v = 0x4000 | (value & 0x3fff);\n out[0] = (v >> 8) & 0xff;\n out[1] = v & 0xff;\n return out;\n }\n if (value <= 1073741823) {\n const out = new Uint8Array(4);\n const v = 0x80000000 | (value & 0x3fffffff);\n out[0] = (v >>> 24) & 0xff;\n out[1] = (v >>> 16) & 0xff;\n out[2] = (v >>> 8) & 0xff;\n out[3] = v & 0xff;\n return out;\n }\n throw new Error(`varint too large: ${value}`);\n}\nfunction decodeVarint(data, offset) {\n if (offset >= data.length)\n return undefined;\n const first = data[offset];\n if (first === undefined)\n return undefined;\n const prefix = first >>> 6;\n const len = prefix === 0 ? 1 : prefix === 1 ? 2 : prefix === 2 ? 4 : 8;\n if (offset + len > data.length)\n return undefined;\n if (len === 1) {\n return [first & 0x3f, offset + 1];\n }\n if (len === 2) {\n const v = ((first & 0x3f) << 8) | data[offset + 1];\n return [v >>> 0, offset + 2];\n }\n if (len === 4) {\n const v = ((first & 0x3f) << 24) |\n (data[offset + 1] << 16) |\n (data[offset + 2] << 8) |\n data[offset + 3];\n return [v >>> 0, offset + 4];\n }\n // 8-byte varints are not expected for any field we encode (2^16-1 limits);\n // reject to avoid unsafe integer handling.\n throw new Error(\"Unsupported 8-byte QUIC varint\");\n}\nfunction encodeOpaque16(bytes) {\n if (bytes.length > 0xffff) {\n throw new Error(`opaque value too long: ${bytes.length} bytes`);\n }\n const out = new Uint8Array(2 + bytes.length);\n out.set(encodeUint16(bytes.length), 0);\n out.set(bytes, 2);\n return out;\n}\nfunction decodeOpaque16(data, offset) {\n const lenRes = decodeUint16(data, offset);\n if (!lenRes)\n return undefined;\n const [len, next] = lenRes;\n if (next + len > data.length)\n return undefined;\n return [data.slice(next, next + len), next + len];\n}\nfunction encodeOpaqueVar(bytes) {\n if (bytes.length > 0xffff) {\n throw new Error(`opaque value too long: ${bytes.length} bytes`);\n }\n const prefix = encodeVarint(bytes.length);\n const out = new Uint8Array(prefix.length + bytes.length);\n out.set(prefix, 0);\n out.set(bytes, prefix.length);\n return out;\n}\nfunction decodeOpaqueVar(data, offset) {\n const lenRes = decodeVarint(data, offset);\n if (!lenRes)\n return undefined;\n const [len, next] = lenRes;\n if (len > 0xffff)\n throw new Error(`opaque value too long: ${len} bytes`);\n if (next + len > data.length)\n return undefined;\n return [data.slice(next, next + len), next + len];\n}\nfunction isHexKey(str) {\n return /^[0-9a-fA-F]{64}$/.test(str);\n}\nfunction encodeCommaSeparated(strings) {\n return encodeOpaque16(encodeUtf8(strings.join(\",\")));\n}\nfunction decodeCommaSeparated(data, offset) {\n const res = decodeOpaque16(data, offset);\n if (!res)\n return undefined;\n const [bytes, next] = res;\n const str = decodeUtf8(bytes);\n if (str.length === 0)\n return [[], next];\n return [str.split(\",\"), next];\n}\nfunction encodeAdminPubkeysV2(adminPubkeys) {\n for (const pk of adminPubkeys) {\n if (!isHexKey(pk))\n throw new Error(\"Invalid admin public key format\");\n }\n const bytes = new Uint8Array(adminPubkeys.length * 32);\n adminPubkeys.forEach((pk, i) => {\n bytes.set(hexToBytes(pk), i * 32);\n });\n return encodeOpaqueVar(bytes);\n}\nfunction decodeAdminPubkeysV2(bytes) {\n if (bytes.length % 32 !== 0) {\n throw new Error(\"admin_pubkeys length must be a multiple of 32\");\n }\n const out = [];\n for (let i = 0; i < bytes.length; i += 32) {\n out.push(bytesToHex(bytes.slice(i, i + 32)));\n }\n return out;\n}\nfunction encodeRelaysV2(relays) {\n for (const relay of relays) {\n if (!isValidRelayUrl(relay))\n throw new Error(\"Invalid relay URL\");\n }\n const encodedRelays = relays.map((r) => encodeUtf8(r));\n const innerParts = encodedRelays.map((b) => encodeOpaqueVar(b));\n const innerLen = innerParts.reduce((sum, p) => sum + p.length, 0);\n if (innerLen > 0xffff) {\n throw new Error(`relays vector too long: ${innerLen} bytes`);\n }\n const outerPrefix = encodeVarint(innerLen);\n const out = new Uint8Array(outerPrefix.length + innerLen);\n out.set(outerPrefix, 0);\n let offset = outerPrefix.length;\n for (const part of innerParts) {\n out.set(part, offset);\n offset += part.length;\n }\n return out;\n}\nfunction decodeRelaysV2(data, offset) {\n const outerLenRes = decodeVarint(data, offset);\n if (!outerLenRes)\n return undefined;\n const [outerLen, outerNext] = outerLenRes;\n if (outerLen > 0xffff)\n throw new Error(`relays vector too long: ${outerLen}`);\n const end = outerNext + outerLen;\n if (end > data.length)\n return undefined;\n const relays = [];\n let innerOffset = outerNext;\n while (innerOffset < end) {\n const partRes = decodeOpaqueVar(data, innerOffset);\n if (!partRes)\n return undefined;\n const [urlBytes, next] = partRes;\n const url = decodeUtf8(urlBytes);\n if (!isValidRelayUrl(url))\n throw new Error(\"Invalid relay URL\");\n relays.push(url);\n innerOffset = next;\n }\n if (innerOffset !== end) {\n throw new Error(\"relays vector contains trailing bytes\");\n }\n return [relays, end];\n}\n/**\n * Encodes MarmotGroupData to bytes.\n *\n * @param data - The MarmotGroupData to encode\n * @returns Encoded bytes\n */\nexport function encodeMarmotGroupData(data) {\n assertFixed(\"nostr_group_id\", data.nostrGroupId, 32);\n assertZeroOrFixed(\"image_hash\", data.imageHash, 32);\n assertZeroOrFixed(\"image_key\", data.imageKey, 32);\n assertZeroOrFixed(\"image_nonce\", data.imageNonce, 12);\n assertZeroOrFixed(\"image_upload_key\", data.imageUploadKey, 32);\n const version = encodeUint16(data.version);\n const nostrGroupId = data.nostrGroupId;\n const name = data.version >= 2\n ? encodeOpaqueVar(encodeUtf8(data.name))\n : encodeOpaque16(encodeUtf8(data.name));\n const description = data.version >= 2\n ? encodeOpaqueVar(encodeUtf8(data.description))\n : encodeOpaque16(encodeUtf8(data.description));\n const adminPubkeys = data.version >= 2\n ? encodeAdminPubkeysV2(data.adminPubkeys)\n : encodeCommaSeparated(data.adminPubkeys);\n // v1: comma-separated string\n // v2: varint-vector of individually length-prefixed URLs\n const relays = data.version >= 2\n ? encodeRelaysV2(data.relays)\n : encodeCommaSeparated(data.relays);\n const imageHash = data.version >= 2\n ? encodeOpaqueVar(data.imageHash)\n : (() => {\n assertFixed(\"image_hash\", data.imageHash, 32);\n return data.imageHash;\n })();\n const imageKey = data.version >= 2\n ? encodeOpaqueVar(data.imageKey)\n : (() => {\n assertFixed(\"image_key\", data.imageKey, 32);\n return data.imageKey;\n })();\n const imageNonce = data.version >= 2\n ? encodeOpaqueVar(data.imageNonce)\n : (() => {\n assertFixed(\"image_nonce\", data.imageNonce, 12);\n return data.imageNonce;\n })();\n const imageUploadKey = data.version >= 2\n ? encodeOpaqueVar(data.imageUploadKey)\n : new Uint8Array(0);\n const result = new Uint8Array(version.length +\n nostrGroupId.length +\n name.length +\n description.length +\n adminPubkeys.length +\n relays.length +\n imageHash.length +\n imageKey.length +\n imageNonce.length +\n imageUploadKey.length);\n let offset = 0;\n result.set(version, offset);\n offset += version.length;\n result.set(nostrGroupId, offset);\n offset += nostrGroupId.length;\n result.set(name, offset);\n offset += name.length;\n result.set(description, offset);\n offset += description.length;\n result.set(adminPubkeys, offset);\n offset += adminPubkeys.length;\n result.set(relays, offset);\n offset += relays.length;\n result.set(imageHash, offset);\n offset += imageHash.length;\n result.set(imageKey, offset);\n offset += imageKey.length;\n result.set(imageNonce, offset);\n offset += imageNonce.length;\n if (imageUploadKey.length > 0) {\n result.set(imageUploadKey, offset);\n }\n return result;\n}\n/**\n * Decodes MarmotGroupData from bytes.\n *\n * @param data - The bytes to decode\n * @returns Decoded MarmotGroupData\n * @throws Error if decoding fails\n */\nexport function decodeMarmotGroupData(data) {\n const versionRes = decodeUint16(data, 0);\n if (!versionRes)\n throw new Error(\"Extension data too short\");\n const [version, versionOffset] = versionRes;\n if (version !== 1 && version !== 2) {\n throw new Error(`Unsupported MarmotGroupData version: ${version}`);\n }\n let offset = versionOffset;\n const nostrGroupId = data.slice(offset, offset + 32);\n if (nostrGroupId.length !== 32)\n throw new Error(\"Extension data too short\");\n offset += 32;\n const nameResult = version >= 2 ? decodeOpaqueVar(data, offset) : decodeOpaque16(data, offset);\n if (!nameResult)\n throw new Error(\"Extension data too short\");\n const [nameBytes, nameOffset] = nameResult;\n const name = decodeUtf8(nameBytes);\n offset = nameOffset;\n const descriptionResult = version >= 2 ? decodeOpaqueVar(data, offset) : decodeOpaque16(data, offset);\n if (!descriptionResult)\n throw new Error(\"Extension data too short\");\n const [descriptionBytes, descriptionOffset] = descriptionResult;\n const description = decodeUtf8(descriptionBytes);\n offset = descriptionOffset;\n const adminPubkeysResult = version >= 2 ? decodeOpaqueVar(data, offset) : decodeOpaque16(data, offset);\n if (!adminPubkeysResult)\n throw new Error(\"Extension data too short\");\n const [adminPubkeysBytes, adminPubkeysOffset] = adminPubkeysResult;\n const adminPubkeys = version >= 2\n ? decodeAdminPubkeysV2(adminPubkeysBytes)\n : (() => {\n const str = decodeUtf8(adminPubkeysBytes);\n if (str.length === 0)\n return [];\n return str.split(\",\");\n })();\n offset = adminPubkeysOffset;\n const relaysResult = version >= 2\n ? decodeRelaysV2(data, offset)\n : decodeCommaSeparated(data, offset);\n if (!relaysResult)\n throw new Error(\"Extension data too short\");\n const [relays, relaysOffset] = relaysResult;\n offset = relaysOffset;\n const imageHashRes = version >= 2\n ? decodeOpaqueVar(data, offset)\n : [data.slice(offset, offset + 32), offset + 32];\n if (!imageHashRes)\n throw new Error(\"Extension data too short\");\n const [imageHash, imageHashOffset] = imageHashRes;\n if (version === 1)\n assertFixed(\"image_hash\", imageHash, 32);\n if (version >= 2)\n assertZeroOrFixed(\"image_hash\", imageHash, 32);\n offset = imageHashOffset;\n const imageKeyRes = version >= 2\n ? decodeOpaqueVar(data, offset)\n : [data.slice(offset, offset + 32), offset + 32];\n if (!imageKeyRes)\n throw new Error(\"Extension data too short\");\n const [imageKey, imageKeyOffset] = imageKeyRes;\n if (version === 1)\n assertFixed(\"image_key\", imageKey, 32);\n if (version >= 2)\n assertZeroOrFixed(\"image_key\", imageKey, 32);\n offset = imageKeyOffset;\n const imageNonceRes = version >= 2\n ? decodeOpaqueVar(data, offset)\n : [data.slice(offset, offset + 12), offset + 12];\n if (!imageNonceRes)\n throw new Error(\"Extension data too short\");\n const [imageNonce, imageNonceOffset] = imageNonceRes;\n if (version === 1)\n assertFixed(\"image_nonce\", imageNonce, 12);\n if (version >= 2)\n assertZeroOrFixed(\"image_nonce\", imageNonce, 12);\n offset = imageNonceOffset;\n const imageUploadKeyRes = version >= 2\n ? decodeOpaqueVar(data, offset)\n : [new Uint8Array(0), offset];\n if (!imageUploadKeyRes)\n throw new Error(\"Extension data too short\");\n const [imageUploadKey, imageUploadKeyOffset] = imageUploadKeyRes;\n if (version >= 2)\n assertZeroOrFixed(\"image_upload_key\", imageUploadKey, 32);\n offset = imageUploadKeyOffset;\n return {\n version,\n nostrGroupId,\n name,\n description,\n adminPubkeys,\n relays,\n imageHash,\n imageKey,\n imageNonce,\n imageUploadKey,\n };\n}\n/** Creates a valid MarmotGroupData byte payload (MIP-01). */\nexport function createMarmotGroupData(opts = {}) {\n const data = {\n version: MARMOT_GROUP_DATA_VERSION,\n nostrGroupId: opts.nostrGroupId ?? new Uint8Array(32),\n name: opts.name ?? \"\",\n description: opts.description ?? \"\",\n adminPubkeys: opts.adminPubkeys ?? [],\n relays: opts.relays ?? [],\n imageHash: opts.imageHash ?? new Uint8Array(0),\n imageKey: opts.imageKey ?? new Uint8Array(0),\n imageNonce: opts.imageNonce ?? new Uint8Array(0),\n imageUploadKey: opts.imageUploadKey ?? new Uint8Array(0),\n };\n return encodeMarmotGroupData(data);\n}\n/** Returns true if pubkey is included in adminPubkeys (case-insensitive). */\nexport function isAdmin(groupData, pubkey) {\n const pk = pubkey.toLowerCase();\n return groupData.adminPubkeys.some((a) => a.toLowerCase() === pk);\n}\n/**\n * Converts MarmotGroupData to an Extension object for use in MLS groups.\n *\n * @param data - The Marmot group data to convert\n * @returns Extension object with Marmot Group Data Extension type and encoded data\n */\nexport function marmotGroupDataToExtension(data) {\n return makeCustomExtension({\n extensionType: MARMOT_GROUP_DATA_EXTENSION_TYPE,\n extensionData: encodeMarmotGroupData(data),\n });\n}\n/** Type guard for the Marmot Group Data custom extension (0xf2ee). */\nexport function isMarmotGroupDataExtension(ext) {\n return (typeof ext.extensionType === \"number\" &&\n ext.extensionType === MARMOT_GROUP_DATA_EXTENSION_TYPE &&\n ext.extensionData instanceof Uint8Array);\n}\n/** Extracts and validates the Marmot Group Data extension payload bytes. */\nexport function getMarmotGroupDataExtensionBytes(ext) {\n if (!isMarmotGroupDataExtension(ext)) {\n throw new Error(\"Not a MarmotGroupData extension\");\n }\n return ext.extensionData;\n}\n//# sourceMappingURL=marmot-group-data.js.map","import { getEventHash, getTagValue, } from \"applesauce-core/helpers/event\";\nimport { decode, encode, joinGroup, mlsMessageDecoder, mlsMessageEncoder, protocolVersions, wireformats, } from \"ts-mls\";\nimport { marmotAuthService } from \"./auth-service.js\";\nimport { decodeContent, encodeContent, getEncodingTag, } from \"../utils/encoding.js\";\nimport { unixNow } from \"../utils/nostr.js\";\nimport { decodeMarmotGroupData, isMarmotGroupDataExtension, } from \"./marmot-group-data.js\";\nimport { isRumorLike } from \"./nostr.js\";\nimport { WELCOME_EVENT_KIND } from \"./protocol.js\";\n/**\n * Creates a welcome rumor (kind 444) for a welcome message.\n *\n * @param welcomeMessage - The MLS welcome message\n * @param keyPackageEventId - The ID of the key package event used for the add operation\n * @param author - The author's public key (hex string)\n * @param groupRelays - Array of relay URLs for the group\n * @returns Welcome rumor with precomputed ID\n */\nexport function createWelcomeRumor({ welcome, author, groupRelays, keyPackageEventId, }) {\n // Serialize the welcome message as a full MLSMessage (RFC 9420)\n const mlsMessage = {\n version: protocolVersions.mls10,\n wireformat: wireformats.mls_welcome,\n welcome,\n };\n const serializedWelcome = encode(mlsMessageEncoder, mlsMessage);\n const content = encodeContent(serializedWelcome, \"base64\");\n const draft = {\n kind: WELCOME_EVENT_KIND,\n pubkey: author,\n created_at: unixNow(),\n content,\n tags: [\n [\"relays\", ...groupRelays],\n [\"encoding\", \"base64\"],\n ],\n };\n // Add the key package event ID if known\n if (keyPackageEventId)\n draft.tags.push([\"e\", keyPackageEventId]);\n // Calculate the event ID for the rumor\n const id = getEventHash(draft);\n return {\n ...draft,\n id,\n };\n}\n/** Returns the key package event ID from a welcome rumor */\nexport function getWelcomeKeyPackageEventId(event) {\n return getTagValue(event, \"e\");\n}\n/** Returns the group relays from a welcome rumor */\nexport function getWelcomeGroupRelays(event) {\n // NOTE: The \"relays\" tag is a normal Nostr tag vector: [\"relays\", ...urls]\n // (see MIP-02 and createWelcomeRumor()).\n const tag = event.tags.find((t) => t[0] === \"relays\");\n if (!tag)\n return [];\n return tag.slice(1);\n}\n/**\n * Returns the KeyPackageRefs of the intended recipients from a Welcome message.\n *\n * Each entry in `welcome.secrets` contains a plaintext `newMember` field which\n * is the RFC 9420 KeyPackageRef (a hash of the recipient's KeyPackage). No\n * decryption is required to read these.\n *\n * @param welcome - The MLS Welcome message\n * @returns Array of KeyPackageRefs (one per recipient)\n */\nexport function getWelcomeKeyPackageRefs(welcome) {\n // Unwrap welcome rumor if provided\n if (isRumorLike(welcome))\n welcome = getWelcome(welcome);\n return welcome.secrets.map((s) => s.newMember);\n}\n/**\n * Gets the Welcome message from a kind 444 event.\n *\n * @param event - The Nostr event containing the welcome message\n * @returns The decoded Welcome message\n * @throws Error if the content cannot be decoded\n */\nexport function getWelcome(event) {\n if (event.kind !== WELCOME_EVENT_KIND)\n throw new Error(`Expected welcome event kind ${WELCOME_EVENT_KIND}, got ${event.kind}`);\n const encodingFormat = getEncodingTag(event);\n if (encodingFormat !== \"base64\")\n throw new Error(\"Invalid welcome event: missing encoding=base64 tag\");\n const content = decodeContent(event.content, encodingFormat);\n const mlsMessage = decode(mlsMessageDecoder, content);\n if (!mlsMessage)\n throw new Error(\"Failed to decode welcome message\");\n if (mlsMessage.wireformat !== wireformats.mls_welcome)\n throw new Error(`Expected MLSMessage with mls_welcome wireformat, got wireformat ${mlsMessage.wireformat}`);\n return mlsMessage.welcome;\n}\n/**\n * Decrypts the {@link GroupInfo} from a Welcome message using the provided key package,\n * without performing a full group join.\n *\n * This is lighter than `joinGroup` — it stops after decrypting the group secrets\n * and group info, giving access to `groupContext` (group ID, epoch, extensions) and\n * `GroupInfo`-level extensions (ratchet tree, external pub).\n *\n * @param welcome - The MLS Welcome message (or a kind 444 Rumor)\n * @param keyPackage - The full key package (public + private) used to receive the invite\n * @param ciphersuiteImpl - The ciphersuite implementation\n * @returns The decrypted GroupInfo\n * @throws Error if the key package does not match any secret in the welcome\n */\nexport async function readWelcomeGroupInfo({ welcome, keyPackage, ciphersuiteImpl, }) {\n // Unwrap welcome rumor if provided\n if (isRumorLike(welcome))\n welcome = getWelcome(welcome);\n try {\n const clientState = await joinGroup({\n context: {\n cipherSuite: ciphersuiteImpl,\n authService: marmotAuthService,\n externalPsks: {},\n },\n welcome,\n keyPackage: keyPackage.publicPackage,\n privateKeys: keyPackage.privatePackage,\n });\n return {\n groupContext: clientState.groupContext,\n extensions: [],\n confirmationTag: clientState.confirmationTag,\n signer: clientState.privatePath.leafIndex,\n signature: new Uint8Array(),\n };\n }\n catch (err) {\n throw new Error(`Failed to decrypt group secrets: key package does not match this welcome (${err instanceof Error ? err.message : String(err)})`);\n }\n}\n/**\n * Reads the {@link MarmotGroupData} from a Welcome message using the provided key package,\n * without performing a full group join.\n *\n * Convenience wrapper around {@link readWelcomeGroupInfo} that extracts and decodes\n * the Marmot Group Data extension from `groupInfo.groupContext.extensions`.\n *\n * @param welcome - The MLS Welcome message (or a kind 444 Rumor)\n * @param keyPackage - The full key package (public + private) used to receive the invite\n * @param ciphersuiteImpl - The ciphersuite implementation\n * @returns The decoded MarmotGroupData, or null if the extension is not present\n */\nexport async function readWelcomeMarmotGroupData({ welcome, keyPackage, ciphersuiteImpl, }) {\n const groupInfo = await readWelcomeGroupInfo({\n welcome,\n keyPackage,\n ciphersuiteImpl,\n });\n const ext = groupInfo.groupContext.extensions.find(isMarmotGroupDataExtension);\n if (!ext)\n return null;\n return decodeMarmotGroupData(ext.extensionData);\n}\n//# sourceMappingURL=welcome.js.map","import createDebug from \"debug\";\n/** Root namespace logger for the marmot-ts package. Enable with DEBUG=marmot-ts:* */\nexport const logger = createDebug(\"marmot-ts\");\n//# sourceMappingURL=debug.js.map","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n","import { bytesToHex } from \"@noble/hashes/utils.js\";\nimport { clientStateDecoder, clientStateEncoder, decode, defaultKeyPackageEqualityConfig, defaultKeyRetentionConfig, defaultLifetimeConfig, defaultPaddingConfig, nodeTypes, encode, } from \"ts-mls\";\nimport { decodeMarmotGroupData, isMarmotGroupDataExtension, } from \"./marmot-group-data.js\";\n/** Default ClientConfig for Marmot. */\nexport const defaultMarmotClientConfig = {\n keyRetentionConfig: defaultKeyRetentionConfig,\n lifetimeConfig: defaultLifetimeConfig,\n keyPackageEqualityConfig: defaultKeyPackageEqualityConfig,\n paddingConfig: defaultPaddingConfig,\n};\n/** Reads the MarmotGroupData from a ClientState or GroupInfo objects */\nexport function getMarmotGroupData(clientState) {\n try {\n const marmotExtension = clientState.groupContext.extensions.find(isMarmotGroupDataExtension);\n if (!marmotExtension)\n return null;\n return decodeMarmotGroupData(marmotExtension.extensionData);\n }\n catch (error) {\n return null;\n }\n}\n/** @deprecated use getMarmotGroupData instead */\nexport const extractMarmotGroupData = getMarmotGroupData;\n/** Reads the hex id of the group from a ClientState or GroupInfo object */\nexport function getGroupIdHex(clientState) {\n return bytesToHex(clientState.groupContext.groupId);\n}\nexport function getNostrGroupIdHex(clientState) {\n const marmotData = getMarmotGroupData(clientState);\n if (!marmotData)\n throw new Error(\"MarmotGroupData not found in ClientState\");\n return bytesToHex(marmotData.nostrGroupId);\n}\n/** Reads the epoch number from a ClientState or GroupInfo object */\nexport function getEpoch(clientState) {\n return Number(clientState.groupContext.epoch);\n}\n/** Reads the number of members in the group from a ClientState ratchet tree */\nexport function getMemberCount(clientState) {\n return clientState.ratchetTree.filter((node) => node && node.nodeType === nodeTypes.leaf).length;\n}\n/** Serializes a ClientState object to a bytes array */\nexport function serializeClientState(state) {\n return encode(clientStateEncoder, state);\n}\n/** Deserializes stored ClientState bytes (ts-mls TLS decoding). */\nexport function deserializeClientState(stored) {\n try {\n const decoded = decode(clientStateDecoder, stored);\n if (!decoded)\n throw new Error(\"Failed to deserialize ClientState: clientStateDecoder returned null\");\n return decoded;\n }\n catch (error) {\n if (error instanceof Error)\n throw new Error(`Failed to deserialize ClientState: ${error.message}`);\n throw new Error(\"Failed to deserialize ClientState: Unknown error\");\n }\n}\n//# sourceMappingURL=client-state.js.map","import { bytesToHex, hexToBytes } from \"@noble/hashes/utils.js\";\nimport { defaultCredentialTypes } from \"ts-mls\";\nexport function isHexKey(str) {\n return /^[0-9a-fA-F]{64}$/.test(str);\n}\n/** Creates a MLS basic credential from a nostr public key. */\nexport function createCredential(pubkey) {\n if (isHexKey(pubkey) === false)\n throw new Error(\"Invalid nostr public key, must be 64 hex characters\");\n return {\n credentialType: defaultCredentialTypes.basic,\n identity: hexToBytes(pubkey),\n };\n}\n/** Gets the nostr public key from a credential. */\nexport function getCredentialPubkey(credential) {\n if (credential.credentialType !== defaultCredentialTypes.basic)\n throw new Error(\"Credential is not a basic credential, cannot get nostr public key\");\n // Type assertion needed because TypeScript doesn't narrow credential type\n const basicCredential = credential;\n const str = bytesToHex(basicCredential.identity);\n // Marmot requires identity to be the raw 32-byte Nostr pubkey.\n // If this is not 32 bytes, bytesToHex() will not yield 64 hex chars.\n if (isHexKey(str) === false)\n throw new Error(\"Invalid credential nostr public key\");\n return str;\n}\n/** Checks if two credentials are the same. */\nexport function isSameCredential(a, b) {\n // If they are basic credentials, we can just compare the identities\n if (a.credentialType === defaultCredentialTypes.basic &&\n b.credentialType === defaultCredentialTypes.basic) {\n const aBasic = a;\n const bBasic = b;\n return bytesToHex(aBasic.identity) === bytesToHex(bBasic.identity);\n }\n return false;\n}\n//# sourceMappingURL=credential.js.map","import { randomBytes } from \"@noble/hashes/utils.js\";\nimport { createGroup as MLSCreateGroup, } from \"ts-mls\";\nimport { marmotAuthService } from \"./auth-service.js\";\nimport { marmotGroupDataToExtension } from \"./marmot-group-data.js\";\nexport async function createGroup(params) {\n const { creatorKeyPackage, marmotGroupData, extensions = [], ciphersuiteImpl, } = params;\n // MIP-01: MLS group_id MUST be private and distinct from the public\n // nostr_group_id stored in the Marmot Group Data extension.\n const groupId = randomBytes(32);\n // Always include Marmot Group Data as a GroupContext extension.\n const marmotExtension = marmotGroupDataToExtension(marmotGroupData);\n // Combine all extensions (Marmot extension + any additional extensions)\n const groupExtensions = [marmotExtension, ...extensions];\n // ts-mls v2: createGroup takes a single params object with `context`.\n const clientState = await MLSCreateGroup({\n context: {\n cipherSuite: ciphersuiteImpl,\n authService: marmotAuthService,\n },\n groupId,\n keyPackage: creatorKeyPackage.publicPackage,\n privateKeyPackage: creatorKeyPackage.privatePackage,\n extensions: groupExtensions,\n });\n return {\n clientState,\n };\n}\nexport async function createSimpleGroup(creatorKeyPackage, ciphersuiteImpl, groupName = \"New Group\", options) {\n const marmotGroupData = {\n version: 2,\n nostrGroupId: randomBytes(32),\n name: groupName,\n description: options?.description || \"\",\n adminPubkeys: [...new Set(options?.adminPubkeys || [])],\n relays: options?.relays || [],\n imageHash: new Uint8Array(0),\n imageKey: new Uint8Array(0),\n imageNonce: new Uint8Array(0),\n imageUploadKey: new Uint8Array(0),\n };\n return createGroup({\n creatorKeyPackage,\n marmotGroupData,\n ciphersuiteImpl,\n });\n}\n//# sourceMappingURL=group.js.map","import { defaultLifetime } from \"ts-mls\";\n/**\n * Formats a bigint timestamp to a readable date string, handling special MLS timestamp values.\n *\n * @param timestamp - The timestamp as a bigint (typically from MLS lifetime fields)\n * @returns A formatted date string or descriptive text for special values\n *\n * @example\n * ```typescript\n * // For normal timestamps\n * formatMlsTimestamp(1700000000n); // Returns: \"11/14/2023, 1:13:20 PM\"\n *\n * // For \"no expiration\" value\n * formatMlsTimestamp(9223372036854775807n); // Returns: \"No expiration\"\n *\n * // For epoch value\n * formatMlsTimestamp(0n); // Returns: \"Epoch (1970-01-01)\"\n * ```\n */\nexport function formatMlsTimestamp(timestamp) {\n const lifetime = defaultLifetime();\n if (timestamp === lifetime.notAfter) {\n return \"No expiration\";\n }\n if (timestamp === lifetime.notBefore) {\n return \"Epoch (1970-01-01)\";\n }\n // Convert to milliseconds and create Date object\n const date = new Date(Number(timestamp) * 1000);\n // Check if the date is valid (not NaN)\n if (isNaN(date.getTime())) {\n return \"Invalid date\";\n }\n return date.toLocaleString();\n}\n/**\n * Checks if a lifetime is currently valid, handling the \"no expiration\" case.\n *\n * @param lifetime - The lifetime object with notBefore and notAfter fields\n * @returns True if the lifetime is currently valid, false otherwise\n *\n * @example\n * ```typescript\n * const isValid = isLifetimeValid(lifetime);\n * // Returns: true if current time is within the lifetime range\n * ```\n */\nexport function isLifetimeValid(lifetime) {\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n const defaultLt = defaultLifetime();\n return (currentTime >= lifetime.notBefore &&\n (lifetime.notAfter === defaultLt.notAfter ||\n currentTime <= lifetime.notAfter));\n}\n/**\n * Creates a lifetime with a 3-month expiration from the current time.\n *\n * @returns A lifetime object with notBefore set to current time and notAfter set to 3 months from now\n *\n * @example\n * ```typescript\n * const lifetime = createThreeMonthLifetime();\n * // Returns: { notBefore: currentTime, notAfter: currentTime + 3 months }\n * ```\n */\nexport function createThreeMonthLifetime() {\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n // Calculate 3 months in seconds (approximately 90 days)\n const threeMonthsInSeconds = 90n * 24n * 60n * 60n;\n const notAfter = currentTime + threeMonthsInSeconds;\n return {\n notBefore: currentTime,\n notAfter,\n };\n}\n//# sourceMappingURL=timestamp.js.map","import { makeCustomExtension } from \"ts-mls\";\nimport { LAST_RESORT_EXTENSION_TYPE, MARMOT_GROUP_DATA_EXTENSION_TYPE, } from \"./protocol.js\";\n/**\n * Validates that a key package supports the required Marmot extensions.\n *\n * @param extensions - The extensions from a key package\n * @returns true if the Marmot Group Data Extension is supported\n */\nexport function supportsMarmotExtensions(extensions) {\n return extensions.some((ext) => typeof ext.extensionType === \"number\" &&\n ext.extensionType === MARMOT_GROUP_DATA_EXTENSION_TYPE);\n}\n/** Checks if an extension is the last_resort extension */\nexport function isLastResortExtension(extension) {\n return (typeof extension.extensionType === \"number\" &&\n extension.extensionType === LAST_RESORT_EXTENSION_TYPE);\n}\n/**\n * Modifies an {@link Extension} array to ensure it includes the last_resort extension.\n * This is useful for ensuring that key packages are compliant with MIP-00.\n *\n * @param extensions - The extensions to modify\n * @returns The modified extensions\n */\nexport function ensureLastResortExtension(extensions) {\n if (extensions.some((ext) => typeof ext.extensionType === \"number\" &&\n ext.extensionType === LAST_RESORT_EXTENSION_TYPE))\n return extensions;\n return [\n ...extensions,\n makeCustomExtension({\n extensionType: LAST_RESORT_EXTENSION_TYPE,\n extensionData: new Uint8Array(0),\n }),\n ];\n}\n/** Replaces an extension in an array of extensions */\nexport function replaceExtension(extensions, extension) {\n return extensions.map((ext) => ext.extensionType === extension.extensionType ? extension : ext);\n}\n//# sourceMappingURL=extensions.js.map","import { defaultCredentialTypes, defaultCryptoProvider, generateKeyPackage as MLSGenerateKeyPackage, makeKeyPackageRef, } from \"ts-mls\";\nimport { createThreeMonthLifetime } from \"../utils/timestamp.js\";\nimport { ensureMarmotCapabilities } from \"./capabilities.js\";\nimport { getCredentialPubkey } from \"./credential.js\";\nimport { defaultCapabilities } from \"./default-capabilities.js\";\nimport { ensureLastResortExtension } from \"./extensions.js\";\n/** Create default extensions for a key package */\nexport function keyPackageDefaultExtensions() {\n return ensureLastResortExtension([]);\n}\n/** Calculates a key package reference with the hash implementation based on the key package's cipher suite */\nexport async function calculateKeyPackageRef(keyPackage, cryptoProvider) {\n const provider = cryptoProvider ?? defaultCryptoProvider;\n const ciphersuiteImpl = await provider.getCiphersuiteImpl(keyPackage.cipherSuite);\n return await makeKeyPackageRef(keyPackage, ciphersuiteImpl.hash);\n}\n/** Generate a marmot key package that is compliant with MIP-00 */\nexport async function generateKeyPackage({ credential, capabilities, lifetime, extensions, isLastResort = true, ciphersuiteImpl, }) {\n if (credential.credentialType !== defaultCredentialTypes.basic)\n throw new Error(\"Marmot key packages must use a basic credential\");\n // Ensure the credential has a valid pubkey\n getCredentialPubkey(credential);\n // In v2, generateKeyPackage takes a single params object\n return await MLSGenerateKeyPackage({\n credential,\n capabilities: capabilities\n ? ensureMarmotCapabilities(capabilities)\n : defaultCapabilities(),\n lifetime: lifetime ?? createThreeMonthLifetime(),\n // Marmot requires support for last_resort capability signaling (MIP-00),\n // but individual KeyPackages may be single-use or last-resort reusable.\n // `isLastResort` controls whether this KeyPackage is marked reusable.\n extensions: isLastResort\n ? ensureLastResortExtension(extensions ?? [])\n : extensions,\n cipherSuite: ciphersuiteImpl,\n });\n}\n//# sourceMappingURL=key-package.js.map","/**\n * NIP-44 v2 encryption with binary (Uint8Array) plaintext support.\n *\n * Functionally identical to NIP-44 v2 but the pad/unpad layer operates on raw\n * bytes instead of UTF-8 strings, removing the need to hex/base64-encode\n * binary payloads (e.g. TLS-serialized MLSMessages) before encryption.\n *\n * The wire format and conversation-key derivation are 100% compatible with\n * standard NIP-44 v2 – only the plaintext interpretation differs.\n */\nimport { chacha20 } from \"@noble/ciphers/chacha.js\";\nimport { equalBytes } from \"@noble/ciphers/utils.js\";\nimport { secp256k1 } from \"@noble/curves/secp256k1.js\";\nimport { expand as hkdf_expand, extract as hkdf_extract, } from \"@noble/hashes/hkdf.js\";\nimport { hmac } from \"@noble/hashes/hmac.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { concatBytes, hexToBytes, randomBytes } from \"@noble/hashes/utils.js\";\nconst minPlaintextSize = 0x0001; // 1 byte\nconst maxPlaintextSize = 0xffff; // 64 KiB − 1\n/**\n * Derives a NIP-44 v2 conversation key from a secp256k1 private key and\n * the hex-encoded x-only public key of the other party.\n */\nexport function getConversationKey(privkeyA, pubkeyB) {\n const sharedX = secp256k1\n .getSharedSecret(privkeyA, hexToBytes(\"02\" + pubkeyB))\n .subarray(1, 33);\n return hkdf_extract(sha256, sharedX, new TextEncoder().encode(\"nip44-v2\"));\n}\nfunction getMessageKeys(conversationKey, nonce) {\n const keys = hkdf_expand(sha256, conversationKey, nonce, 76);\n return {\n chacha_key: keys.subarray(0, 32),\n chacha_nonce: keys.subarray(32, 44),\n hmac_key: keys.subarray(44, 76),\n };\n}\nfunction calcPaddedLen(len) {\n if (!Number.isSafeInteger(len) || len < 1)\n throw new Error(\"expected positive integer\");\n if (len <= 32)\n return 32;\n const nextPower = 1 << (Math.floor(Math.log2(len - 1)) + 1);\n const chunk = nextPower <= 256 ? 32 : nextPower / 8;\n return chunk * (Math.floor((len - 1) / chunk) + 1);\n}\nfunction writeU16BE(num) {\n if (!Number.isSafeInteger(num) ||\n num < minPlaintextSize ||\n num > maxPlaintextSize)\n throw new Error(\"invalid plaintext size: must be between 1 and 65535 bytes\");\n const arr = new Uint8Array(2);\n new DataView(arr.buffer).setUint16(0, num, false);\n return arr;\n}\n/** Pads raw bytes using the NIP-44 v2 padding scheme. */\nfunction padBytes(data) {\n const unpaddedLen = data.length;\n const prefix = writeU16BE(unpaddedLen);\n const suffix = new Uint8Array(calcPaddedLen(unpaddedLen) - unpaddedLen);\n return concatBytes(prefix, data, suffix);\n}\n/** Removes NIP-44 v2 padding and returns the raw plaintext bytes. */\nfunction unpadBytes(padded) {\n const unpaddedLen = (padded[0] << 8) | padded[1];\n const unpadded = padded.subarray(2, 2 + unpaddedLen);\n if (unpaddedLen < minPlaintextSize ||\n unpaddedLen > maxPlaintextSize ||\n unpadded.length !== unpaddedLen ||\n padded.length !== 2 + calcPaddedLen(unpaddedLen))\n throw new Error(\"invalid padding\");\n return unpadded;\n}\nfunction hmacAad(key, message, aad) {\n if (aad.length !== 32)\n throw new Error(\"AAD associated data must be 32 bytes\");\n return hmac(sha256, key, concatBytes(aad, message));\n}\nfunction decodePayload(payload) {\n if (typeof payload !== \"string\")\n throw new Error(\"payload must be a valid string\");\n const plen = payload.length;\n if (plen < 132 || plen > 87472)\n throw new Error(\"invalid payload length: \" + plen);\n if (payload[0] === \"#\")\n throw new Error(\"unknown encryption version\");\n let data;\n try {\n data = Uint8Array.from(atob(payload), (c) => c.charCodeAt(0));\n }\n catch (error) {\n throw new Error(\"invalid base64: \" +\n (error instanceof Error ? error.message : String(error)));\n }\n const dlen = data.length;\n if (dlen < 99 || dlen > 65603)\n throw new Error(\"invalid data length: \" + dlen);\n const vers = data[0];\n if (vers !== 2)\n throw new Error(\"unknown encryption version \" + vers);\n return {\n nonce: data.subarray(1, 33),\n ciphertext: data.subarray(33, -32),\n mac: data.subarray(-32),\n };\n}\n/**\n * Encrypts a raw byte array using NIP-44 v2.\n *\n * @param plaintext - The binary data to encrypt\n * @param conversationKey - 32-byte conversation key (from {@link getConversationKey})\n * @param nonce - Optional 32-byte nonce (randomly generated if omitted)\n * @returns Base64-encoded NIP-44 v2 payload\n */\nexport function encryptBytes(plaintext, conversationKey, nonce = randomBytes(32)) {\n const { chacha_key, chacha_nonce, hmac_key } = getMessageKeys(conversationKey, nonce);\n const padded = padBytes(plaintext);\n const ciphertext = chacha20(chacha_key, chacha_nonce, padded);\n const mac = hmacAad(hmac_key, ciphertext, nonce);\n return btoa(String.fromCharCode(...concatBytes(new Uint8Array([2]), nonce, ciphertext, mac)));\n}\n/**\n * Decrypts a NIP-44 v2 payload back to raw bytes.\n *\n * @param payload - Base64-encoded NIP-44 v2 payload\n * @param conversationKey - 32-byte conversation key (from {@link getConversationKey})\n * @returns The decrypted binary data\n */\nexport function decryptBytes(payload, conversationKey) {\n const { nonce, ciphertext, mac } = decodePayload(payload);\n const { chacha_key, chacha_nonce, hmac_key } = getMessageKeys(conversationKey, nonce);\n const calculatedMac = hmacAad(hmac_key, ciphertext, nonce);\n if (!equalBytes(calculatedMac, mac))\n throw new Error(\"invalid MAC\");\n const padded = chacha20(chacha_key, chacha_nonce, ciphertext);\n return unpadBytes(padded);\n}\n//# sourceMappingURL=nip44-binary.js.map","import { decode, mlsExporter, mlsMessageDecoder, } from \"ts-mls\";\nimport { decryptBytes, encryptBytes, getConversationKey, } from \"../utils/nip44-binary.js\";\nimport { getPublicKey } from \"applesauce-core/helpers\";\nlet hasWarnedLegacyGroupMessage = false;\n/**\n * Emits a one-time warning when legacy MIP-03 group-message decryption is used.\n */\nexport function warnLegacyGroupMessageUsed() {\n if (hasWarnedLegacyGroupMessage)\n return;\n hasWarnedLegacyGroupMessage = true;\n console.warn(\"[marmot-ts] Decoded legacy MIP-03 group message format (NIP-44 envelope). This compatibility path is deprecated and will be removed in a future release.\");\n}\n/**\n * Legacy key derivation for pre-spec-update kind-445 payloads.\n *\n * Old format used MLS-Exporter(\"nostr\", \"nostr\", 32) and then derived a\n * self-addressed NIP-44 conversation key from that secret.\n */\nasync function getLegacyGroupConversationKey(clientState, ciphersuite) {\n const nostrSecret = await mlsExporter(clientState.keySchedule.exporterSecret, \"nostr\", new TextEncoder().encode(\"nostr\"), 32, ciphersuite);\n const publicKey = getPublicKey(nostrSecret);\n return getConversationKey(nostrSecret, publicKey);\n}\n/**\n * Decrypts the legacy kind-445 content envelope and decodes an MLSMessage.\n *\n * This compatibility path exists only for historical events and should be\n * removed after ecosystem migration to the current MIP-03 format.\n */\nexport async function decryptLegacyGroupMessageEventContent(content, clientState, ciphersuite) {\n const conversationKey = await getLegacyGroupConversationKey(clientState, ciphersuite);\n const serializedMessage = decryptBytes(content, conversationKey);\n const decoded = decode(mlsMessageDecoder, serializedMessage);\n if (!decoded)\n throw new Error(\"Failed to decode legacy MLS message\");\n warnLegacyGroupMessageUsed();\n return decoded;\n}\n/**\n * Legacy content encoder kept for test coverage and migration tooling only.\n */\nexport async function createLegacyEncryptedGroupEventContent(options) {\n const conversationKey = await getLegacyGroupConversationKey(options.state, options.ciphersuite);\n return encryptBytes(options.serializedMessage, conversationKey);\n}\n//# sourceMappingURL=group-message-legacy.js.map","import { wireformats } from \"ts-mls\";\n/** Check if a MLSMessage is a private message */\nexport function isPrivateMessage(message) {\n return message.wireformat === wireformats.mls_private_message;\n}\n//# sourceMappingURL=message.js.map","import { finalizeEvent } from \"applesauce-core/helpers/event\";\nimport { generateSecretKey } from \"applesauce-core/helpers/keys\";\nimport { contentTypes, decode, encode, mlsExporter, mlsMessageDecoder, mlsMessageEncoder, } from \"ts-mls\";\nimport { decodeContent, encodeContent } from \"../utils/encoding.js\";\nimport { unixNow } from \"../utils/nostr.js\";\nimport { decryptLegacyGroupMessageEventContent } from \"./group-message-legacy.js\";\nimport { getNostrGroupIdHex } from \"./client-state.js\";\nimport { isPrivateMessage } from \"./message.js\";\nimport { GROUP_EVENT_KIND } from \"./protocol.js\";\nimport { chacha20poly1305 } from \"@noble/ciphers/chacha.js\";\nimport { concatBytes, randomBytes } from \"@noble/ciphers/utils.js\";\n/**\n * Derives the MIP-03 group-event encryption key for a group epoch.\n *\n * Uses the MLS Exporter (RFC 9420 §8.5) with label \"marmot\" and context\n * \"group-event\" to produce a 32-byte ChaCha20-Poly1305 key.\n */\nasync function getGroupEventEncryptionKey(clientState, ciphersuite) {\n return mlsExporter(clientState.keySchedule.exporterSecret, \"marmot\", new TextEncoder().encode(\"group-event\"), 32, ciphersuite);\n}\n/**\n * Reads a {@link NostrEvent} and returns the {@link MlsMessage} it contains.\n * Decrypts group-event encrypted content using the exporter_secret from the group state.\n *\n * @param message - The Nostr event containing the encrypted MLS message\n * @param clientState - The ClientState for the group (to get exporter_secret)\n * @param ciphersuite - The ciphersuite implementation\n * @returns The decoded MlsMessage\n */\nexport async function decryptGroupMessageEvent(message, clientState, ciphersuite) {\n try {\n const key = await getGroupEventEncryptionKey(clientState, ciphersuite);\n const payload = decodeBase64(message.content);\n if (payload.length < 28) {\n throw new Error(\"Malformed group event content: expected at least 28 bytes\");\n }\n const nonce = payload.subarray(0, 12);\n const ciphertext = payload.subarray(12);\n const serializedMessage = chacha20poly1305(key, nonce, new Uint8Array(0)).decrypt(ciphertext);\n const decoded = decode(mlsMessageDecoder, serializedMessage);\n if (!decoded)\n throw new Error(\"Failed to decode MLS message\");\n return decoded;\n }\n catch (primaryError) {\n try {\n return await decryptLegacyGroupMessageEventContent(message.content, clientState, ciphersuite);\n }\n catch (legacyError) {\n throw new Error(`Failed to decrypt group message (new format and legacy fallback failed): ${formatError(primaryError)}; legacy: ${formatError(legacyError)}`);\n }\n }\n}\n/**\n * Encrypts the content of a group event using MIP-03.\n *\n * @param state - The ClientState for the group (to get exporter_secret)\n * @param ciphersuite - The ciphersuite implementation\n * @param message - The MLS message to encrypt\n * @returns The encrypted content\n */\nexport async function createEncryptedGroupEventContent({ state, ciphersuite, message, }) {\n const serializedMessage = encode(mlsMessageEncoder, message);\n const key = await getGroupEventEncryptionKey(state, ciphersuite);\n const nonce = randomBytes(12);\n const ciphertext = chacha20poly1305(key, nonce, new Uint8Array(0)).encrypt(serializedMessage);\n return encodeBase64(concatBytes(nonce, ciphertext));\n}\n/**\n * Decrypts a kind 445 event and returns the {@link MlsMessage} it contains.\n *\n * @param event - The Nostr event containing the encrypted MLS message\n * @param clientState - The ClientState for the group (to get exporter_secret)\n * @param ciphersuite - The ciphersuite implementation\n * @returns The event and the decoded MlsMessage\n */\nexport async function decryptGroupMessage(event, clientState, ciphersuite) {\n const message = await decryptGroupMessageEvent(event, clientState, ciphersuite);\n return { event, message };\n}\n/**\n * Decrypts multiple kind 445 events and returns the {@link MlsMessage} they contain.\n *\n * @param events - The Nostr events containing the encrypted MLS messages\n * @param clientState - The ClientState for the group (to get exporter_secret)\n * @param ciphersuite - The ciphersuite implementation\n * @returns An array of event and decoded MlsMessage pairs\n */\nexport async function decryptGroupMessages(events, clientState, ciphersuite) {\n const read = [];\n const unreadable = [];\n await Promise.all(events.map(async (event) => {\n try {\n read.push(await decryptGroupMessage(event, clientState, ciphersuite));\n }\n catch {\n unreadable.push(event);\n }\n }));\n return { read, unreadable };\n}\n/**\n * Creates a Nostr event containing an encrypted MLS message.\n *\n * @param options - The options for creating the event\n * @returns A signed Nostr event\n */\nexport async function createGroupEvent(options) {\n const { message, state, ciphersuite } = options;\n const content = await createEncryptedGroupEventContent({\n state,\n ciphersuite,\n message,\n });\n const groupId = getNostrGroupIdHex(state);\n const draft = {\n kind: GROUP_EVENT_KIND,\n created_at: unixNow(),\n content,\n tags: [[\"h\", groupId]],\n };\n // Ephemeral keypair for signing — distinct from the encryption keypair (MIP-03)\n const ephemeralSecretKey = generateSecretKey();\n return finalizeEvent(draft, ephemeralSecretKey);\n}\n/**\n * Serializes an application rumor (unsigned Nostr event) to bytes.\n * This is the format used for application messages in Marmot groups.\n *\n * @param rumor - The unsigned Nostr event to serialize\n * @returns The serialized application data as bytes\n */\nexport function serializeApplicationRumor(rumor) {\n // Serialize the rumor to a JSON string\n const json = JSON.stringify(rumor);\n // Encode as UTF-8 bytes\n return new TextEncoder().encode(json);\n}\n/**\n * Deserializes application data bytes back into a rumor.\n *\n * @param data - The serialized application data\n * @returns The deserialized Rumor\n */\nexport function deserializeApplicationData(data) {\n // Decode UTF-8 bytes to string\n const json = new TextDecoder().decode(data);\n // Parse JSON\n const parsed = JSON.parse(json);\n // Validate it's a rumor-like object\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"Invalid application data: not an object\");\n }\n // Check required fields for a rumor\n if (!parsed.id || !parsed.pubkey || parsed.kind === undefined) {\n throw new Error(\"Invalid application data: missing required fields\");\n }\n return parsed;\n}\n/** @deprecated Kept for internal compatibility. Prefer `deserializeApplicationData`. */\nexport const deserializeApplicationRumor = deserializeApplicationData;\n/**\n * Sorts group commits to handle race conditions according to MIP-03.\n *\n * Sorting order (MIP-03):\n * 1. First, sort by commit time (created_at) - older commits first\n * 2. If equal, sort by event id (lexicographically) - lower id first\n *\n * @param commits - Array of commit message pairs to sort\n * @returns Sorted array of commits\n */\nexport function sortGroupCommits(commits) {\n return commits.sort((a, b) => {\n // Rule 1: Sort by created_at (older first)\n if (a.event.created_at !== b.event.created_at) {\n return a.event.created_at - b.event.created_at;\n }\n // Rule 2: If equal, sort by event id (lexicographically)\n return a.event.id.localeCompare(b.event.id);\n });\n}\n/**\n * Creates a proposal event for a group.\n *\n * @param options - The options for creating the proposal event\n * @returns A signed Nostr event\n */\nexport async function createProposalEvent(options) {\n return createGroupEvent(options);\n}\n/**\n * Creates a commit event for a group.\n *\n * @param options - The options for creating the commit event\n * @returns A signed Nostr event\n */\nexport async function createCommitEvent(options) {\n return createGroupEvent(options);\n}\n/**\n * Checks if a message is an application message (not a proposal or commit).\n */\nexport function isApplicationMessage(pair) {\n if (!isPrivateMessage(pair.message))\n return false;\n return pair.message.privateMessage.contentType === contentTypes.application;\n}\n/**\n * Checks if a message is a commit message.\n */\nexport function isCommitMessage(pair) {\n if (!isPrivateMessage(pair.message))\n return false;\n return pair.message.privateMessage.contentType === contentTypes.commit;\n}\n/**\n * Checks if a message is a proposal message.\n */\nexport function isProposalMessage(pair) {\n if (!isPrivateMessage(pair.message))\n return false;\n return pair.message.privateMessage.contentType === contentTypes.proposal;\n}\nfunction decodeBase64(value) {\n try {\n return decodeContent(value, \"base64\");\n }\n catch (error) {\n throw new Error(`Invalid base64 group event content: ${formatError(error)}`);\n }\n}\nfunction encodeBase64(value) {\n return encodeContent(value, \"base64\");\n}\nfunction formatError(error) {\n return error instanceof Error ? error.message : String(error);\n}\n//# sourceMappingURL=group-message.js.map","import { bytesToHex } from \"@noble/hashes/utils.js\";\nimport { ciphersuites, decode, defaultCredentialTypes, encode, keyPackageDecoder, keyPackageEncoder, protocolVersions, } from \"ts-mls\";\nimport { decodeContent, encodeContent, getEncodingTag, } from \"../utils/encoding.js\";\nimport { getTagValue, unixNow } from \"../utils/nostr.js\";\nimport { isValidRelayUrl, normalizeRelayUrl } from \"../utils/relay-url.js\";\nimport { getCredentialPubkey } from \"./credential.js\";\nimport { isGreaseValue } from \"./grease.js\";\nimport { calculateKeyPackageRef } from \"./key-package.js\";\nimport { ADDRESSABLE_KEY_PACKAGE_KIND, KEY_PACKAGE_CIPHER_SUITE_TAG, KEY_PACKAGE_CLIENT_TAG, KEY_PACKAGE_EXTENSIONS_TAG, KEY_PACKAGE_KIND, KEY_PACKAGE_MLS_VERSION_TAG, KEY_PACKAGE_RELAYS_TAG, } from \"./protocol.js\";\n/**\n * Creates a NIP-09 delete event (kind 5) to delete one or more key package\n * events (kind 443 or kind 30443).\n *\n * For kind 30443 events, both an `e` tag (event id) and an `a` tag\n * (addressable coordinate) are included so relays can match either way.\n * For kind 443 events, only an `e` tag is included (as before).\n * String-only inputs produce only `e` tags since no pubkey/d is available.\n */\nexport function createDeleteKeyPackageEvent(options) {\n const { events } = options;\n if (!events || events.length === 0) {\n throw new Error(\"At least one event must be provided for deletion\");\n }\n const eTags = [];\n const aTags = [];\n const kValues = new Set();\n for (const e of events) {\n if (typeof e === \"string\") {\n // String id only — no kind info available, emit e tag without k inference\n eTags.push([\"e\", e]);\n }\n else {\n if (e.kind !== KEY_PACKAGE_KIND &&\n e.kind !== ADDRESSABLE_KEY_PACKAGE_KIND) {\n throw new Error(`Event ${e.id} is not a key package event (kind ${e.kind} instead of ${KEY_PACKAGE_KIND} or ${ADDRESSABLE_KEY_PACKAGE_KIND})`);\n }\n kValues.add(String(e.kind));\n eTags.push([\"e\", e.id]);\n if (e.kind === ADDRESSABLE_KEY_PACKAGE_KIND) {\n const identifier = getKeyPackageIdentifier(e);\n if (identifier !== undefined) {\n aTags.push([\n \"a\",\n `${ADDRESSABLE_KEY_PACKAGE_KIND}:${e.pubkey}:${identifier}`,\n ]);\n }\n }\n }\n }\n // Build k tags from the set of observed kinds (for full NostrEvent inputs)\n // If only string ids were provided, fall back to tagging both known kinds\n const kTags = kValues.size > 0\n ? [...kValues].map((k) => [\"k\", k])\n : [\n [\"k\", String(KEY_PACKAGE_KIND)],\n [\"k\", String(ADDRESSABLE_KEY_PACKAGE_KIND)],\n ];\n return {\n kind: 5,\n created_at: unixNow(),\n content: \"\",\n tags: [...kTags, ...eTags, ...aTags],\n };\n}\n/** Get the KeyPackage from a kind 443 or kind 30443 event */\nexport function getKeyPackage(event) {\n const encodingFormat = getEncodingTag(event);\n if (encodingFormat !== \"base64\") {\n throw new Error(\"KeyPackage event must include encoding=base64 tag (hex and missing tags are rejected)\");\n }\n const content = decodeContent(event.content, encodingFormat);\n const decoded = decode(keyPackageDecoder, content);\n if (!decoded)\n throw new Error(\"Failed to decode key package\");\n return decoded;\n}\n/** Gets the MLS protocol version from a kind 443 or kind 30443 event */\nexport function getKeyPackageMLSVersion(event) {\n const version = getTagValue(event, KEY_PACKAGE_MLS_VERSION_TAG);\n return version;\n}\n/** Gets the MLS cipher suite from a kind 443 or kind 30443 event */\nexport function getKeyPackageCipherSuiteId(event) {\n const cipherSuite = getTagValue(event, KEY_PACKAGE_CIPHER_SUITE_TAG);\n if (!cipherSuite)\n return undefined;\n const id = parseInt(cipherSuite);\n // Verify that cipher suite is a valid ID\n if (!Object.values(ciphersuites).includes(id)) {\n throw new Error(`Invalid MLS cipher suite ID ${id}`);\n }\n return id;\n}\n/** Gets the MLS extensions for a kind 443 or kind 30443 event */\nexport function getKeyPackageExtensions(event) {\n const tag = event.tags.find((t) => t[0] === KEY_PACKAGE_EXTENSIONS_TAG);\n if (!tag)\n return undefined;\n const ids = tag\n .slice(1)\n // NOTE: we are intentially not passing a radix to parseInt here so that it can handle base 10 and 16 (with leading 0x)\n .map((t) => parseInt(t))\n .filter((id) => Number.isFinite(id));\n return ids;\n}\n/** Gets the relays for a kind 443 or kind 30443 event */\nexport function getKeyPackageRelays(event) {\n const tag = event.tags.find((t) => t[0] === KEY_PACKAGE_RELAYS_TAG);\n if (!tag)\n return;\n return tag.slice(1).filter(isValidRelayUrl).map(normalizeRelayUrl);\n}\n/** Gets the client for a kind 443 or kind 30443 event */\nexport function getKeyPackageClient(event) {\n const tag = event.tags.find((t) => t[0] === KEY_PACKAGE_CLIENT_TAG);\n if (!tag)\n return undefined;\n // TODO: parse the rest of the client tag\n return {\n name: tag[1],\n };\n}\n/**\n * Gets the addressable slot identifier (`d` tag) from a kind 30443 event.\n * Returns `undefined` for kind 443 events (which have no `d` tag).\n */\nexport function getKeyPackageIdentifier(event) {\n if (event.kind !== ADDRESSABLE_KEY_PACKAGE_KIND)\n return undefined;\n return getTagValue(event, \"d\");\n}\n/**\n * Creates an addressable key package event (kind 30443) from a key package.\n *\n * @param options - The options for creating the key package event\n * @returns The unsigned key package event template\n */\nexport function createKeyPackageEvent(options) {\n return createKeyPackageEventInternal(options);\n}\nasync function createKeyPackageEventInternal(options) {\n const { keyPackage, relays, client } = options;\n // Serialize the key package according to RFC 9420\n const encodedBytes = encode(keyPackageEncoder, keyPackage);\n const content = encodeContent(encodedBytes, \"base64\");\n // Get the cipher suite from the key package\n // ts-mls v2: keyPackage.cipherSuite is a numeric id already\n const ciphersuiteHex = `0x${keyPackage.cipherSuite\n .toString(16)\n .padStart(4, \"0\")}`;\n // Extract extension types from the key package extensions\n const extensionTypes = keyPackage.extensions.map((ext) => {\n // Extension type is now always a number in v2\n return `0x${ext.extensionType.toString(16).padStart(4, \"0\")}`;\n });\n // Also include extensions from leaf node capabilities to signal support\n // This ensures Marmot Group Data Extension (0xf2ee) is included in the event\n if (keyPackage.leafNode.capabilities?.extensions) {\n for (const extType of keyPackage.leafNode.capabilities.extensions) {\n // Only add if not already present (avoid duplicates)\n const hexValue = `0x${extType.toString(16).padStart(4, \"0\")}`;\n if (!extensionTypes.includes(hexValue)) {\n extensionTypes.push(hexValue);\n }\n }\n }\n // Filter out GREASE values from the extension types\n // We only want to include actual extensions (last_resort and Marmot Group Data Extension)\n const filteredExtensionTypes = extensionTypes.filter((hexValue) => {\n // Parse the hex value back to number to check if it's a GREASE value\n const extType = parseInt(hexValue);\n return !isGreaseValue(extType);\n });\n // Get the protocol version - keyPackage.version is a numeric ProtocolVersionValue\n // NIP tag expects a display string like \"1.0\".\n const versionName = Object.keys(protocolVersions).find((k) => protocolVersions[k] === keyPackage.version);\n const version = versionName === \"mls10\" ? \"1.0\" : String(keyPackage.version);\n // Build tags\n const tags = [];\n // NIP-70: protected event — relay must not serve this event to non-authors.\n // NOTE: Optional/opt-in because many popular relays reject protected events.\n if (options.protected)\n tags.push([\"-\"]);\n // Addressable identifier (required for kind 30443)\n tags.push([\"d\", options.identifier]);\n tags.push([KEY_PACKAGE_MLS_VERSION_TAG, version], [KEY_PACKAGE_CIPHER_SUITE_TAG, ciphersuiteHex], [KEY_PACKAGE_EXTENSIONS_TAG, ...filteredExtensionTypes], [\"encoding\", \"base64\"]);\n // MIP-00: required KeyPackageRef tag (\"i\")\n const keyPackageRef = await calculateKeyPackageRef(keyPackage);\n tags.push([\"i\", bytesToHex(keyPackageRef)]);\n // Add client tag if provided\n if (client)\n tags.push([KEY_PACKAGE_CLIENT_TAG, client]);\n // Add relay tags if provided\n if (relays && relays.length > 0) {\n const validRelays = relays.filter(isValidRelayUrl).map(normalizeRelayUrl);\n if (validRelays.length > 0) {\n tags.push([KEY_PACKAGE_RELAYS_TAG, ...validRelays]);\n }\n }\n return {\n kind: ADDRESSABLE_KEY_PACKAGE_KIND,\n created_at: unixNow(),\n content,\n tags,\n };\n}\n/**\n * Gets the nostr public key from a key package event.\n *\n * @param event - The key package event (kind 443 or kind 30443)\n * @returns The nostr public key (hex string)\n * @throws Error if the credential is not a basic credential\n */\nexport function getKeyPackageNostrPubkey(event) {\n const keyPackage = getKeyPackage(event);\n if (keyPackage.leafNode.credential.credentialType !==\n defaultCredentialTypes.basic) {\n throw new Error(\"Key package does not use a basic credential, cannot get nostr public key\");\n }\n return getCredentialPubkey(keyPackage.leafNode.credential);\n}\n/**\n * Returns the KeyPackageRef (MIP-00 `i` tag value) from a kind 443 or kind\n * 30443 KeyPackage event.\n *\n * Per MIP-00, new events MUST include this tag. Older events may not.\n */\nexport function getKeyPackageReference(event) {\n return getTagValue(event, \"i\");\n}\n//# sourceMappingURL=key-package-event.js.map","\"use strict\";\n/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bytes = exports.stringToBytes = exports.str = exports.bytesToString = exports.hex = exports.utf8 = exports.bech32m = exports.bech32 = exports.base58check = exports.base58xmr = exports.base58xrp = exports.base58flickr = exports.base58 = exports.base64url = exports.base64 = exports.base32crockford = exports.base32hex = exports.base32 = exports.base16 = exports.utils = exports.assertNumber = void 0;\nfunction assertNumber(n) {\n if (!Number.isSafeInteger(n))\n throw new Error(`Wrong integer: ${n}`);\n}\nexports.assertNumber = assertNumber;\nfunction chain(...args) {\n const wrap = (a, b) => (c) => a(b(c));\n const encode = Array.from(args)\n .reverse()\n .reduce((acc, i) => (acc ? wrap(acc, i.encode) : i.encode), undefined);\n const decode = args.reduce((acc, i) => (acc ? wrap(acc, i.decode) : i.decode), undefined);\n return { encode, decode };\n}\nfunction alphabet(alphabet) {\n return {\n encode: (digits) => {\n if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))\n throw new Error('alphabet.encode input should be an array of numbers');\n return digits.map((i) => {\n assertNumber(i);\n if (i < 0 || i >= alphabet.length)\n throw new Error(`Digit index outside alphabet: ${i} (alphabet: ${alphabet.length})`);\n return alphabet[i];\n });\n },\n decode: (input) => {\n if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string'))\n throw new Error('alphabet.decode input should be array of strings');\n return input.map((letter) => {\n if (typeof letter !== 'string')\n throw new Error(`alphabet.decode: not string element=${letter}`);\n const index = alphabet.indexOf(letter);\n if (index === -1)\n throw new Error(`Unknown letter: \"${letter}\". Allowed: ${alphabet}`);\n return index;\n });\n },\n };\n}\nfunction join(separator = '') {\n if (typeof separator !== 'string')\n throw new Error('join separator should be string');\n return {\n encode: (from) => {\n if (!Array.isArray(from) || (from.length && typeof from[0] !== 'string'))\n throw new Error('join.encode input should be array of strings');\n for (let i of from)\n if (typeof i !== 'string')\n throw new Error(`join.encode: non-string input=${i}`);\n return from.join(separator);\n },\n decode: (to) => {\n if (typeof to !== 'string')\n throw new Error('join.decode input should be string');\n return to.split(separator);\n },\n };\n}\nfunction padding(bits, chr = '=') {\n assertNumber(bits);\n if (typeof chr !== 'string')\n throw new Error('padding chr should be string');\n return {\n encode(data) {\n if (!Array.isArray(data) || (data.length && typeof data[0] !== 'string'))\n throw new Error('padding.encode input should be array of strings');\n for (let i of data)\n if (typeof i !== 'string')\n throw new Error(`padding.encode: non-string input=${i}`);\n while ((data.length * bits) % 8)\n data.push(chr);\n return data;\n },\n decode(input) {\n if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string'))\n throw new Error('padding.encode input should be array of strings');\n for (let i of input)\n if (typeof i !== 'string')\n throw new Error(`padding.decode: non-string input=${i}`);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('Invalid padding: string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n if (!(((end - 1) * bits) % 8))\n throw new Error('Invalid padding: string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\nfunction normalize(fn) {\n if (typeof fn !== 'function')\n throw new Error('normalize fn should be function');\n return { encode: (from) => from, decode: (to) => fn(to) };\n}\nfunction convertRadix(data, from, to) {\n if (from < 2)\n throw new Error(`convertRadix: wrong from=${from}, base cannot be less than 2`);\n if (to < 2)\n throw new Error(`convertRadix: wrong to=${to}, base cannot be less than 2`);\n if (!Array.isArray(data))\n throw new Error('convertRadix: data should be array');\n if (!data.length)\n return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data);\n digits.forEach((d) => {\n assertNumber(d);\n if (d < 0 || d >= from)\n throw new Error(`Wrong integer: ${d}`);\n });\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < digits.length; i++) {\n const digit = digits[i];\n const digitBase = from * carry + digit;\n if (!Number.isSafeInteger(digitBase) ||\n (from * carry) / from !== carry ||\n digitBase - digit !== from * carry) {\n throw new Error('convertRadix: carry overflow');\n }\n carry = digitBase % to;\n digits[i] = Math.floor(digitBase / to);\n if (!Number.isSafeInteger(digits[i]) || digits[i] * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done)\n continue;\n else if (!digits[i])\n pos = i;\n else\n done = false;\n }\n res.push(carry);\n if (done)\n break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++)\n res.push(0);\n return res.reverse();\n}\nconst gcd = (a, b) => (!b ? a : gcd(b, a % b));\nconst radix2carry = (from, to) => from + (to - gcd(from, to));\nfunction convertRadix2(data, from, to, padding) {\n if (!Array.isArray(data))\n throw new Error('convertRadix2: data should be array');\n if (from <= 0 || from > 32)\n throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32)\n throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`);\n }\n let carry = 0;\n let pos = 0;\n const mask = 2 ** to - 1;\n const res = [];\n for (const n of data) {\n assertNumber(n);\n if (n >= 2 ** from)\n throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32)\n throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to)\n res.push(((carry >> (pos - to)) & mask) >>> 0);\n carry &= 2 ** pos - 1;\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from)\n throw new Error('Excess padding');\n if (!padding && carry)\n throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0)\n res.push(carry >>> 0);\n return res;\n}\nfunction radix(num) {\n assertNumber(num);\n return {\n encode: (bytes) => {\n if (!(bytes instanceof Uint8Array))\n throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), 2 ** 8, num);\n },\n decode: (digits) => {\n if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))\n throw new Error('radix.decode input should be array of strings');\n return Uint8Array.from(convertRadix(digits, num, 2 ** 8));\n },\n };\n}\nfunction radix2(bits, revPadding = false) {\n assertNumber(bits);\n if (bits <= 0 || bits > 32)\n throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes) => {\n if (!(bytes instanceof Uint8Array))\n throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits) => {\n if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))\n throw new Error('radix2.decode input should be array of strings');\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\nfunction unsafeWrapper(fn) {\n if (typeof fn !== 'function')\n throw new Error('unsafeWrapper fn should be function');\n return function (...args) {\n try {\n return fn.apply(null, args);\n }\n catch (e) { }\n };\n}\nfunction checksum(len, fn) {\n assertNumber(len);\n if (typeof fn !== 'function')\n throw new Error('checksum fn should be function');\n return {\n encode(data) {\n if (!(data instanceof Uint8Array))\n throw new Error('checksum.encode: input should be Uint8Array');\n const checksum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(checksum, data.length);\n return res;\n },\n decode(data) {\n if (!(data instanceof Uint8Array))\n throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const newChecksum = fn(payload).slice(0, len);\n const oldChecksum = data.slice(-len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i])\n throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\nexports.utils = { alphabet, chain, checksum, radix, radix2, join, padding };\nexports.base16 = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\nexports.base32 = chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), padding(5), join(''));\nexports.base32hex = chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), padding(5), join(''));\nexports.base32crockford = chain(radix2(5), alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'), join(''), normalize((s) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1')));\nexports.base64 = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), padding(6), join(''));\nexports.base64url = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), padding(6), join(''));\nconst genBase58 = (abc) => chain(radix(58), alphabet(abc), join(''));\nexports.base58 = genBase58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');\nexports.base58flickr = genBase58('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ');\nexports.base58xrp = genBase58('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz');\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\nexports.base58xmr = {\n encode(data) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += exports.base58.encode(block).padStart(XMR_BLOCK_LEN[block.length], '1');\n }\n return res;\n },\n decode(str) {\n let res = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = exports.base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0)\n throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\nconst base58check = (sha256) => chain(checksum(4, (data) => sha256(sha256(data))), exports.base58);\nexports.base58check = base58check;\nconst BECH_ALPHABET = chain(alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), join(''));\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre) {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1)\n chk ^= POLYMOD_GENERATORS[i];\n }\n return chk;\n}\nfunction bechChecksum(prefix, words, encodingConst = 1) {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126)\n throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++)\n chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words)\n chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++)\n chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % 2 ** 30], 30, 5, false));\n}\nfunction genBech32(encoding) {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n function encode(prefix, words, limit = 90) {\n if (typeof prefix !== 'string')\n throw new Error(`bech32.encode prefix should be string, not ${typeof prefix}`);\n if (!Array.isArray(words) || (words.length && typeof words[0] !== 'number'))\n throw new Error(`bech32.encode words should be array of numbers, not ${typeof words}`);\n const actualLength = prefix.length + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n prefix = prefix.toLowerCase();\n return `${prefix}1${BECH_ALPHABET.encode(words)}${bechChecksum(prefix, words, ENCODING_CONST)}`;\n }\n function decode(str, limit = 90) {\n if (typeof str !== 'string')\n throw new Error(`bech32.decode input should be string, not ${typeof str}`);\n if (str.length < 8 || (limit !== false && str.length > limit))\n throw new TypeError(`Wrong string length: ${str.length} (${str}). Expected (8..${limit})`);\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n str = lowered;\n const sepIndex = str.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = str.slice(0, sepIndex);\n const _words = str.slice(sepIndex + 1);\n if (_words.length < 6)\n throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(_words).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!_words.endsWith(sum))\n throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n const decodeUnsafe = unsafeWrapper(decode);\n function decodeToBytes(str) {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n return { encode, decode, decodeToBytes, decodeUnsafe, fromWords, fromWordsUnsafe, toWords };\n}\nexports.bech32 = genBech32('bech32');\nexports.bech32m = genBech32('bech32m');\nexports.utf8 = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\nexports.hex = chain(radix2(4), alphabet('0123456789abcdef'), join(''), normalize((s) => {\n if (typeof s !== 'string' || s.length % 2)\n throw new TypeError(`hex.decode: expected string, got ${typeof s} with length ${s.length}`);\n return s.toLowerCase();\n}));\nconst CODERS = {\n utf8: exports.utf8, hex: exports.hex, base16: exports.base16, base32: exports.base32, base64: exports.base64, base64url: exports.base64url, base58: exports.base58, base58xmr: exports.base58xmr\n};\nconst coderTypeError = `Invalid encoding type. Available types: ${Object.keys(CODERS).join(', ')}`;\nconst bytesToString = (type, bytes) => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type))\n throw new TypeError(coderTypeError);\n if (!(bytes instanceof Uint8Array))\n throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\nexports.bytesToString = bytesToString;\nexports.str = exports.bytesToString;\nconst stringToBytes = (type, str) => {\n if (!CODERS.hasOwnProperty(type))\n throw new TypeError(coderTypeError);\n if (typeof str !== 'string')\n throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\nexports.stringToBytes = stringToBytes;\nexports.bytes = exports.stringToBytes;\n","const {bech32, hex, utf8} = require('@scure/base')\n\n// defaults for encode; default timestamp is current time at call\nconst DEFAULTNETWORK = {\n // default network is bitcoin\n bech32: 'bc',\n pubKeyHash: 0x00,\n scriptHash: 0x05,\n validWitnessVersions: [0]\n}\nconst TESTNETWORK = {\n bech32: 'tb',\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n validWitnessVersions: [0]\n}\nconst SIGNETNETWORK = {\n bech32: 'tbs',\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n validWitnessVersions: [0]\n}\nconst REGTESTNETWORK = {\n bech32: 'bcrt',\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n validWitnessVersions: [0]\n}\nconst SIMNETWORK = {\n bech32: 'sb',\n pubKeyHash: 0x3f,\n scriptHash: 0x7b,\n validWitnessVersions: [0]\n}\n\nconst FEATUREBIT_ORDER = [\n 'option_data_loss_protect',\n 'initial_routing_sync',\n 'option_upfront_shutdown_script',\n 'gossip_queries',\n 'var_onion_optin',\n 'gossip_queries_ex',\n 'option_static_remotekey',\n 'payment_secret',\n 'basic_mpp',\n 'option_support_large_channel'\n]\n\nconst DIVISORS = {\n m: BigInt(1e3),\n u: BigInt(1e6),\n n: BigInt(1e9),\n p: BigInt(1e12)\n}\n\nconst MAX_MILLISATS = BigInt('2100000000000000000')\n\nconst MILLISATS_PER_BTC = BigInt(1e11)\n\nconst TAGCODES = {\n payment_hash: 1,\n payment_secret: 16,\n description: 13,\n payee: 19,\n description_hash: 23, // commit to longer descriptions (used by lnurl-pay)\n expiry: 6, // default: 3600 (1 hour)\n min_final_cltv_expiry: 24, // default: 9\n fallback_address: 9,\n route_hint: 3, // for extra routing info (private etc.)\n feature_bits: 5,\n metadata: 27\n}\n\n// reverse the keys and values of TAGCODES and insert into TAGNAMES\nconst TAGNAMES = {}\nfor (let i = 0, keys = Object.keys(TAGCODES); i < keys.length; i++) {\n const currentName = keys[i]\n const currentCode = TAGCODES[keys[i]].toString()\n TAGNAMES[currentCode] = currentName\n}\n\nconst TAGPARSERS = {\n 1: words => hex.encode(bech32.fromWordsUnsafe(words)), // 256 bits\n 16: words => hex.encode(bech32.fromWordsUnsafe(words)), // 256 bits\n 13: words => utf8.encode(bech32.fromWordsUnsafe(words)), // string variable length\n 19: words => hex.encode(bech32.fromWordsUnsafe(words)), // 264 bits\n 23: words => hex.encode(bech32.fromWordsUnsafe(words)), // 256 bits\n 27: words => hex.encode(bech32.fromWordsUnsafe(words)), // variable\n 6: wordsToIntBE, // default: 3600 (1 hour)\n 24: wordsToIntBE, // default: 9\n 3: routingInfoParser, // for extra routing info (private etc.)\n 5: featureBitsParser // keep feature bits as array of 5 bit words\n}\n\nfunction getUnknownParser(tagCode) {\n return words => ({\n tagCode: parseInt(tagCode),\n words: bech32.encode('unknown', words, Number.MAX_SAFE_INTEGER)\n })\n}\n\nfunction wordsToIntBE(words) {\n return words.reverse().reduce((total, item, index) => {\n return total + item * Math.pow(32, index)\n }, 0)\n}\n\n// first convert from words to buffer, trimming padding where necessary\n// parse in 51 byte chunks. See encoder for details.\nfunction routingInfoParser(words) {\n const routes = []\n let pubkey,\n shortChannelId,\n feeBaseMSats,\n feeProportionalMillionths,\n cltvExpiryDelta\n let routesBuffer = bech32.fromWordsUnsafe(words)\n while (routesBuffer.length > 0) {\n pubkey = hex.encode(routesBuffer.slice(0, 33)) // 33 bytes\n shortChannelId = hex.encode(routesBuffer.slice(33, 41)) // 8 bytes\n feeBaseMSats = parseInt(hex.encode(routesBuffer.slice(41, 45)), 16) // 4 bytes\n feeProportionalMillionths = parseInt(\n hex.encode(routesBuffer.slice(45, 49)),\n 16\n ) // 4 bytes\n cltvExpiryDelta = parseInt(hex.encode(routesBuffer.slice(49, 51)), 16) // 2 bytes\n\n routesBuffer = routesBuffer.slice(51)\n\n routes.push({\n pubkey,\n short_channel_id: shortChannelId,\n fee_base_msat: feeBaseMSats,\n fee_proportional_millionths: feeProportionalMillionths,\n cltv_expiry_delta: cltvExpiryDelta\n })\n }\n return routes\n}\n\nfunction featureBitsParser(words) {\n const bools = words\n .slice()\n .reverse()\n .map(word => [\n !!(word & 0b1),\n !!(word & 0b10),\n !!(word & 0b100),\n !!(word & 0b1000),\n !!(word & 0b10000)\n ])\n .reduce((finalArr, itemArr) => finalArr.concat(itemArr), [])\n while (bools.length < FEATUREBIT_ORDER.length * 2) {\n bools.push(false)\n }\n\n const featureBits = {}\n\n FEATUREBIT_ORDER.forEach((featureName, index) => {\n let status\n if (bools[index * 2]) {\n status = 'required'\n } else if (bools[index * 2 + 1]) {\n status = 'supported'\n } else {\n status = 'unsupported'\n }\n featureBits[featureName] = status\n })\n\n const extraBits = bools.slice(FEATUREBIT_ORDER.length * 2)\n featureBits.extra_bits = {\n start_bit: FEATUREBIT_ORDER.length * 2,\n bits: extraBits,\n has_required: extraBits.reduce(\n (result, bit, index) =>\n index % 2 !== 0 ? result || false : result || bit,\n false\n )\n }\n\n return featureBits\n}\n\nfunction hrpToMillisat(hrpString, outputString) {\n let divisor, value\n if (hrpString.slice(-1).match(/^[munp]$/)) {\n divisor = hrpString.slice(-1)\n value = hrpString.slice(0, -1)\n } else if (hrpString.slice(-1).match(/^[^munp0-9]$/)) {\n throw new Error('Not a valid multiplier for the amount')\n } else {\n value = hrpString\n }\n\n if (!value.match(/^\\d+$/))\n throw new Error('Not a valid human readable amount')\n\n const valueBN = BigInt(value)\n\n const millisatoshisBN = divisor\n ? (valueBN * MILLISATS_PER_BTC) / DIVISORS[divisor]\n : valueBN * MILLISATS_PER_BTC\n\n if (\n (divisor === 'p' && !(valueBN % BigInt(10) === BigInt(0))) ||\n millisatoshisBN > MAX_MILLISATS\n ) {\n throw new Error('Amount is outside of valid range')\n }\n\n return outputString ? millisatoshisBN.toString() : millisatoshisBN\n}\n\n// decode will only have extra comments that aren't covered in encode comments.\n// also if anything is hard to read I'll comment.\nfunction decode(paymentRequest, network) {\n if (typeof paymentRequest !== 'string')\n throw new Error('Lightning Payment Request must be string')\n if (paymentRequest.slice(0, 2).toLowerCase() !== 'ln')\n throw new Error('Not a proper lightning payment request')\n\n const sections = []\n const decoded = bech32.decode(paymentRequest, Number.MAX_SAFE_INTEGER)\n paymentRequest = paymentRequest.toLowerCase()\n const prefix = decoded.prefix\n let words = decoded.words\n let letters = paymentRequest.slice(prefix.length + 1)\n let sigWords = words.slice(-104)\n words = words.slice(0, -104)\n\n // Without reverse lookups, can't say that the multipier at the end must\n // have a number before it, so instead we parse, and if the second group\n // doesn't have anything, there's a good chance the last letter of the\n // coin type got captured by the third group, so just re-regex without\n // the number.\n let prefixMatches = prefix.match(/^ln(\\S+?)(\\d*)([a-zA-Z]?)$/)\n if (prefixMatches && !prefixMatches[2])\n prefixMatches = prefix.match(/^ln(\\S+)$/)\n if (!prefixMatches) {\n throw new Error('Not a proper lightning payment request')\n }\n\n // \"ln\" section\n sections.push({\n name: 'lightning_network',\n letters: 'ln'\n })\n\n // \"bc\" section\n const bech32Prefix = prefixMatches[1]\n let coinNetwork\n if (!network) {\n switch (bech32Prefix) {\n case DEFAULTNETWORK.bech32:\n coinNetwork = DEFAULTNETWORK\n break\n case TESTNETWORK.bech32:\n coinNetwork = TESTNETWORK\n break\n case SIGNETNETWORK.bech32:\n coinNetwork = SIGNETNETWORK\n break\n case REGTESTNETWORK.bech32:\n coinNetwork = REGTESTNETWORK\n break\n case SIMNETWORK.bech32:\n coinNetwork = SIMNETWORK\n break\n }\n } else {\n if (\n network.bech32 === undefined ||\n network.pubKeyHash === undefined ||\n network.scriptHash === undefined ||\n !Array.isArray(network.validWitnessVersions)\n )\n throw new Error('Invalid network')\n coinNetwork = network\n }\n if (!coinNetwork || coinNetwork.bech32 !== bech32Prefix) {\n throw new Error('Unknown coin bech32 prefix')\n }\n sections.push({\n name: 'coin_network',\n letters: bech32Prefix,\n value: coinNetwork\n })\n\n // amount section\n const value = prefixMatches[2]\n let millisatoshis\n if (value) {\n const divisor = prefixMatches[3]\n millisatoshis = hrpToMillisat(value + divisor, true)\n sections.push({\n name: 'amount',\n letters: prefixMatches[2] + prefixMatches[3],\n value: millisatoshis\n })\n } else {\n millisatoshis = null\n }\n\n // \"1\" separator\n sections.push({\n name: 'separator',\n letters: '1'\n })\n\n // timestamp\n const timestamp = wordsToIntBE(words.slice(0, 7))\n words = words.slice(7) // trim off the left 7 words\n sections.push({\n name: 'timestamp',\n letters: letters.slice(0, 7),\n value: timestamp\n })\n letters = letters.slice(7)\n\n let tagName, parser, tagLength, tagWords\n // we have no tag count to go on, so just keep hacking off words\n // until we have none.\n while (words.length > 0) {\n const tagCode = words[0].toString()\n tagName = TAGNAMES[tagCode] || 'unknown_tag'\n parser = TAGPARSERS[tagCode] || getUnknownParser(tagCode)\n words = words.slice(1)\n\n tagLength = wordsToIntBE(words.slice(0, 2))\n words = words.slice(2)\n\n tagWords = words.slice(0, tagLength)\n words = words.slice(tagLength)\n\n sections.push({\n name: tagName,\n tag: letters[0],\n letters: letters.slice(0, 1 + 2 + tagLength),\n value: parser(tagWords) // see: parsers for more comments\n })\n letters = letters.slice(1 + 2 + tagLength)\n }\n\n // signature\n sections.push({\n name: 'signature',\n letters: letters.slice(0, 104),\n value: hex.encode(bech32.fromWordsUnsafe(sigWords))\n })\n letters = letters.slice(104)\n\n // checksum\n sections.push({\n name: 'checksum',\n letters: letters\n })\n\n let result = {\n paymentRequest,\n sections,\n\n get expiry() {\n let exp = sections.find(s => s.name === 'expiry')\n if (exp) return getValue('timestamp') + exp.value\n },\n\n get route_hints() {\n return sections.filter(s => s.name === 'route_hint').map(s => s.value)\n }\n }\n\n for (let name in TAGCODES) {\n if (name === 'route_hint') {\n // route hints can be multiple, so this won't work for them\n continue\n }\n\n Object.defineProperty(result, name, {\n get() {\n return getValue(name)\n }\n })\n }\n\n return result\n\n function getValue(name) {\n let section = sections.find(s => s.name === name)\n return section ? section.value : undefined\n }\n}\n\nmodule.exports = {\n decode,\n hrpToMillisat\n}\n","import { decode } from \"light-bolt11-decoder\";\n/** Parses a lightning invoice */\nexport function parseBolt11(paymentRequest) {\n const decoded = decode(paymentRequest);\n const timestamp = decoded.sections.find((s) => s.name === \"timestamp\")?.value ?? 0;\n const description = decoded.sections.find((s) => s.name === \"description\")?.value ?? \"\";\n const amount = parseInt(decoded.sections.find((s) => s.name === \"amount\")?.value ?? \"0\");\n const paymentHash = decoded.sections.find((s) => s.name === \"payment_hash\");\n return {\n paymentRequest: decoded.paymentRequest,\n description: description,\n amount: amount,\n timestamp: timestamp,\n expiry: timestamp + decoded.expiry,\n paymentHash: paymentHash?.value,\n };\n}\n","import { getOrComputeCachedValue, isATag, isETag, notifyEventUpdate, processTags } from \"applesauce-core/helpers\";\nimport { kinds } from \"applesauce-core/helpers/event\";\nimport { getHiddenTags, isHiddenTagsUnlocked, unlockHiddenTags } from \"applesauce-core/helpers/hidden-tags\";\nimport { getAddressPointerFromATag, getEventPointerFromETag, getReplaceableAddressFromPointer, isAddressPointer, isEventPointer, mergeAddressPointers, mergeEventPointers, } from \"applesauce-core/helpers/pointers\";\n/** Validates that an event is a valid bookmark list (kind 10000) */\nexport function isValidBookmarkList(event) {\n return event.kind === kinds.BookmarkList;\n}\n/** Validates that an event is a valid bookmark set (kind 30003) */\nexport function isValidBookmarkSet(event) {\n return event.kind === kinds.Bookmarksets;\n}\nexport const BookmarkPublicSymbol = Symbol.for(\"bookmark-public\");\nexport const BookmarkHiddenSymbol = Symbol.for(\"bookmark-hidden\");\n/** Parses an array of tags into a {@link Bookmarks} object */\nexport function parseBookmarkTags(tags) {\n return processTags(tags, (t) => {\n if (isETag(t))\n return getEventPointerFromETag(t) ?? undefined;\n if (isATag(t)) {\n const pointer = getAddressPointerFromATag(t) ?? undefined;\n // Ensure the address pointer is a long form article\n if (pointer?.kind !== kinds.LongFormArticle)\n return undefined;\n return pointer;\n }\n return undefined;\n });\n}\n/** Merges any number of {@link Bookmarks} objects */\nexport function mergeBookmarks(...bookmarks) {\n const notes = new Map();\n const articles = new Map();\n for (const pointer of bookmarks.flat()) {\n if (isEventPointer(pointer)) {\n const existing = notes.get(pointer.id);\n if (existing)\n notes.set(pointer.id, mergeEventPointers(existing, pointer));\n else\n notes.set(pointer.id, pointer);\n }\n else if (isAddressPointer(pointer)) {\n const address = getReplaceableAddressFromPointer(pointer);\n const existing = articles.get(address);\n if (existing)\n articles.set(address, mergeAddressPointers(existing, pointer));\n else\n articles.set(address, pointer);\n }\n }\n return [...notes.values(), ...articles.values()];\n}\n/** Returns the bookmarks of the event */\nexport function getBookmarks(bookmark) {\n return getOrComputeCachedValue(bookmark, BookmarkPublicSymbol, () => parseBookmarkTags(bookmark.tags));\n}\n/** Checks if the hidden bookmarks are unlocked */\nexport function isHiddenBookmarksUnlocked(bookmark) {\n return (isHiddenTagsUnlocked(bookmark) && (BookmarkHiddenSymbol in bookmark || getHiddenBookmarks(bookmark) !== undefined));\n}\nexport function getHiddenBookmarks(bookmark) {\n if (BookmarkHiddenSymbol in bookmark)\n return bookmark[BookmarkHiddenSymbol];\n //get hidden tags\n const tags = getHiddenTags(bookmark);\n if (!tags)\n return undefined;\n // parse bookmarks\n const bookmarks = parseBookmarkTags(tags);\n // set cached value\n Reflect.set(bookmark, BookmarkHiddenSymbol, bookmarks);\n return bookmarks;\n}\n/** Unlocks the hidden bookmarks on a bookmarks event */\nexport async function unlockHiddenBookmarks(bookmark, signer) {\n if (isHiddenBookmarksUnlocked(bookmark))\n return bookmark[BookmarkHiddenSymbol];\n // unlock hidden tags\n await unlockHiddenTags(bookmark, signer);\n // get hidden bookmarks\n const bookmarks = getHiddenBookmarks(bookmark);\n if (!bookmarks)\n throw new Error(\"Failed to unlock hidden bookmarks\");\n // notify event store\n notifyEventUpdate(bookmark);\n return bookmarks;\n}\n","import { createPTagFromProfilePointer } from \"applesauce-core/helpers\";\nimport { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\nimport { getTagValue } from \"applesauce-core/helpers/event\";\nimport { getProfilePointerFromPTag } from \"applesauce-core/helpers/pointers\";\nimport { fillAndTrimTag, isPTag, isRTag, isTTag } from \"applesauce-core/helpers/tags\";\n// NIP-52 Calendar Event Kinds\nexport const DATE_BASED_CALENDAR_EVENT_KIND = 31922;\nexport const TIME_BASED_CALENDAR_EVENT_KIND = 31923;\n/** Checks if an event is a date-based calendar event */\nexport function isValidDateBasedCalendarEvent(event) {\n return event.kind === DATE_BASED_CALENDAR_EVENT_KIND;\n}\n/** Checks if an event is a time-based calendar event */\nexport function isValidTimeBasedCalendarEvent(event) {\n return event.kind === TIME_BASED_CALENDAR_EVENT_KIND;\n}\n// Cache symbols for complex operations only\nexport const CalendarEventLocationsSymbol = Symbol.for(\"calendar-event-locations\");\nexport const CalendarEventParticipantsSymbol = Symbol.for(\"calendar-event-participants\");\nexport const CalendarEventHashtagsSymbol = Symbol.for(\"calendar-event-hashtags\");\nexport const CalendarEventReferencesSymbol = Symbol.for(\"calendar-event-references\");\nexport const CalendarEventGeohashSymbol = Symbol.for(\"calendar-event-geohash\");\n/** Gets the title of a calendar event or calendar */\nexport function getCalendarEventTitle(event) {\n return getTagValue(event, \"title\") || getTagValue(event, \"name\"); // fallback to deprecated \"name\" tag\n}\n/** Gets the summary of a calendar event */\nexport function getCalendarEventSummary(event) {\n return getTagValue(event, \"summary\");\n}\n/** Gets the image URL of a calendar event */\nexport function getCalendarEventImage(event) {\n return getTagValue(event, \"image\");\n}\n/** Gets the start Unix timestamp of a calendar event */\nexport function getCalendarEventStart(event) {\n const value = getTagValue(event, \"start\");\n if (!value)\n return undefined;\n if (event.kind === DATE_BASED_CALENDAR_EVENT_KIND)\n return new Date(value).valueOf() / 1000;\n else if (event.kind === TIME_BASED_CALENDAR_EVENT_KIND)\n return parseInt(value);\n else\n return undefined;\n}\n/** Gets the timezone of the start timestamp of a calendar event */\nexport function getCalendarEventStartTimezone(event) {\n if (event.kind === DATE_BASED_CALENDAR_EVENT_KIND)\n return undefined;\n return getTagValue(event, \"start_tzid\");\n}\n/** Gets the timezone of the end timestamp of a calendar event */\nexport function getCalendarEventEndTimezone(event) {\n if (event.kind === DATE_BASED_CALENDAR_EVENT_KIND)\n return undefined;\n return getTagValue(event, \"end_tzid\");\n}\n/** Gets the end Unix timestamp of a calendar event */\nexport function getCalendarEventEnd(event) {\n const value = getTagValue(event, \"end\");\n if (!value)\n return undefined;\n if (event.kind === DATE_BASED_CALENDAR_EVENT_KIND)\n return new Date(value).valueOf() / 1000;\n else if (event.kind === TIME_BASED_CALENDAR_EVENT_KIND)\n return parseInt(value);\n else\n return undefined;\n}\n/** Gets all locations from a calendar event */\nexport function getCalendarEventLocations(event) {\n return getOrComputeCachedValue(event, CalendarEventLocationsSymbol, () => {\n return event.tags.filter((t) => t[0] === \"location\" && t[1]).map((t) => t[1]);\n });\n}\n/** Gets the geohash of a calendar event */\nexport function getCalendarEventGeohash(event) {\n return getOrComputeCachedValue(event, CalendarEventGeohashSymbol, () => {\n let hash = undefined;\n for (const tag of event.tags) {\n if (tag[0] === \"g\" && tag[1] && (!hash || tag[1].length > hash.length))\n hash = tag[1];\n }\n return hash;\n });\n}\n/** Gets all participants from a calendar event */\nexport function getCalendarEventParticipants(event) {\n return getOrComputeCachedValue(event, CalendarEventParticipantsSymbol, () => {\n return event.tags\n .filter(isPTag)\n .map((tag) => {\n const pointer = getProfilePointerFromPTag(tag);\n if (!pointer)\n return undefined;\n return {\n ...pointer,\n role: tag[3] || undefined,\n };\n })\n .filter((p) => p !== undefined);\n });\n}\n/** Gets all hashtags from a calendar event */\nexport function getCalendarEventHashtags(event) {\n return getOrComputeCachedValue(event, CalendarEventHashtagsSymbol, () => {\n return event.tags.filter(isTTag).map((t) => t[1]);\n });\n}\n/** Gets all references from a calendar event */\nexport function getCalendarEventReferences(event) {\n return getOrComputeCachedValue(event, CalendarEventReferencesSymbol, () => {\n return event.tags.filter(isRTag).map((t) => t[1]);\n });\n}\n/** Creates a \"p\" tag for a calendar event participant */\nexport function createCalendarEventParticipantTag(participant) {\n const tag = createPTagFromProfilePointer(participant);\n // Add the third \"role\" value if set\n if (participant.role) {\n tag[3] = participant.role;\n return fillAndTrimTag(tag, 3);\n }\n return tag;\n}\n","import { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\nexport const ChannelMetadataSymbol = Symbol.for(\"channel-metadata\");\nfunction parseChannelMetadataContent(channel) {\n const metadata = JSON.parse(channel.content);\n if (metadata.name === undefined ||\n metadata.about === undefined ||\n metadata.picture === undefined ||\n (metadata.relays && !Array.isArray(metadata.relays)))\n return null;\n return metadata;\n}\n/** Gets the parsed metadata on a channel creation or channel metadata event */\nexport function getChannelMetadataContent(channel) {\n return getOrComputeCachedValue(channel, ChannelMetadataSymbol, () => {\n return parseChannelMetadataContent(channel);\n });\n}\n/** gets the EventPointer for a channel message or metadata event */\nexport function getChannelPointer(event) {\n const tag = event.tags.find((t) => t[0] === \"e\" && t[1]);\n if (!tag)\n return undefined;\n return tag[2] ? { id: tag[1], relays: [tag[2]] } : { id: tag[1] };\n}\n","import { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\nimport { createReplaceableAddress, getTagValue, isAddressableKind, } from \"applesauce-core/helpers/event\";\nimport { getAddressPointerFromATag } from \"applesauce-core/helpers/pointers\";\nimport { isSafeRelayURL } from \"applesauce-core/helpers/relays\";\nimport { fillAndTrimTag } from \"applesauce-core/helpers/tags\";\nimport { getExternalPointerFromTag } from \"./external-id.js\";\nexport const COMMENT_KIND = 1111;\nexport const CommentRootPointerSymbol = Symbol.for(\"comment-root-pointer\");\nexport const CommentReplyPointerSymbol = Symbol.for(\"comment-reply-pointer\");\n/** Gets the EventPointer from an array of tags */\nexport function getCommentEventPointer(tags, root = false) {\n const eTag = tags.find((t) => t[0] === (root ? \"E\" : \"e\"));\n const kind = tags.find((t) => t[0] === (root ? \"K\" : \"k\"))?.[1];\n if (eTag) {\n // Missing kind tag, return null\n if (!kind)\n return null;\n // only the root pubkey can be gotten from the tags, since due to quotes and mentions there will be many \"p\" tags for replies\n const rootPubkey = root ? tags.find((t) => t[0] === \"P\")?.[1] : undefined;\n const pointer = {\n type: \"event\",\n id: eTag[1],\n kind: parseInt(kind),\n pubkey: eTag[3] || rootPubkey || undefined,\n relay: eTag[2] && isSafeRelayURL(eTag[2]) ? eTag[2] : undefined,\n };\n return pointer;\n }\n return null;\n}\n/** Gets the AddressPointer from an array of tags */\nexport function getCommentAddressPointer(tags, root = false) {\n const aTag = tags.find((t) => t[0] === (root ? \"A\" : \"a\"));\n const eTag = tags.find((t) => t[0] === (root ? \"E\" : \"e\"));\n const kind = tags.find((t) => t[0] === (root ? \"K\" : \"k\"))?.[1];\n if (aTag) {\n // Missing kind tag, return null\n if (!kind)\n return null;\n const addressPointer = getAddressPointerFromATag(aTag);\n if (!addressPointer)\n return null;\n const pointer = {\n type: \"address\",\n id: eTag?.[1],\n pubkey: addressPointer.pubkey,\n identifier: addressPointer.identifier,\n kind: addressPointer.kind || parseInt(kind),\n relay: addressPointer.relays?.[0] || eTag?.[2],\n };\n return pointer;\n }\n return null;\n}\n/** Gets the ExternalPointer from an array of tags */\nexport function getCommentExternalPointer(tags, root = false) {\n const iTag = tags.find((t) => t[0] === (root ? \"I\" : \"i\"));\n if (iTag) {\n const pointer = getExternalPointerFromTag(iTag);\n if (!pointer)\n return null;\n return {\n type: \"external\",\n ...pointer,\n };\n }\n return null;\n}\nexport function getCommentRootPointer(comment) {\n if (comment.kind !== COMMENT_KIND)\n return null;\n return getOrComputeCachedValue(comment, CommentRootPointerSymbol, () => {\n // check for address pointer first since it can also have E tags\n const A = getCommentAddressPointer(comment.tags, true);\n if (A)\n return A;\n const E = getCommentEventPointer(comment.tags, true);\n if (E)\n return E;\n const I = getCommentExternalPointer(comment.tags, true);\n if (I)\n return I;\n return null;\n });\n}\n/** Returns the reply pointer for a comment */\nexport function getCommentReplyPointer(comment) {\n if (comment.kind !== COMMENT_KIND)\n return null;\n return getOrComputeCachedValue(comment, CommentReplyPointerSymbol, () => {\n // check for address pointer first since it can also have E tags\n const A = getCommentAddressPointer(comment.tags, false);\n if (A)\n return A;\n const E = getCommentEventPointer(comment.tags, false);\n if (E)\n return E;\n const I = getCommentExternalPointer(comment.tags, false);\n if (I)\n return I;\n return null;\n });\n}\n/** Checks if a pointer is a {@link CommentEventPointer} */\nexport function isCommentEventPointer(pointer) {\n return (Reflect.has(pointer, \"id\") &&\n Reflect.has(pointer, \"kind\") &&\n !Reflect.has(pointer, \"identifier\") &&\n typeof pointer.kind === \"number\");\n}\n/** Checks if a pointer is a {@link CommentAddressPointer} */\nexport function isCommentAddressPointer(pointer) {\n return (Reflect.has(pointer, \"identifier\") &&\n Reflect.has(pointer, \"pubkey\") &&\n Reflect.has(pointer, \"kind\") &&\n typeof pointer.kind === \"number\");\n}\n/** Checks if a pointer is a {@link CommentExternalPointer} */\nexport function isCommentExternalPointer(pointer) {\n return (pointer?.type === \"external\" &&\n Reflect.has(pointer, \"kind\") &&\n Reflect.has(pointer, \"identifier\") &&\n typeof pointer.kind === \"string\");\n}\n/** Checks if a comment event is valid */\nexport function isValidComment(comment) {\n return (comment.kind === COMMENT_KIND && getCommentRootPointer(comment) !== null && getCommentReplyPointer(comment) !== null);\n}\n/** Create a set fo tags for a single CommentPointer */\nexport function createCommentTagsFromCommentPointer(pointer, root = false) {\n if (isCommentEventPointer(pointer)) {\n // Event pointer\n return [\n fillAndTrimTag([root ? \"E\" : \"e\", pointer.id, pointer.relay, pointer.pubkey]),\n [root ? \"K\" : \"k\", String(pointer.kind)],\n pointer.pubkey ? fillAndTrimTag([root ? \"P\" : \"p\", pointer.pubkey]) : undefined,\n ].filter((t) => !!t);\n }\n else if (isCommentAddressPointer(pointer)) {\n // Address pointer\n return [\n fillAndTrimTag([\n root ? \"A\" : \"a\",\n createReplaceableAddress(pointer.kind, pointer.pubkey, pointer.identifier),\n pointer.relay,\n ]),\n pointer.id ? fillAndTrimTag([root ? \"E\" : \"e\", pointer.id, pointer.relay, pointer.pubkey]) : undefined,\n [root ? \"K\" : \"k\", String(pointer.kind)],\n pointer.pubkey ? fillAndTrimTag([root ? \"P\" : \"p\", pointer.pubkey]) : undefined,\n ].filter((t) => !!t);\n }\n else {\n // External pointer\n return [\n [root ? \"I\" : \"i\", pointer.identifier],\n [root ? \"K\" : \"k\", pointer.kind],\n ];\n }\n throw new Error(\"Unknown comment pointer kind\");\n}\n/** Returns an array of NIP-22 tags for a kind 1111 comment event */\nexport function createCommentTagsForEvent(parent, relayHint) {\n const tags = [];\n let parentPointer;\n if (isAddressableKind(parent.kind)) {\n const identifier = getTagValue(parent, \"d\");\n if (!identifier)\n throw new Error(\"Event missing identifier\");\n parentPointer = {\n type: \"address\",\n id: parent.id,\n pubkey: parent.pubkey,\n kind: parent.kind,\n relay: relayHint,\n identifier,\n };\n }\n else {\n parentPointer = { type: \"event\", id: parent.id, pubkey: parent.pubkey, kind: parent.kind, relay: relayHint };\n }\n // check if parent event is a comment\n if (parent.kind === COMMENT_KIND) {\n // comment is a reply to another comment\n const pointer = getCommentRootPointer(parent);\n if (!pointer)\n throw new Error(\"Comment missing root pointer\");\n // recreate the root tags\n tags.push(...createCommentTagsFromCommentPointer(pointer, true));\n }\n else {\n // comment is root comment\n tags.push(...createCommentTagsFromCommentPointer(parentPointer, true));\n }\n // add reply tags\n tags.push(...createCommentTagsFromCommentPointer(parentPointer, false));\n return tags;\n}\n","import { logger } from \"applesauce-core\";\nimport { canHaveEncryptedContent, getEncryptedContent, isEncryptedContentUnlocked, setEncryptedContentCache, } from \"applesauce-core/helpers/encrypted-content\";\nimport { kinds, notifyEventUpdate } from \"applesauce-core/helpers/event\";\nimport { catchError, combineLatest, combineLatestWith, distinct, EMPTY, filter, isObservable, map, merge, mergeMap, of, switchMap, } from \"rxjs\";\nimport { getGiftWrapSeal, getSealGiftWrap, getSealRumor, isGiftWrapUnlocked } from \"./gift-wrap.js\";\n/** A symbol that is used to mark encrypted content as being from a cache */\nexport const EncryptedContentFromCacheSymbol = Symbol.for(\"encrypted-content-from-cache\");\n/** Marks the encrypted content as being from a cache */\nexport function markEncryptedContentFromCache(event) {\n Reflect.set(event, EncryptedContentFromCacheSymbol, true);\n}\n/** Checks if the encrypted content is from a cache */\nexport function isEncryptedContentFromCache(event) {\n return Reflect.has(event, EncryptedContentFromCacheSymbol);\n}\nconst log = logger.extend(\"EncryptedContentCache\");\n/**\n * Starts a process that persists and restores all encrypted content\n * @param eventStore - The event store to listen to\n * @param storage - The storage to use\n * @param fallback - A function that will be called when the encrypted content is not found in storage\n * @returns A function that can be used to stop the process\n */\nexport function persistEncryptedContent(eventStore, storage, fallback) {\n const storage$ = isObservable(storage) ? storage : of(storage);\n // Get the encrypted content from storage or call the fallback\n const getItem = async (storage, event) => {\n return (await storage.getItem(event.id)) || (fallback ? await fallback(event) : null);\n };\n // Restore encrypted content when it is inserted\n const restore = eventStore.insert$\n .pipe(\n // Look for events that support encrypted content and are locked\n filter((e) => canHaveEncryptedContent(e.kind) && isEncryptedContentUnlocked(e) === false), \n // Get the storage\n combineLatestWith(storage$), \n // Get the encrypted content from storage\n mergeMap(([event, storage]) => \n // Get content from storage\n combineLatest([\n of(event),\n getItem(storage, event).catch((error) => {\n log(`Failed to restore encrypted content for ${event.id}`, error);\n return of(null);\n }),\n ])))\n .subscribe(async ([event, content]) => {\n if (typeof content !== \"string\")\n return;\n // Restore the encrypted content and set it as from a cache\n markEncryptedContentFromCache(event);\n setEncryptedContentCache(event, content);\n log(`Restored encrypted content for ${event.id}`);\n });\n // Restore seals when they are unlocked\n const restoreSeals = eventStore.update$\n .pipe(\n // Look for gift wraps that are unlocked\n filter((e) => e.kind === kinds.GiftWrap && isEncryptedContentUnlocked(e)), \n // Get the seal event\n map((gift) => getGiftWrapSeal(gift)), \n // Look for gift wraps with locked seals\n filter((seal) => seal !== undefined && isEncryptedContentUnlocked(seal) === false), \n // Only attempt to unlock seals once\n distinct((seal) => seal.id), \n // Get encrypted content from storage\n mergeMap((seal) => \n // Wait for storage to be available\n storage$.pipe(switchMap((storage) => combineLatest([of(seal), getItem(storage, seal)])), catchError((error) => {\n log(`Failed to restore encrypted content for ${seal.id}`, error);\n return EMPTY;\n }))))\n .subscribe(async ([seal, content]) => {\n if (!seal || !content)\n return;\n markEncryptedContentFromCache(seal);\n setEncryptedContentCache(seal, content);\n // Parse the rumor event\n getSealRumor(seal);\n // Trigger an update to the gift wrap event\n const gift = getSealGiftWrap(seal);\n if (gift)\n notifyEventUpdate(gift);\n log(`Restored encrypted content for ${seal.id}`);\n });\n // Persist encrypted content when it is updated or inserted\n const persist = merge(eventStore.update$, eventStore.insert$)\n .pipe(\n // Look for events that support encrypted content and are unlocked and not from the cache\n filter((event) => canHaveEncryptedContent(event.kind) &&\n isEncryptedContentUnlocked(event) &&\n isEncryptedContentFromCache(event) === false), \n // Only persist the encrypted content once\n distinct((event) => event.id), \n // get the storage\n combineLatestWith(storage$))\n .subscribe(async ([event, storage]) => {\n try {\n const content = getEncryptedContent(event);\n if (content) {\n await storage.setItem(event.id, content);\n log(`Persisted encrypted content for ${event.id}`);\n }\n }\n catch (error) {\n // Ignore errors when saving encrypted content\n log(`Failed to persist encrypted content for ${event.id}`, error);\n }\n });\n // Persist seals when the gift warp is unlocked or inserted unlocked\n // This relies on the gift wrap event being updated when a seal is unlocked\n const unlockedSeals$ = merge(eventStore.update$, eventStore.insert$).pipe(filter((event) => event.kind === kinds.GiftWrap), filter(isGiftWrapUnlocked), map((gift) => getGiftWrapSeal(gift)), distinct((seal) => seal.id));\n const persistSeals = unlockedSeals$\n .pipe(filter((seal) => isEncryptedContentFromCache(seal) === false), combineLatestWith(storage$))\n .subscribe(async ([seal, storage]) => {\n if (!seal)\n return;\n try {\n const content = getEncryptedContent(seal);\n if (content) {\n await storage.setItem(seal.id, content);\n log(`Persisted encrypted content for ${seal.id}`);\n }\n }\n catch (error) {\n // Ignore errors when saving encrypted content\n log(`Failed to persist encrypted content for ${seal.id}`, error);\n }\n });\n return () => {\n restore.unsubscribe();\n persist.unsubscribe();\n restoreSeals.unsubscribe();\n persistSeals.unsubscribe();\n };\n}\n","import { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\n/** Parses file metadata tags into {@link FileMetadata} */\nexport function parseFileMetadataTags(tags) {\n const fields = {};\n let fallback = undefined;\n for (const [name, value] of tags) {\n switch (name) {\n case \"fallback\":\n fallback = fallback ? [...fallback, value] : [value];\n break;\n default:\n fields[name] = value;\n break;\n }\n }\n const metadata = { url: fields.url, fallback };\n // parse size\n if (fields.size)\n metadata.size = parseInt(fields.size);\n // copy optional fields\n if (fields.m)\n metadata.type = fields.m;\n if (fields.x)\n metadata.sha256 = fields.x;\n if (fields.ox)\n metadata.originalSha256 = fields.ox;\n if (fields.dim)\n metadata.dimensions = fields.dim;\n if (fields.magnet)\n metadata.magnet = fields.magnet;\n if (fields.i)\n metadata.infohash = fields.i;\n if (fields.thumb)\n metadata.thumbnail = fields.thumb;\n if (fields.image)\n metadata.image = fields.image;\n if (fields.summary)\n metadata.summary = fields.summary;\n if (fields.alt)\n metadata.alt = fields.alt;\n if (fields.blurhash)\n metadata.blurhash = fields.blurhash;\n return metadata;\n}\n/** Parses a imeta tag into a {@link FileMetadata} */\nexport function getFileMetadataFromImetaTag(tag) {\n const parts = tag.slice(1);\n const tags = [];\n for (const part of parts) {\n const match = part.match(/^(.+?)\\s(.+)$/);\n if (match) {\n const [_, name, value] = match;\n tags.push([name, value]);\n }\n }\n return parseFileMetadataTags(tags);\n}\nexport const MediaAttachmentsSymbol = Symbol.for(\"media-attachments\");\n/** Gets all the media attachments on an event */\nexport function getMediaAttachments(event) {\n return getOrComputeCachedValue(event, MediaAttachmentsSymbol, () => {\n return event.tags\n .filter((t) => t[0] === \"imeta\")\n .map((tag) => {\n try {\n return getFileMetadataFromImetaTag(tag);\n }\n catch (error) {\n // ignore invalid attachments\n return undefined;\n }\n })\n .filter((a) => !!a);\n });\n}\n/** Gets {@link FileMetadata} for a NIP-94 kind 1063 event */\nexport function getFileMetadata(file) {\n return parseFileMetadataTags(file.tags);\n}\n/** Returns the last 64 length hex string in a URL */\nexport function getSha256FromURL(url) {\n if (typeof url === \"string\")\n url = new URL(url);\n const hashes = Array.from(url.pathname.matchAll(/[0-9a-f]{64}/gi));\n if (hashes.length > 0)\n return hashes[hashes.length - 1][0];\n return;\n}\n/** Creates tags for {@link FileMetadata} */\nexport function createFileMetadataTags(attachment) {\n const tags = [];\n const add = (name, value) => tags.push([name, String(value)]);\n if (attachment.url)\n add(\"url\", attachment.url);\n if (attachment.type)\n add(\"m\", attachment.type);\n if (attachment.sha256)\n add(\"x\", attachment.sha256);\n if (attachment.originalSha256)\n add(\"ox\", attachment.originalSha256);\n if (attachment.size !== undefined)\n add(\"size\", attachment.size);\n if (attachment.dimensions)\n add(\"dim\", attachment.dimensions);\n if (attachment.magnet)\n add(\"magnet\", attachment.magnet);\n if (attachment.infohash)\n add(\"i\", attachment.infohash);\n if (attachment.blurhash)\n add(\"blurhash\", attachment.blurhash);\n if (attachment.thumbnail)\n add(\"thumb\", attachment.thumbnail);\n if (attachment.image)\n add(\"image\", attachment.image);\n if (attachment.summary)\n add(\"summary\", attachment.summary);\n if (attachment.alt)\n add(\"alt\", attachment.alt);\n if (attachment.fallback && attachment.fallback?.length > 0)\n for (const url of attachment.fallback)\n add(\"fallback\", url);\n return tags;\n}\n/** Creates an imeta tag for a media attachment */\nexport function createImetaTagForAttachment(attachment) {\n return [\"imeta\", ...createFileMetadataTags(attachment).map((t) => t.join(\" \"))];\n}\n","import { getOrComputeCachedValue, notifyEventUpdate } from \"applesauce-core/helpers\";\nimport { getReplaceableIdentifier, getTagValue } from \"applesauce-core/helpers/event\";\nimport { getHiddenTags, isHiddenTagsUnlocked, unlockHiddenTags } from \"applesauce-core/helpers/hidden-tags\";\nimport { processTags } from \"applesauce-core/helpers/tags\";\nimport { normalizeURL } from \"applesauce-core/helpers/url\";\nexport const GROUPS_LIST_KIND = 10009;\nexport const GROUP_MESSAGE_KIND = 9;\n// NIP-29 Group event kinds\nexport const GROUP_METADATA_KIND = 39000;\nexport const GROUP_ADMINS_KIND = 39001;\nexport const GROUP_MEMBERS_KIND = 39002;\nexport const GROUP_ROLES_KIND = 39003;\nexport const JOIN_REQUEST_KIND = 9021;\nexport const LEAVE_REQUEST_KIND = 9022;\nexport const PUT_USER_KIND = 9000;\nexport const REMOVE_USER_KIND = 9001;\nexport const EDIT_METADATA_KIND = 9002;\nexport const DELETE_EVENT_KIND = 9005;\nexport const CREATE_GROUP_KIND = 9007;\nexport const DELETE_GROUP_KIND = 9008;\nexport const CREATE_INVITE_KIND = 9009;\n/** decodes a group identifier into a group pointer object */\nexport function decodeGroupPointer(str) {\n let [relay, id] = str.split(\"'\");\n if (!relay)\n return null;\n // Prepend wss:// if missing\n if (!relay.match(/^wss?:/))\n relay = `wss://${relay}`;\n // Normalize the relay url\n relay = normalizeURL(relay);\n return { relay, id: id || \"_\" };\n}\n/** Converts a group pointer into a group identifier */\nexport function encodeGroupPointer(pointer) {\n const hostname = URL.canParse(pointer.relay) ? new URL(pointer.relay).hostname : pointer.relay;\n return `${hostname}'${pointer.id}`;\n}\nexport const GroupsPublicSymbol = Symbol.for(\"groups-public\");\nexport const GroupsHiddenSymbol = Symbol.for(\"groups-hidden\");\n/** gets a {@link GroupPointer} from a \"h\" tag if it has a relay hint */\nexport function getGroupPointerFromHTag(tag, hint) {\n let [_, id, relay] = tag;\n if (!relay && hint)\n relay = hint;\n if (!id || !relay)\n return undefined;\n return { id, relay };\n}\n/** gets a {@link GroupPointer} from a \"group\" tag */\nexport function getGroupPointerFromGroupTag(tag) {\n const [_, id, relay, name] = tag;\n return { id, relay, name };\n}\n/** Returns all the public groups from a k:10009 list */\nexport function getPublicGroups(bookmark) {\n return getOrComputeCachedValue(bookmark, GroupsPublicSymbol, () => processTags(bookmark.tags.filter((t) => t[0] === \"group\"), getGroupPointerFromGroupTag));\n}\nexport function getHiddenGroups(bookmark) {\n if (GroupsHiddenSymbol in bookmark)\n return bookmark[GroupsHiddenSymbol];\n return getOrComputeCachedValue(bookmark, GroupsHiddenSymbol, () => {\n //get hidden tags\n const tags = getHiddenTags(bookmark);\n if (!tags)\n return undefined;\n // parse groups from hidden tags\n const groups = processTags(tags.filter((t) => t[0] === \"group\"), getGroupPointerFromGroupTag);\n // set cached value\n Reflect.set(bookmark, GroupsHiddenSymbol, groups);\n return groups;\n });\n}\n/** Checks if the hidden groups are unlocked */\nexport function isHiddenGroupsUnlocked(bookmark) {\n return isHiddenTagsUnlocked(bookmark) && (GroupsHiddenSymbol in bookmark || getHiddenGroups(bookmark) !== undefined);\n}\n/** Unlocks the hidden groups on a groups event */\nexport async function unlockHiddenGroups(bookmark, signer) {\n if (isHiddenGroupsUnlocked(bookmark))\n return bookmark[GroupsHiddenSymbol];\n // unlock hidden tags\n await unlockHiddenTags(bookmark, signer);\n // get hidden groups\n const groups = getHiddenGroups(bookmark);\n if (!groups)\n throw new Error(\"Failed to unlock hidden groups\");\n // notify event store\n notifyEventUpdate(bookmark);\n return groups;\n}\n/** Gets a {@link GroupPointer} from a group event by reading the \"h\" tag */\nexport function getGroupPointer(event, relay) {\n const hTag = event.tags.find((t) => t[0] === \"h\");\n if (!hTag)\n return undefined;\n return getGroupPointerFromHTag(hTag, relay);\n}\n/** Gets the group id from a group event by reading the \"h\" tag */\nexport function getGroupId(event) {\n const hTag = event.tags.find((t) => t[0] === \"h\");\n if (!hTag)\n return undefined;\n return hTag[1];\n}\n/** Gets a {@link GroupPointer} from a kind 39000 group metadata event */\nexport function getGroupPointerFromMetadata(event, relay) {\n // Use the \"d\" tag for the group ID and the provided relay\n const groupId = getReplaceableIdentifier(event) || \"_\";\n const name = getTagValue(event, \"name\");\n return {\n id: groupId,\n relay: relay,\n name: name,\n };\n}\n// Symbols for caching parsed data\nconst GroupMetadataSymbol = Symbol.for(\"group-metadata\");\nconst GroupAdminsSymbol = Symbol.for(\"group-admins\");\nconst GroupMembersSymbol = Symbol.for(\"group-members\");\nconst GroupRolesSymbol = Symbol.for(\"group-roles\");\nconst JoinRequestSymbol = Symbol.for(\"join-request\");\nconst LeaveRequestSymbol = Symbol.for(\"leave-request\");\nconst PutUserSymbol = Symbol.for(\"put-user\");\nconst RemoveUserSymbol = Symbol.for(\"remove-user\");\nconst EditMetadataSymbol = Symbol.for(\"edit-metadata\");\nconst DeleteEventSymbol = Symbol.for(\"delete-event\");\nconst CreateGroupSymbol = Symbol.for(\"create-group\");\nconst DeleteGroupSymbol = Symbol.for(\"delete-group\");\nconst CreateInviteSymbol = Symbol.for(\"create-invite\");\n/** Gets group metadata from a kind 39000 event */\nexport function getGroupMetadata(event) {\n if (event.kind !== GROUP_METADATA_KIND)\n return undefined;\n return getOrComputeCachedValue(event, GroupMetadataSymbol, () => {\n const id = getReplaceableIdentifier(event) || \"_\";\n const name = getTagValue(event, \"name\");\n const picture = getTagValue(event, \"picture\");\n const about = getTagValue(event, \"about\");\n const publicTag = event.tags.find((t) => t[0] === \"public\");\n const privateTag = event.tags.find((t) => t[0] === \"private\");\n const openTag = event.tags.find((t) => t[0] === \"open\");\n const closedTag = event.tags.find((t) => t[0] === \"closed\");\n return {\n id,\n name,\n picture,\n about,\n isPublic: !!publicTag,\n isPrivate: !!privateTag,\n isOpen: !!openTag,\n isClosed: !!closedTag,\n };\n });\n}\n/** Gets group admins from a kind 39001 event */\nexport function getGroupAdmins(event) {\n if (event.kind !== GROUP_ADMINS_KIND)\n return undefined;\n return getOrComputeCachedValue(event, GroupAdminsSymbol, () => {\n const adminsMap = new Map();\n for (const tag of event.tags) {\n if (tag[0] === \"p\" && tag[1]) {\n const pubkey = tag[1];\n const roles = tag.slice(2).filter((r) => r.length > 0);\n if (adminsMap.has(pubkey)) {\n const existingRoles = adminsMap.get(pubkey);\n adminsMap.set(pubkey, [...new Set([...existingRoles, ...roles])]);\n }\n else {\n adminsMap.set(pubkey, roles);\n }\n }\n }\n return Array.from(adminsMap.entries()).map(([pubkey, roles]) => ({\n pubkey,\n roles,\n }));\n });\n}\n/** Gets group members from a kind 39002 event */\nexport function getGroupMembers(event) {\n if (event.kind !== GROUP_MEMBERS_KIND)\n return undefined;\n return getOrComputeCachedValue(event, GroupMembersSymbol, () => {\n return event.tags.filter((t) => t[0] === \"p\" && t[1]).map((t) => t[1]);\n });\n}\n/** Gets group roles from a kind 39003 event */\nexport function getGroupRoles(event) {\n if (event.kind !== GROUP_ROLES_KIND)\n return undefined;\n return getOrComputeCachedValue(event, GroupRolesSymbol, () => {\n return event.tags\n .filter((t) => t[0] === \"role\" && t[1])\n .map((t) => ({\n name: t[1],\n description: t[2],\n }));\n });\n}\n/** Gets join request information from a kind 9021 event */\nexport function getGroupJoinRequestInfo(event) {\n if (event.kind !== JOIN_REQUEST_KIND)\n return undefined;\n return getOrComputeCachedValue(event, JoinRequestSymbol, () => {\n const groupId = getGroupId(event);\n if (!groupId)\n return undefined;\n return {\n groupId,\n reason: event.content || undefined,\n inviteCode: getTagValue(event, \"code\"),\n };\n });\n}\n/** Gets leave request information from a kind 9022 event */\nexport function getGroupLeaveRequestInfo(event) {\n if (event.kind !== LEAVE_REQUEST_KIND)\n return undefined;\n return getOrComputeCachedValue(event, LeaveRequestSymbol, () => {\n const groupId = getGroupId(event);\n if (!groupId)\n return undefined;\n return {\n groupId,\n reason: event.content || undefined,\n };\n });\n}\n/** Gets put user event information from a kind 9000 event */\nexport function getGroupPutUserInfo(event) {\n if (event.kind !== PUT_USER_KIND)\n return undefined;\n return getOrComputeCachedValue(event, PutUserSymbol, () => {\n const groupId = getGroupId(event);\n const pubkey = getTagValue(event, \"p\");\n if (!groupId || !pubkey)\n return undefined;\n const roles = event.tags.filter((t) => t[0] === \"p\" && t.length > 2).flatMap((t) => t.slice(2));\n return {\n groupId,\n pubkey,\n roles: roles.length > 0 ? roles : undefined,\n reason: event.content || undefined,\n };\n });\n}\n/** Gets remove user event information from a kind 9001 event */\nexport function getGroupRemoveUserInfo(event) {\n if (event.kind !== REMOVE_USER_KIND)\n return undefined;\n return getOrComputeCachedValue(event, RemoveUserSymbol, () => {\n const groupId = getGroupId(event);\n const pubkey = getTagValue(event, \"p\");\n if (!groupId || !pubkey)\n return undefined;\n return {\n groupId,\n pubkey,\n reason: event.content || undefined,\n };\n });\n}\n/** Gets edit metadata event information from a kind 9002 event */\nexport function getGroupEditMetadataInfo(event) {\n if (event.kind !== EDIT_METADATA_KIND)\n return undefined;\n return getOrComputeCachedValue(event, EditMetadataSymbol, () => {\n const groupId = getGroupId(event);\n if (!groupId)\n return undefined;\n const metadataFields = {};\n const name = getTagValue(event, \"name\");\n const picture = getTagValue(event, \"picture\");\n const about = getTagValue(event, \"about\");\n const publicTag = event.tags.find((t) => t[0] === \"public\");\n const privateTag = event.tags.find((t) => t[0] === \"private\");\n const openTag = event.tags.find((t) => t[0] === \"open\");\n const closedTag = event.tags.find((t) => t[0] === \"closed\");\n if (name !== undefined)\n metadataFields.name = name;\n if (picture !== undefined)\n metadataFields.picture = picture;\n if (about !== undefined)\n metadataFields.about = about;\n if (publicTag)\n metadataFields.isPublic = true;\n if (privateTag)\n metadataFields.isPrivate = true;\n if (openTag)\n metadataFields.isOpen = true;\n if (closedTag)\n metadataFields.isClosed = true;\n return {\n groupId,\n metadataFields,\n reason: event.content || undefined,\n };\n });\n}\n/** Gets delete event information from a kind 9005 event */\nexport function getGroupDeleteEventInfo(event) {\n if (event.kind !== DELETE_EVENT_KIND)\n return undefined;\n return getOrComputeCachedValue(event, DeleteEventSymbol, () => {\n const groupId = getGroupId(event);\n const eventId = getTagValue(event, \"e\");\n if (!groupId || !eventId)\n return undefined;\n return {\n groupId,\n eventId,\n reason: event.content || undefined,\n };\n });\n}\n/** Gets create group event information from a kind 9007 event */\nexport function getGroupCreateGroupInfo(event) {\n if (event.kind !== CREATE_GROUP_KIND)\n return undefined;\n return getOrComputeCachedValue(event, CreateGroupSymbol, () => {\n const groupId = getGroupId(event);\n if (!groupId)\n return undefined;\n return {\n groupId,\n reason: event.content || undefined,\n };\n });\n}\n/** Gets delete group event information from a kind 9008 event */\nexport function getGroupDeleteGroupInfo(event) {\n if (event.kind !== DELETE_GROUP_KIND)\n return undefined;\n return getOrComputeCachedValue(event, DeleteGroupSymbol, () => {\n const groupId = getGroupId(event);\n if (!groupId)\n return undefined;\n return {\n groupId,\n reason: event.content || undefined,\n };\n });\n}\n/** Gets create invite event information from a kind 9009 event */\nexport function getGroupCreateInviteInfo(event) {\n if (event.kind !== CREATE_INVITE_KIND)\n return undefined;\n return getOrComputeCachedValue(event, CreateInviteSymbol, () => {\n const groupId = getGroupId(event);\n if (!groupId)\n return undefined;\n return {\n groupId,\n reason: event.content || undefined,\n };\n });\n}\n/** Checks group membership status from kind 9000/9001 events */\nexport function checkGroupMembership(events, pubkey) {\n // Filter to only membership-related events\n const membershipEvents = events.filter((e) => (e.kind === PUT_USER_KIND || e.kind === REMOVE_USER_KIND) && getTagValue(e, \"p\") === pubkey);\n if (membershipEvents.length === 0)\n return undefined;\n // Sort by created_at descending to get the latest event\n const sorted = membershipEvents.sort((a, b) => b.created_at - a.created_at);\n const latest = sorted[0];\n // Latest event determines membership status\n return latest.kind === PUT_USER_KIND;\n}\n","import { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\nimport { getTagValue } from \"applesauce-core/helpers/event\";\nimport { getAddressPointerFromATag, getEventPointerFromETag, getProfilePointerFromPTag, } from \"applesauce-core/helpers/pointers\";\nimport { isATag, isETag, isPTag } from \"applesauce-core/helpers/tags\";\n// Symbol constants for caching\nexport const HighlightSourceEventPointerSymbol = Symbol.for(\"highlight-source-event-pointer\");\nexport const HighlightSourceAddressPointerSymbol = Symbol.for(\"highlight-source-address-pointer\");\nexport const HighlightAttributionSymbol = Symbol.for(\"highlight-attribution\");\n/**\n * Get the highlighted content from a highlight event\n * Returns the content field which contains the highlighted text\n */\nexport function getHighlightText(event) {\n return event.content;\n}\n/**\n * Get the source event pointer that was highlighted (from 'e' tag)\n * Returns undefined if no event reference is found\n */\nexport function getHighlightSourceEventPointer(event) {\n return getOrComputeCachedValue(event, HighlightSourceEventPointerSymbol, () => {\n const eTag = event.tags.find(isETag);\n return eTag ? (getEventPointerFromETag(eTag) ?? undefined) : undefined;\n });\n}\n/**\n * Get the source address pointer that was highlighted (from 'a' tag)\n * Returns undefined if no address reference is found\n */\nexport function getHighlightSourceAddressPointer(event) {\n return getOrComputeCachedValue(event, HighlightSourceAddressPointerSymbol, () => {\n const aTag = event.tags.find(isATag);\n return aTag ? (getAddressPointerFromATag(aTag) ?? undefined) : undefined;\n });\n}\n/** Get the source URL that was highlighted (from 'r' tag) */\nexport function getHighlightSourceUrl(event) {\n return getTagValue(event, \"r\");\n}\n/**\n * Get attribution information from p tags\n * Parses p tags to extract authors, editors, and other attributed individuals\n */\nexport function getHighlightAttributions(event) {\n return getOrComputeCachedValue(event, HighlightAttributionSymbol, () => {\n const attributions = [];\n const pTags = event.tags.filter(isPTag);\n for (const pTag of pTags) {\n const pointer = getProfilePointerFromPTag(pTag);\n if (!pointer)\n continue;\n const role = pTag[3] || \"other\"; // Role is the 4th element (index 3)\n const entry = { ...pointer, role };\n // Categorize by role\n attributions.push(entry);\n }\n return attributions;\n });\n}\n/**\n * Get the context text for a highlight (from 'context' tag)\n * This provides surrounding content to give context to the highlight\n */\nexport function getHighlightContext(event) {\n return getTagValue(event, \"context\");\n}\n/** Get the comment for a highlight (from 'comment' tag) */\nexport function getHighlightComment(event) {\n return getTagValue(event, \"comment\");\n}\n/**\n * Check if the highlight has any source reference (event, address, or URL)\n */\nexport function hasHighlightSource(event) {\n return !!(getHighlightSourceEventPointer(event) ||\n getHighlightSourceAddressPointer(event) ||\n getHighlightSourceUrl(event));\n}\n","import { bech32 } from \"@scure/base\";\nimport { parseBolt11 } from \"./bolt11.js\";\nconst decoder = new TextDecoder();\n/** Parses a lightning address (lud16) into a LNURLp */\nexport function parseLightningAddress(address) {\n let [name, domain] = address.split(\"@\");\n if (!name || !domain)\n return;\n return new URL(`https://${domain}/.well-known/lnurlp/${name}`);\n}\n/** Parses a LNURLp into a URL */\nexport function decodeLNURL(lnurl) {\n try {\n const { words, prefix } = bech32.decode(lnurl);\n if (prefix !== \"lnurl\")\n return;\n const str = decoder.decode(bech32.fromWords(words));\n return new URL(str);\n }\n catch (error) { }\n return undefined;\n}\n/** Parses a lightning address or LNURLp into a URL */\nexport function parseLNURLOrAddress(addressOrLNURL) {\n if (addressOrLNURL.includes(\"@\"))\n return parseLightningAddress(addressOrLNURL);\n else\n return decodeLNURL(addressOrLNURL);\n}\n/** Requests a bolt11 invoice from a LNURLp callback URL */\nexport async function getInvoice(callback) {\n const { pr: payRequest } = await fetch(callback).then((res) => res.json());\n const amount = callback.searchParams.get(\"amount\");\n if (!amount)\n throw new Error(\"Missing amount\");\n if (payRequest) {\n const parsed = parseBolt11(payRequest);\n if (parsed.amount !== parseInt(amount))\n throw new Error(\"Incorrect amount\");\n return payRequest;\n }\n else\n throw new Error(\"Failed to get invoice\");\n}\n","import { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\nimport { getAddressPointerFromATag } from \"applesauce-core/helpers/pointers\";\nimport { isSafeRelayURL } from \"applesauce-core/helpers/relays\";\nexport const Nip10ThreadRefsSymbol = Symbol.for(\"nip10-thread-refs\");\n/**\n * Gets an EventPointer form a NIP-10 threading \"e\" tag\n * @throws\n */\nexport function getEventPointerFromThreadTag(tag) {\n if (!tag[1])\n throw new Error(\"Missing event id in tag\");\n let pointer = { id: tag[1] };\n if (tag[2] && isSafeRelayURL(tag[2]))\n pointer.relays = [tag[2]];\n // get author from NIP-18 quote tags, nip-22 comments tags, or nip-10 thread tags\n if (tag[0] === \"e\" &&\n (tag[3] === \"root\" || tag[3] === \"reply\" || tag[3] === \"mention\") &&\n tag[4] &&\n tag[4].length === 64) {\n // NIP-10 \"e\" tag\n pointer.author = tag[4];\n }\n return pointer;\n}\n/** Parses NIP-10 tags and handles legacy behavior */\nexport function interpretThreadTags(tags) {\n const eTags = tags.filter((t) => t[0] === \"e\" && t[1]);\n const aTags = tags.filter((t) => t[0] === \"a\" && t[1]);\n // find the root and reply tags.\n let rootETag = eTags.find((t) => t[3] === \"root\");\n let replyETag = eTags.find((t) => t[3] === \"reply\");\n let rootATag = aTags.find((t) => t[3] === \"root\");\n let replyATag = aTags.find((t) => t[3] === \"reply\");\n if (!rootETag || !replyETag) {\n // a direct reply does not need a \"reply\" reference\n // https://github.com/nostr-protocol/nips/blob/master/10.md\n // this is not necessarily to spec. but if there is only one id (root or reply) then assign it to both\n // this handles the cases where a client only set a \"reply\" tag and no root\n rootETag = replyETag = rootETag || replyETag;\n }\n if (!rootATag || !replyATag) {\n rootATag = replyATag = rootATag || replyATag;\n }\n if (!rootETag && !replyETag) {\n // legacy behavior\n // https://github.com/nostr-protocol/nips/blob/master/10.md#positional-e-tags-deprecated\n const legacyETags = eTags.filter((t) => {\n // ignore it if there is a marker\n if (t[3])\n return false;\n return true;\n });\n if (legacyETags.length >= 1) {\n // first tag is the root\n rootETag = legacyETags[0];\n // last tag is reply\n replyETag = legacyETags[legacyETags.length - 1] ?? rootETag;\n }\n }\n return {\n root: rootETag || rootATag ? { e: rootETag, a: rootATag } : undefined,\n reply: replyETag || replyATag ? { e: replyETag, a: replyATag } : undefined,\n };\n}\n/** Returns the parsed NIP-10 tags for an event */\nexport function getNip10References(event) {\n return getOrComputeCachedValue(event, Nip10ThreadRefsSymbol, () => {\n const tags = interpretThreadTags(event.tags);\n let root;\n if (tags.root) {\n try {\n root = {\n e: tags.root.e && getEventPointerFromThreadTag(tags.root.e),\n a: tags.root.a && getAddressPointerFromATag(tags.root.a),\n };\n }\n catch (error) { }\n }\n let reply;\n if (tags.reply) {\n try {\n reply = {\n e: tags.reply.e && getEventPointerFromThreadTag(tags.reply.e),\n a: tags.reply.a && getAddressPointerFromATag(tags.reply.a),\n };\n }\n catch (error) { }\n }\n return {\n root,\n reply,\n };\n });\n}\n","import { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\nimport { kinds, notifyEventUpdate } from \"applesauce-core/helpers/event\";\nimport { getIndexableTags } from \"applesauce-core/helpers/filter\";\nimport { isETag, isPTag, isTTag } from \"applesauce-core/helpers/tags\";\nimport { getHiddenTags, isHiddenTagsUnlocked, unlockHiddenTags } from \"applesauce-core/helpers/hidden-tags\";\nimport { getNip10References } from \"./threading.js\";\n/** Validates that an event is a valid mute list */\nexport function isValidMuteList(event) {\n return event.kind === kinds.Mutelist;\n}\nexport const MutePublicSymbol = Symbol.for(\"mute-public\");\nexport const MuteHiddenSymbol = Symbol.for(\"mute-hidden\");\n/** Merges any number of mute sets */\nexport function mergeMutes(...mutes) {\n const mute = { pubkeys: new Set(), threads: new Set(), hashtags: new Set(), words: new Set() };\n for (const m of mutes) {\n for (const pubkey of m.pubkeys)\n mute.pubkeys.add(pubkey);\n for (const thread of m.threads)\n mute.threads.add(thread);\n for (const hashtag of m.hashtags)\n mute.hashtags.add(hashtag);\n for (const word of m.words)\n mute.words.add(word);\n }\n return mute;\n}\n/** Parses mute tags */\nexport function parseMutedTags(tags) {\n const pubkeys = new Set(tags.filter(isPTag).map((t) => t[1]));\n const threads = new Set(tags.filter(isETag).map((t) => t[1]));\n const hashtags = new Set(tags.filter(isTTag).map((t) => t[1].toLocaleLowerCase()));\n const words = new Set(tags.filter((t) => t[0] === \"word\" && t[1]).map((t) => t[1].toLocaleLowerCase()));\n return { pubkeys, threads, hashtags, words };\n}\n/** Returns muted things */\nexport function getMutedThings(mute) {\n const hidden = getHiddenMutedThings(mute);\n const mutes = getPublicMutedThings(mute);\n if (hidden)\n return mergeMutes(hidden, mutes);\n return mutes;\n}\n/** Returns only the public muted things from a mute event */\nexport function getPublicMutedThings(mute) {\n return getOrComputeCachedValue(mute, MutePublicSymbol, () => parseMutedTags(mute.tags));\n}\n/** Checks if the hidden mutes are unlocked */\nexport function isHiddenMutesUnlocked(mute) {\n // No need for try catch or proactivly parsing here since it only depends on hidden tags\n return MuteHiddenSymbol in mute || isHiddenTagsUnlocked(mute);\n}\nexport function getHiddenMutedThings(mute) {\n if (MuteHiddenSymbol in mute)\n return mute[MuteHiddenSymbol];\n // get hidden tags\n const tags = getHiddenTags(mute);\n if (!tags)\n return undefined;\n // parse muted tags\n const mutes = parseMutedTags(tags);\n // set cached value\n Reflect.set(mute, MuteHiddenSymbol, mutes);\n return mutes;\n}\n/** Unlocks the hidden mutes */\nexport async function unlockHiddenMutes(mute, signer) {\n if (MuteHiddenSymbol in mute)\n return mute[MuteHiddenSymbol];\n // Unlock hidden tags\n await unlockHiddenTags(mute, signer);\n // get hidden mutes\n const mutes = getHiddenMutedThings(mute);\n if (!mutes)\n throw new Error(\"Failed to unlock hidden mutes\");\n // Notify event store\n notifyEventUpdate(mute);\n return mutes;\n}\n/** Creates a RegExp for matching muted words */\nexport function createMutedWordsRegExp(mutedWords) {\n // Escape special characters and join with |\n const escapedWords = mutedWords.map((word) => word.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n // Create the RegExp with word boundaries and case insensitive flag\n return new RegExp(`\\\\b(${escapedWords.join(\"|\")})\\\\b`, \"gi\");\n}\n/** Returns true if the event matches the mutes */\nexport function matchMutes(mutes, event) {\n // Filter on muted pubkeys\n if (mutes.pubkeys.size > 0) {\n if (mutes.pubkeys.has(event.pubkey))\n return true;\n }\n // Filter on muted hashtags`\n if (mutes.hashtags.size > 0) {\n const tags = getIndexableTags(event);\n for (let tag of mutes.hashtags) {\n if (tags.has(\"t:\" + tag))\n return true;\n }\n }\n // Filter on muted threads\n if (mutes.threads.size > 0 && event.kind === kinds.ShortTextNote) {\n const refs = getNip10References(event);\n if (refs.root?.e && mutes.threads.has(refs.root.e.id))\n return true;\n }\n // Filter on muted words\n if (mutes.words.size > 0) {\n const regExp = createMutedWordsRegExp(Array.from(mutes.words));\n if (regExp.test(event.content))\n return true;\n }\n // Event does not match any mutes\n return false;\n}\n","import { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\nimport { getTagValue } from \"applesauce-core/helpers/event\";\n// NIP-88 Poll kinds\nexport const POLL_KIND = 1068;\nexport const POLL_RESPONSE_KIND = 1018;\n// Cache symbols\nexport const PollOptionsSymbol = Symbol.for(\"poll-options\");\n/**\n * Get the poll question/label from a poll event\n * Returns the content field which contains the poll question\n */\nexport function getPollQuestion(event) {\n return event.content;\n}\n/**\n * Get the poll options from a poll event\n * Returns array of options with id and label\n */\nexport function getPollOptions(event) {\n return getOrComputeCachedValue(event, PollOptionsSymbol, () => {\n return event.tags\n .filter((tag) => tag[0] === \"option\" && tag.length >= 3)\n .map((tag) => ({\n id: tag[1],\n label: tag[2],\n }));\n });\n}\n/**\n * Get the relays specified for poll responses (from 'relay' tags)\n * Returns undefined if no relays are specified\n */\nexport function getPollRelays(event) {\n return event.tags.filter((tag) => tag[0] === \"relay\" && tag.length >= 2).map((tag) => tag[1]);\n}\n/**\n * Get the poll type from a poll event (from 'polltype' tag)\n * Returns \"singlechoice\" or \"multiplechoice\", defaults to \"singlechoice\"\n */\nexport function getPollType(event) {\n const type = getTagValue(event, \"polltype\");\n return type === \"multiplechoice\" || type === \"singlechoice\" ? type : \"singlechoice\";\n}\n/**\n * Get the poll expiration timestamp (from 'endsAt' tag)\n * Returns undefined if no expiration is set\n */\nexport function getPollEndsAt(event) {\n const endsAt = getTagValue(event, \"endsAt\");\n return endsAt ? parseInt(endsAt, 10) : undefined;\n}\n/**\n * Get the poll ID that a response is referencing (from 'e' tag)\n * Returns undefined if no poll reference is found\n */\nexport function getPollResponsePollId(event) {\n return getTagValue(event, \"e\");\n}\n/** Get the selected option IDs from a poll response event (from 'response' tags) */\nexport function getPollResponseOptions(event) {\n return event.tags.filter((tag) => tag[0] === \"response\" && tag.length >= 2).map((tag) => tag[1]);\n}\n/**\n * Gets the options that a user has voted for in a poll event\n * Returns undefined if the response is not valid\n */\nexport function getPollResponseVotes(poll, response) {\n if (poll.id !== getPollResponsePollId(response))\n return;\n const pollOptions = getPollOptions(poll);\n const responseOptions = getPollResponseOptions(response);\n const votes = responseOptions.filter((opts) => pollOptions.some((option) => option.id === opts));\n const type = getPollType(poll);\n // If its a single choice poll, return the first vote\n if (type === \"singlechoice\")\n return votes.length === 1 ? [votes[0]] : undefined;\n return Array.from(new Set(votes));\n}\n","import { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\nimport { isETag, isNameValueTag, isPTag } from \"applesauce-core/helpers/tags\";\nexport const ParsedReportSymbol = Symbol(\"parsed-report\");\nexport var ReportReason;\n(function (ReportReason) {\n ReportReason[\"nudity\"] = \"nudity\";\n ReportReason[\"malware\"] = \"malware\";\n ReportReason[\"profanity\"] = \"profanity\";\n ReportReason[\"illegal\"] = \"illegal\";\n ReportReason[\"spam\"] = \"spam\";\n ReportReason[\"impersonation\"] = \"impersonation\";\n ReportReason[\"other\"] = \"other\";\n})(ReportReason || (ReportReason = {}));\n/** Reads a report event as either a user or event report */\nexport function getReported(report) {\n return getOrComputeCachedValue(report, ParsedReportSymbol, () => {\n const pTag = report.tags.find(isPTag);\n if (!pTag)\n return null;\n const comment = report.content ? report.content.trim() : undefined;\n const eTag = report.tags.find(isETag);\n // Event report\n if (eTag) {\n const blobs = report.tags.filter((t) => t[0] === \"x\" && t[1]).map((t) => t[1]);\n return {\n type: \"event\",\n event: report,\n comment,\n id: eTag[1],\n pubkey: pTag[1],\n reason: eTag[2],\n blobs,\n };\n }\n // User report\n return { type: \"user\", event: report, comment, pubkey: pTag[1], reason: pTag[2] };\n });\n}\n/** Gets the server tags from a report event (for blob reports) */\nexport function getReportServers(report) {\n return report.tags.filter((t) => isNameValueTag(t, \"server\") && t[1]).map((t) => t[1]);\n}\n","import { getOrComputeCachedValue, isEvent, safeParse, verifyWrappedEvent } from \"applesauce-core/helpers\";\nimport { getTagValue } from \"applesauce-core/helpers/event\";\nimport { getAddressPointerFromATag, getEventPointerFromETag, } from \"applesauce-core/helpers/pointers\";\nimport { isATag, isETag } from \"applesauce-core/helpers/tags\";\nimport { kinds } from \"applesauce-core/helpers/event\";\nexport const SharedEventSymbol = Symbol.for(\"shared-event\");\nexport const SharedEventPointerSymbol = Symbol.for(\"shared-event-pointer\");\nexport const SharedAddressPointerSymbol = Symbol.for(\"shared-address-pointer\");\nexport function getSharedEventPointer(event) {\n return getOrComputeCachedValue(event, SharedEventPointerSymbol, () => {\n const e = event.tags.find(isETag);\n if (!e)\n return undefined;\n // Get kind from k tag if it exists\n const kStr = getTagValue(event, \"k\");\n const k = kStr ? parseInt(kStr) : undefined;\n const pointer = getEventPointerFromETag(e);\n if (pointer && k !== undefined)\n pointer.kind = k;\n return pointer ?? undefined;\n });\n}\n/** Returns the address pointer of a kind 6 or 16 share event */\nexport function getSharedAddressPointer(event) {\n return getOrComputeCachedValue(event, SharedAddressPointerSymbol, () => {\n const a = event.tags.find(isATag);\n if (!a)\n return undefined;\n return getAddressPointerFromATag(a) ?? undefined;\n });\n}\n/** Returns the stringified event in the content of a kind 6 or 16 share event */\nexport function getEmbededSharedEvent(event) {\n return getOrComputeCachedValue(event, SharedEventSymbol, () => {\n const pointer = getSharedEventPointer(event);\n if (pointer === undefined || event.content === \"\")\n return undefined;\n const sharedEvent = safeParse(event.content);\n // Ensure event is a valid Nostr event\n if (!isEvent(sharedEvent))\n return undefined;\n // Ensure event id matches the pointer\n if (sharedEvent.id !== pointer.id)\n return undefined;\n // Ensure event is verified\n if (!verifyWrappedEvent(sharedEvent))\n return undefined;\n return sharedEvent;\n });\n}\n/** @deprecated use getEmbededSharedEvent instead */\nexport const parseSharedEvent = getEmbededSharedEvent;\n/** Validates that an event is a valid share event */\nexport function isValidShare(event) {\n if (!event)\n return false;\n return ((event.kind === kinds.Repost || event.kind === kinds.GenericRepost) && getSharedEventPointer(event) !== undefined);\n}\n","import { getTagValue } from \"applesauce-core/helpers/event\";\nimport { addRelayHintsToPointer, getEventPointerFromETag, getProfilePointerFromPTag, } from \"applesauce-core/helpers/pointers\";\nimport { mergeRelaySets } from \"applesauce-core/helpers/relays\";\nimport { isPTag, processTags } from \"applesauce-core/helpers/tags\";\nimport { unixNow } from \"applesauce-core/helpers/time\";\nexport function getStreamTitle(stream) {\n return getTagValue(stream, \"title\");\n}\nexport function getStreamSummary(stream) {\n return getTagValue(stream, \"summary\");\n}\nexport function getStreamImage(stream) {\n return getTagValue(stream, \"image\");\n}\nconst TWO_WEEKS = 60 * 60 * 24 * 14;\n/** Returns the status of the stream, defaults to ended if the stream is older than 2 weeks */\nexport function getStreamStatus(stream) {\n if (stream.created_at < unixNow() - TWO_WEEKS)\n return \"ended\";\n else\n return getTagValue(stream, \"status\") || \"ended\";\n}\n/** Returns the pubkey of the host of the stream */\nexport function getStreamHost(stream) {\n let host = undefined;\n for (const tag of stream.tags) {\n if (isPTag(tag) && (!host || (tag[3] && tag[3].toLowerCase() === \"host\"))) {\n host = getProfilePointerFromPTag(tag) ?? undefined;\n }\n }\n return host || { pubkey: stream.pubkey };\n}\n/** Returns the participants of a stream */\nexport function getStreamParticipants(stream) {\n return processTags(stream.tags, (t) => (isPTag(t) && t[3] ? t : undefined), (t) => {\n const pointer = getProfilePointerFromPTag(t);\n if (!pointer)\n return undefined;\n return { ...pointer, role: t[3].toLowerCase() };\n });\n}\nexport function getStreamGoalPointer(stream) {\n const goalTag = stream.tags.find((t) => t[0] === \"goal\");\n const pointer = goalTag ? getEventPointerFromETag(goalTag) : undefined;\n if (!pointer)\n return undefined;\n return addRelayHintsToPointer(pointer, getStreamRelays(stream));\n}\n/** Gets all the streaming urls for a stream */\nexport function getStreamStreamingURLs(stream) {\n return stream.tags.filter((t) => t[0] === \"streaming\").map((t) => t[1]);\n}\nexport function getStreamRecording(stream) {\n return getTagValue(stream, \"recording\");\n}\n/** Gets the relays for a stream */\nexport function getStreamRelays(stream) {\n for (const tag of stream.tags) {\n if (tag[0] === \"relays\")\n return mergeRelaySets(tag.slice(1));\n }\n return undefined;\n}\n/** Gets the stream start time if it has one */\nexport function getStreamStartTime(stream) {\n const str = getTagValue(stream, \"starts\");\n return str ? parseInt(str) : undefined;\n}\n/** Gets the stream end time if it has one */\nexport function getStreamEndTime(stream) {\n const str = getTagValue(stream, \"ends\");\n return str ? parseInt(str) : getStreamStatus(stream) === \"ended\" ? stream.created_at : undefined;\n}\n/** Returns the current number of participants in the stream */\nexport function getStreamViewers(stream) {\n const viewers = getTagValue(stream, \"current_participants\");\n return viewers ? parseInt(viewers) : undefined;\n}\n/** Returns the maximum number of participants in the stream */\nexport function getStreamMaxViewers(stream) {\n const viewers = getTagValue(stream, \"total_participants\");\n return viewers ? parseInt(viewers) : undefined;\n}\n/** Returns the hashtags for a stream */\nexport function getStreamHashtags(stream) {\n return stream.tags.filter((t) => t[0] === \"t\").map((t) => t[1]);\n}\n","import { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\nimport { getTagValue } from \"applesauce-core/helpers/event\";\nexport const TORRENT_KIND = 2003;\nconst TorrentInfoHashSymbol = Symbol.for(\"torrent-info-hash\");\nconst TorrentTitleSymbol = Symbol.for(\"torrent-title\");\nconst TorrentFilesSymbol = Symbol.for(\"torrent-files\");\nconst TorrentTrackersSymbol = Symbol.for(\"torrent-trackers\");\nconst TorrentCategorySymbol = Symbol.for(\"torrent-category\");\nconst TorrentSearchTagsSymbol = Symbol.for(\"torrent-search-tags\");\nconst TorrentCategoryPathSymbol = Symbol.for(\"torrent-category-path\");\nconst TorrentExternalIdentifiersSymbol = Symbol.for(\"torrent-external-identifiers\");\nconst TorrentMagnetLinkSymbol = Symbol.for(\"torrent-magnet-link\");\nexport function getTorrentInfoHash(torrent) {\n if (torrent.kind !== TORRENT_KIND)\n return undefined;\n return getOrComputeCachedValue(torrent, TorrentInfoHashSymbol, () => {\n return getTagValue(torrent, \"x\");\n });\n}\n/** Returns the torrent title from the `title` tag */\nexport function getTorrentTitle(torrent) {\n if (torrent.kind !== TORRENT_KIND)\n return undefined;\n return getOrComputeCachedValue(torrent, TorrentTitleSymbol, () => {\n return getTagValue(torrent, \"title\");\n });\n}\n/** Returns all file entries from `file` tags */\nexport function getTorrentFiles(torrent) {\n if (torrent.kind !== TORRENT_KIND)\n return [];\n return getOrComputeCachedValue(torrent, TorrentFilesSymbol, () => {\n const files = [];\n for (const tag of torrent.tags) {\n if (tag[0] === \"file\" && tag[1]) {\n const file = {\n name: tag[1],\n };\n // Optional size in bytes (tag[2])\n if (tag[2]) {\n const size = parseInt(tag[2], 10);\n if (!Number.isNaN(size)) {\n file.size = size;\n }\n }\n files.push(file);\n }\n }\n return files;\n });\n}\n/** Returns all tracker URLs from `tracker` tags */\nexport function getTorrentTrackers(torrent) {\n if (torrent.kind !== TORRENT_KIND)\n return [];\n return getOrComputeCachedValue(torrent, TorrentTrackersSymbol, () => {\n const trackers = [];\n for (const tag of torrent.tags) {\n if (tag[0] === \"tracker\" && tag[1])\n trackers.push(tag[1]);\n }\n return trackers;\n });\n}\n/** Returns the newznab category ID from the `i` tag with `newznab:` prefix */\nexport function getTorrentCategory(torrent) {\n if (torrent.kind !== TORRENT_KIND)\n return undefined;\n return getOrComputeCachedValue(torrent, TorrentCategorySymbol, () => {\n for (const tag of torrent.tags) {\n if (tag[0] === \"i\" && tag[1]?.startsWith(\"newznab:\")) {\n const categoryId = parseInt(tag[1].slice(8), 10); // Return the ID after \"newznab:\"\n if (!Number.isNaN(categoryId)) {\n return categoryId;\n }\n }\n }\n return undefined;\n });\n}\n/** Returns all search tags (for searchability) from `t` tags */\nexport function getTorrentSearchTags(torrent) {\n if (torrent.kind !== TORRENT_KIND)\n return [];\n return getOrComputeCachedValue(torrent, TorrentSearchTagsSymbol, () => {\n const tags = [];\n for (const tag of torrent.tags) {\n if (tag[0] === \"t\" && tag[1])\n tags.push(tag[1]);\n }\n return tags;\n });\n}\n/** Returns the category path from the `tcat` identifier in `i` tags (e.g., \"video,movie,4k\") */\nexport function getTorrentCategoryPath(torrent) {\n if (torrent.kind !== TORRENT_KIND)\n return undefined;\n return getOrComputeCachedValue(torrent, TorrentCategoryPathSymbol, () => {\n for (const tag of torrent.tags) {\n if (tag[0] === \"i\" && tag[1]?.startsWith(\"tcat:\")) {\n return tag[1].slice(5); // Return the path after \"tcat:\"\n }\n }\n return undefined;\n });\n}\n/**\n * Parses an external identifier from an `i` tag value\n * Supports prefixes: tmdb, ttvdb, imdb, mal, anilist\n * Supports second-level prefixes: tmdb:movie, ttvdb:movie, mal:anime, mal:manga\n * Note: tcat is excluded as it's handled separately via getTorrentCategoryPath\n * Note: newznab is excluded as it's handled separately via getTorrentCategory\n */\nfunction parseTorrentExternalIdentifier(value) {\n // Skip tcat - it's handled separately as a category path\n if (value.startsWith(\"tcat:\"))\n return null;\n // Skip newznab - it's handled separately as categories\n if (value.startsWith(\"newznab:\"))\n return null;\n // tmdb:movie:693134 or tmdb:693134\n if (value.startsWith(\"tmdb:\")) {\n const rest = value.slice(5);\n const parts = rest.split(\":\");\n if (parts.length === 2) {\n return {\n prefix: \"tmdb\",\n identifier: value,\n mediaType: parts[0],\n id: parts[1],\n };\n }\n else {\n return {\n prefix: \"tmdb\",\n identifier: value,\n id: rest,\n };\n }\n }\n // ttvdb:movie:290272 or ttvdb:290272\n if (value.startsWith(\"ttvdb:\")) {\n const rest = value.slice(6);\n const parts = rest.split(\":\");\n if (parts.length === 2) {\n return {\n prefix: \"ttvdb\",\n identifier: value,\n mediaType: parts[0],\n id: parts[1],\n };\n }\n else {\n return {\n prefix: \"ttvdb\",\n identifier: value,\n id: rest,\n };\n }\n }\n // imdb:tt15239678\n if (value.startsWith(\"imdb:\")) {\n return {\n prefix: \"imdb\",\n identifier: value,\n id: value.slice(5),\n };\n }\n // mal:anime:9253 or mal:manga:17517 or mal:9253\n if (value.startsWith(\"mal:\")) {\n const rest = value.slice(4);\n const parts = rest.split(\":\");\n if (parts.length === 2) {\n return {\n prefix: \"mal\",\n identifier: value,\n mediaType: parts[0],\n id: parts[1],\n };\n }\n else {\n return {\n prefix: \"mal\",\n identifier: value,\n id: rest,\n };\n }\n }\n // anilist:12345\n if (value.startsWith(\"anilist:\")) {\n return {\n prefix: \"anilist\",\n identifier: value,\n id: value.slice(8),\n };\n }\n return null;\n}\n/** Returns all external identifiers from `i` tags (excluding tcat and newznab, which are handled separately) */\nexport function getTorrentExternalIdentifiers(torrent) {\n if (torrent.kind !== TORRENT_KIND)\n return [];\n return getOrComputeCachedValue(torrent, TorrentExternalIdentifiersSymbol, () => {\n const identifiers = [];\n for (const tag of torrent.tags) {\n if (tag[0] === \"i\" && tag[1]) {\n const parsed = parseTorrentExternalIdentifier(tag[1]);\n if (parsed) {\n identifiers.push(parsed);\n }\n }\n }\n return identifiers;\n });\n}\n/**\n * Creates a TorrentExternalIdentifier object from prefix, id, and optional mediaType\n * Automatically constructs the full identifier string\n */\nexport function createTorrentExternalIdentifier(prefix, id, mediaType) {\n let identifier;\n // Build identifier string based on prefix and whether mediaType is provided\n if (mediaType) {\n // For prefixes that support mediaType: tmdb, ttvdb, mal\n identifier = `${prefix}:${mediaType}:${id}`;\n }\n else {\n // Simple format: prefix:id\n identifier = `${prefix}:${id}`;\n }\n return {\n prefix,\n identifier,\n mediaType,\n id,\n };\n}\n/**\n * Builds a magnet link from an info hash, optional trackers, and optional name\n * Format: magnet:?xt=urn:btih:${infoHash}${trackers ? '&tr=' + trackers.join('&tr=') : ''}${name ? '&dn=' + encodeURIComponent(name) : ''}\n */\nexport function buildTorrentMagnetLink(infoHash, trackers, name) {\n const parts = [`magnet:?xt=urn:btih:${infoHash}`];\n if (trackers && trackers.length > 0) {\n for (const tracker of trackers) {\n parts.push(`&tr=${encodeURIComponent(tracker)}`);\n }\n }\n if (name) {\n parts.push(`&dn=${encodeURIComponent(name)}`);\n }\n return parts.join(\"\");\n}\n/** Returns the magnet link for a torrent, building it from the event if needed */\nexport function getTorrentMagnetLink(torrent) {\n if (torrent.kind !== TORRENT_KIND)\n return undefined;\n return getOrComputeCachedValue(torrent, TorrentMagnetLinkSymbol, () => {\n const infoHash = getTorrentInfoHash(torrent);\n if (!infoHash)\n return undefined;\n const trackers = getTorrentTrackers(torrent);\n const title = getTorrentTitle(torrent);\n return buildTorrentMagnetLink(infoHash, trackers.length > 0 ? trackers : undefined, title);\n });\n}\n/** Validates that an event is a valid torrent event (kind 2003 with required `x` tag) */\nexport function isValidTorrent(torrent) {\n return torrent.kind === TORRENT_KIND && getTorrentInfoHash(torrent) !== undefined;\n}\n","import { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\nimport { getAddressPointerFromATag, getEventPointerFromETag, getProfilePointerFromPTag, } from \"applesauce-core/helpers/pointers\";\nexport const UserStatusPointerSymbol = Symbol.for(\"user-status-pointer\");\nfunction getStatusPointer(status) {\n const pTag = status.tags.find((t) => t[0] === \"p\" && t[1]);\n if (pTag) {\n const pointer = getProfilePointerFromPTag(pTag);\n if (pointer)\n return { type: \"nprofile\", data: pointer };\n }\n const eTag = status.tags.find((t) => t[0] === \"e\" && t[1]);\n if (eTag) {\n const pointer = getEventPointerFromETag(eTag);\n if (pointer)\n return { type: \"nevent\", data: pointer };\n }\n const aTag = status.tags.find((t) => t[0] === \"a\" && t[1]);\n if (aTag) {\n const pointer = getAddressPointerFromATag(aTag);\n if (pointer)\n return { type: \"naddr\", data: pointer };\n }\n const rTag = status.tags.find((t) => t[0] === \"r\" && t[1]);\n if (rTag)\n return { type: \"url\", data: rTag[1] };\n return null;\n}\n/** Gets the {@link UserStatusPointer} for a status event */\nexport function getUserStatusPointer(status) {\n return getOrComputeCachedValue(status, UserStatusPointerSymbol, () => getStatusPointer(status));\n}\n","import { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\nimport { isEvent, verifyWrappedEvent } from \"applesauce-core/helpers/event\";\nimport { getTagValue } from \"applesauce-core/helpers/event\";\nimport { getAddressPointerFromATag, getEventPointerFromETag } from \"applesauce-core/helpers/pointers\";\nimport { isATag, isETag } from \"applesauce-core/helpers/tags\";\nimport { kinds } from \"applesauce-core/helpers/event\";\nimport { parseBolt11 } from \"./bolt11.js\";\nexport const ZapRequestSymbol = Symbol.for(\"zap-request\");\nexport const ZapSenderSymbol = Symbol.for(\"zap-sender\");\nexport const ZapReceiverSymbol = Symbol.for(\"zap-receiver\");\nexport const ZapInvoiceSymbol = Symbol.for(\"zap-bolt11\");\nexport const ZapEventPointerSymbol = Symbol.for(\"zap-event-pointer\");\nexport const ZapAddressPointerSymbol = Symbol.for(\"zap-address-pointer\");\nexport function getZapSender(zap) {\n return getOrComputeCachedValue(zap, ZapSenderSymbol, () => {\n return getTagValue(zap, \"P\") || getZapRequest(zap)?.pubkey;\n });\n}\nexport function getZapRecipient(zap) {\n return getOrComputeCachedValue(zap, ZapReceiverSymbol, () => {\n return getTagValue(zap, \"p\");\n });\n}\nexport function getZapPayment(zap) {\n return getOrComputeCachedValue(zap, ZapInvoiceSymbol, () => {\n const bolt11 = getTagValue(zap, \"bolt11\");\n try {\n // Catch errors with parsing the bolt11 invoice\n return bolt11 ? parseBolt11(bolt11) : undefined;\n }\n catch (error) {\n return undefined;\n }\n });\n}\nexport function getZapAmount(zap) {\n return getZapPayment(zap)?.amount;\n}\n/** Gets the AddressPointer that was zapped */\nexport function getZapAddressPointer(zap) {\n return getOrComputeCachedValue(zap, ZapAddressPointerSymbol, () => {\n const a = zap.tags.find(isATag);\n return a ? getAddressPointerFromATag(a) : null;\n });\n}\n/** Gets the EventPointer that was zapped */\nexport function getZapEventPointer(zap) {\n return getOrComputeCachedValue(zap, ZapEventPointerSymbol, () => {\n const e = zap.tags.find(isETag);\n return e ? getEventPointerFromETag(e) : null;\n });\n}\n/** Gets the preimage for the bolt11 invoice */\nexport function getZapPreimage(zap) {\n return getTagValue(zap, \"preimage\");\n}\nexport function getZapRequest(zap) {\n return getOrComputeCachedValue(zap, ZapRequestSymbol, () => {\n const description = getTagValue(zap, \"description\");\n if (!description)\n return;\n // Attempt to parse the zap request\n try {\n // Copied from nostr-tools/nip57 and modified to use the internal verifyZap method and return the zap request event\n let zapRequest;\n try {\n zapRequest = JSON.parse(description);\n }\n catch (err) {\n throw new Error(\"Invalid zap request JSON.\");\n }\n if (!isEvent(zapRequest))\n throw new Error(\"Zap request is not a valid Nostr event.\");\n if (!verifyWrappedEvent(zapRequest))\n throw new Error(\"Invalid signature on zap request.\");\n let p = zapRequest.tags.find(([t, v]) => t === \"p\" && v);\n if (!p)\n throw new Error(\"Zap request doesn't have a 'p' tag.\");\n if (!p[1].match(/^[a-f0-9]{64}$/))\n throw new Error(\"Zap request 'p' tag is not valid hex.\");\n let e = zapRequest.tags.find(([t, v]) => t === \"e\" && v);\n if (e && !e[1].match(/^[a-f0-9]{64}$/))\n throw new Error(\"Zap request 'e' tag is not valid hex.\");\n let relays = zapRequest.tags.find(([t, v]) => t === \"relays\" && v);\n if (!relays)\n throw new Error(\"Zap request doesn't have a 'relays' tag.\");\n return zapRequest;\n }\n catch (error) {\n return undefined;\n }\n });\n}\n/**\n * Checks if a zap event is valid (not missing fields)\n * DOES NOT validate LNURL address\n */\nexport function isValidZap(zap) {\n if (!zap)\n return false;\n if (zap.kind !== kinds.Zap)\n return false;\n // Is not a valid zap kind if any of these is undefined\n if (getZapPayment(zap) === undefined)\n return false;\n if (getZapRequest(zap) === undefined)\n return false;\n if (getZapRecipient(zap) === undefined)\n return false;\n if (getZapSender(zap) === undefined)\n return false;\n return true;\n}\n/** Returns the zap splits for an event */\nexport function getZapSplits(event) {\n const tags = event.tags.filter((t) => t[0] === \"zap\" && t[1] && t[3]);\n if (tags.length > 0) {\n const targets = tags\n .map((t) => ({ pubkey: t[1], relay: t[2], weight: parseFloat(t[3]) }))\n .filter((p) => Number.isFinite(p.weight));\n const total = targets.reduce((v, p) => v + p.weight, 0);\n return targets.map((p) => ({ ...p, percent: p.weight / total }));\n }\n return undefined;\n}\n","import { relaySet } from \"applesauce-core/helpers\";\nimport { getOrComputeCachedValue } from \"applesauce-core/helpers/cache\";\nimport { getTagValue } from \"applesauce-core/helpers/event\";\nimport { getZapAmount, getZapSplits, isValidZap } from \"./zap.js\";\n// NIP-75 Zap Goal kind\nexport const ZAP_GOAL_KIND = 9041;\n// Cache symbols\nexport const ZapGoalAmountSymbol = Symbol.for(\"zap-goal-amount\");\nexport const ZapGoalRelaysSymbol = Symbol.for(\"zap-goal-relays\");\nexport const ZapGoalProgressSymbol = Symbol.for(\"zap-goal-progress\");\n/**\n * Get the target amount in milisats from a zap goal event\n * Returns undefined if the amount tag is missing or invalid\n */\nexport function getZapGoalAmount(event) {\n return getOrComputeCachedValue(event, ZapGoalAmountSymbol, () => {\n const amount = getTagValue(event, \"amount\");\n if (!amount)\n return undefined;\n const parsed = parseInt(amount, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n });\n}\n/**\n * Get the relay URLs from a zap goal event\n * Returns empty array if no relays tag is found\n */\nexport function getZapGoalRelays(event) {\n return getOrComputeCachedValue(event, ZapGoalRelaysSymbol, () => {\n return relaySet(event.tags.find((tag) => tag[0] === \"relays\")?.slice(1));\n });\n}\n/**\n * Get the closed_at timestamp from a zap goal event\n * Returns undefined if no closed_at tag is found\n */\nexport function getZapGoalClosedAt(event) {\n const closedAt = getTagValue(event, \"closed_at\");\n return closedAt ? parseInt(closedAt, 10) : undefined;\n}\n/**\n * Get the image URL from a zap goal event\n * Returns undefined if no image tag is found\n */\nexport function getZapGoalImage(event) {\n return getTagValue(event, \"image\");\n}\n/**\n * Get the summary from a zap goal event\n * Returns undefined if no summary tag is found\n */\nexport function getZapGoalSummary(event) {\n return getTagValue(event, \"summary\");\n}\n/**\n * Get the beneficiaries from a zap goal event\n * Returns undefined if no zap tags are found\n * Uses the existing getZapSplits helper\n */\nexport function getZapGoalBeneficiaries(event) {\n return getZapSplits(event);\n}\n/**\n * Get the goal tag from an event (for linking events to goals)\n * Returns undefined if no goal tag is found\n */\nexport function getGoalTag(event) {\n const goalTag = event.tags.find((tag) => tag[0] === \"goal\" && tag[1]);\n if (!goalTag)\n return undefined;\n return {\n goalId: goalTag[1],\n relay: goalTag[2],\n };\n}\n/**\n * Checks if a zap goal event is valid (has required tags)\n * Acts as a type guard that casts to ZapGoalEvent\n */\nexport function isValidZapGoal(event) {\n if (!event)\n return false;\n if (event.kind !== ZAP_GOAL_KIND)\n return false;\n // Required tags\n if (getZapGoalAmount(event) === undefined)\n return false;\n if (getZapGoalRelays(event).length === 0)\n return false;\n return true;\n}\n/**\n * Calculates progress for a zap goal from zap events\n * Filters zaps by the goal's relay list and closed_at timestamp\n * Returns undefined if target amount is invalid\n */\nexport function getZapGoalProgress(goal, zaps) {\n const target = getZapGoalAmount(goal);\n if (target === undefined)\n return undefined;\n const closedAt = getZapGoalClosedAt(goal);\n // Filter zaps that are valid and match the goal's criteria\n const validZaps = zaps.filter((zap) => {\n if (!isValidZap(zap))\n return false;\n // Check if zap was published before closed_at (if set)\n if (closedAt !== undefined && zap.created_at >= closedAt)\n return false;\n // Check if zap request has relays that match goal relays\n // This is a simplified check - in practice, you'd want to check the zap request's relays tag\n // For now, we'll accept all valid zaps and let the relay filtering happen at the relay level\n return true;\n });\n // Sum all zap amounts\n const total = validZaps.reduce((sum, zap) => {\n const amount = getZapAmount(zap);\n return sum + (amount ?? 0);\n }, 0);\n const percentage = target > 0 ? (total / target) * 100 : 0;\n const remaining = Math.max(0, target - total);\n return {\n total,\n target,\n percentage,\n remaining,\n };\n}\n","/**\n * MIP-04 chat media encryption helpers.\n *\n * Provides per-file key derivation from the MLS epoch's exporter secret and\n * ChaCha20-Poly1305 AEAD encryption/decryption for media files shared in\n * Marmot group messages via `imeta` tags.\n *\n * No HTTP client is included. Callers are responsible for uploading encrypted\n * blobs to Blossom (or any content-addressed store) and building/parsing\n * `imeta` tags using applesauce helpers such as `createImetaTagForAttachment`\n * and `getFileMetadataFromImetaTag`.\n *\n * For group avatar image encryption see {@link ./group-image.js}.\n */\nimport { chacha20poly1305 } from \"@noble/ciphers/chacha.js\";\nimport { equalBytes } from \"@noble/ciphers/utils.js\";\nimport { expand as hkdf_expand } from \"@noble/hashes/hkdf.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { bytesToHex, concatBytes, hexToBytes, randomBytes, } from \"@noble/hashes/utils.js\";\nimport { mlsExporter } from \"ts-mls\";\nimport { getFileMetadata, getFileMetadataFromImetaTag, } from \"applesauce-common/helpers\";\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\nconst enc = new TextEncoder();\n/** Scheme label used in all MIP-04 v2 cryptographic contexts. */\nconst MIP04_V2_SCHEME = enc.encode(\"mip04-v2\");\n/** MLS exporter label and context used to obtain the base exporter secret. */\nconst MLS_EXPORTER_LABEL = \"marmot\";\nconst MLS_EXPORTER_CONTEXT = enc.encode(\"encrypted-media\");\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n/** The version string written to the `v` field of MIP-04 imeta tags. */\nexport const MIP04_VERSION = \"mip04-v2\";\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n/**\n * Canonicalizes a MIME type for use in cryptographic operations (MIP-04).\n *\n * Rules (per MIP-04):\n * - Convert to lowercase\n * - Trim leading/trailing whitespace\n * - Strip parameters (everything after the first `;`)\n *\n * @param mimeType - The raw MIME type string\n * @returns The canonical MIME type\n */\nexport function canonicalizeMimeType(mimeType) {\n return mimeType.split(\";\")[0].trim().toLowerCase();\n}\n/**\n * Builds the ChaCha20-Poly1305 AAD for MIP-04 v2 from a {@link MediaAttachment}.\n *\n * @internal\n */\nfunction buildMip04Aad(attachment) {\n const fileHashBytes = hexToBytes(attachment.sha256);\n const canonicalMime = enc.encode(canonicalizeMimeType(attachment.type));\n const filenameBytes = enc.encode(attachment.filename);\n const sep = new Uint8Array([0x00]);\n // aad = \"mip04-v2\" || 0x00 || file_hash_bytes || 0x00 || mime_type_bytes || 0x00 || filename_bytes\n return concatBytes(MIP04_V2_SCHEME, sep, fileHashBytes, sep, canonicalMime, sep, filenameBytes);\n}\n// ---------------------------------------------------------------------------\n// Functions\n// ---------------------------------------------------------------------------\n/**\n * Derives the per-file encryption key for a media file shared in a group\n * message (MIP-04 v2).\n *\n * Key derivation:\n * ```\n * exporter_secret = MLS-Exporter(\"marmot\", \"encrypted-media\", 32)\n * context = \"mip04-v2\" || 0x00 || file_hash_bytes || 0x00 ||\n * mime_type_bytes || 0x00 || filename_bytes || 0x00 || \"key\"\n * file_key = HKDF-Expand(exporter_secret, context, 32)\n * ```\n *\n * The key is deterministic for a given epoch + file, so re-encrypting the\n * same file in the same epoch produces the same key but a different\n * ciphertext (due to the random nonce).\n *\n * The `sha256`, `type`, and `filename` fields of the attachment must be set.\n * The MIME type is canonicalized automatically.\n *\n * @param clientState - The current MLS `ClientState` for the group\n * @param ciphersuite - The ciphersuite implementation used by the group\n * @param attachment - The attachment containing `sha256`, `type`, and `filename`\n * @returns 32-byte ChaCha20-Poly1305 encryption key\n */\nexport async function deriveMediaEncryptionKey(clientState, ciphersuite, attachment) {\n if (!attachment.sha256)\n throw new Error(\"attachment.sha256 is required\");\n if (!attachment.type)\n throw new Error(\"attachment.type is required\");\n const exporterSecret = await mlsExporter(clientState.keySchedule.exporterSecret, MLS_EXPORTER_LABEL, MLS_EXPORTER_CONTEXT, 32, ciphersuite);\n const fileHashBytes = hexToBytes(attachment.sha256);\n const canonicalMime = enc.encode(canonicalizeMimeType(attachment.type));\n const filenameBytes = enc.encode(attachment.filename);\n const sep = new Uint8Array([0x00]);\n const context = concatBytes(MIP04_V2_SCHEME, sep, fileHashBytes, sep, canonicalMime, sep, filenameBytes, sep, enc.encode(\"key\"));\n return hkdf_expand(sha256, exporterSecret, context, 32);\n}\n/**\n * Encrypts a media file for sharing in a Marmot group message (MIP-04 v2).\n *\n * Uses ChaCha20-Poly1305 AEAD with a randomly generated nonce. The\n * associated data (AAD) binds the scheme version, file hash, MIME type, and\n * filename to prevent metadata tampering.\n *\n * Typical usage:\n * ```ts\n * import { sha256 } from \"@noble/hashes/sha2\";\n * import { bytesToHex } from \"@noble/hashes/utils\";\n * import { createImetaTagForAttachment } from \"applesauce-common/helpers\";\n *\n * const attachment: Mip04MediaAttachment = {\n * sha256: bytesToHex(sha256(fileBytes)),\n * type: \"image/jpeg\",\n * filename: \"photo.jpg\",\n * nonce: \"\", // filled by encryptMediaFile\n * version: MIP04_VERSION,\n * };\n * const fileKey = await deriveMip04FileKey(clientState, ciphersuite, attachment);\n * const { encrypted, attachment: filled } = encryptMediaFile(fileBytes, fileKey, attachment);\n * // Upload `encrypted` to Blossom, then:\n * const imetaTag = createImetaTagForAttachment({ ...filled, url: blossomUrl });\n * ```\n *\n * @param file - The plaintext file bytes to encrypt\n * @param fileKey - 32-byte key from {@link deriveMediaEncryptionKey}\n * @param attachment - Attachment metadata; must have `sha256`, `type`, and `filename` set\n * @returns Encrypted blob and a fully populated {@link MediaAttachment}\n */\nexport function encryptMediaFile(file, fileKey, attachment) {\n if (!attachment.sha256)\n throw new Error(\"attachment.sha256 is required\");\n if (!attachment.type)\n throw new Error(\"attachment.type is required\");\n const full = {\n ...attachment,\n filename: attachment.filename,\n type: canonicalizeMimeType(attachment.type),\n sha256: attachment.sha256,\n nonce: \"\", // filled below\n version: MIP04_VERSION,\n };\n const nonce = randomBytes(12);\n full.nonce = bytesToHex(nonce);\n const aad = buildMip04Aad(full);\n const encrypted = chacha20poly1305(fileKey, nonce, aad).encrypt(file);\n return { encrypted, attachment: full };\n}\n/**\n * Decrypts a media file received in a Marmot group message (MIP-04 v2).\n *\n * Verifies the ChaCha20-Poly1305 authentication tag and then confirms the\n * SHA-256 of the decrypted content matches the `sha256` field from the\n * attachment, as required by MIP-04.\n *\n * The `sha256`, `type`, `filename`, and `nonce` fields must all be present.\n * Parse these from the `imeta` tag using `getFileMetadataFromImetaTag` from\n * applesauce, then cast/extend to {@link MediaAttachment}.\n *\n * @param encrypted - The encrypted blob downloaded from Blossom\n * @param fileKey - 32-byte key from {@link deriveMediaEncryptionKey}\n * @param attachment - The MIP-04 attachment from the group message's `imeta` tag\n * @returns The decrypted file bytes\n * @throws If AEAD authentication fails, required fields are missing, or the\n * decrypted content hash does not match `attachment.sha256`\n */\nexport function decryptMediaFile(encrypted, fileKey, attachment) {\n if (!attachment.sha256)\n throw new Error(\"attachment.sha256 is required\");\n if (!attachment.type)\n throw new Error(\"attachment.type is required\");\n if (!attachment.nonce)\n throw new Error(\"attachment.nonce is required\");\n const nonce = hexToBytes(attachment.nonce);\n if (nonce.length !== 12) {\n throw new Error(`attachment.nonce must be 24 hex characters (12 bytes), got ${attachment.nonce.length} characters`);\n }\n const aad = buildMip04Aad(attachment);\n const decrypted = chacha20poly1305(fileKey, nonce, aad).decrypt(encrypted);\n // MIP-04 §Integrity Verification: SHA256(decrypted_content) MUST equal sha256 field\n if (!equalBytes(sha256(decrypted), hexToBytes(attachment.sha256))) {\n throw new Error(\"MIP-04 integrity check failed: decrypted content hash does not match expected hash\");\n }\n return decrypted;\n}\n/**\n * Returns `true` iff `value` is a non-empty MIME type string of the form\n * `type/subtype` (parameters are allowed but the bare type/subtype part must\n * be present and non-empty on both sides of the `/`).\n *\n * @internal\n */\nfunction isValidMimeType(value) {\n const bare = value.split(\";\")[0].trim();\n const slash = bare.indexOf(\"/\");\n return slash > 0 && slash < bare.length - 1;\n}\n/**\n * Returns true iff `value` is valid hex with the expected encoded byte length.\n *\n * @internal\n */\nfunction isValidHex(value, expectedBytes) {\n return value.length === expectedBytes * 2 && /^[0-9a-f]+$/i.test(value);\n}\n// ---------------------------------------------------------------------------\n// Internal imeta parser\n// ---------------------------------------------------------------------------\n/**\n * Splits the space-separated entries of an `imeta` tag into a key→value map.\n *\n * Each entry after the leading `\"imeta\"` element has the form `\"key value\"`.\n * applesauce uses the same approach internally; we replicate it here to\n * extract MIP-04-specific fields (`filename`, `n`, `v`) that applesauce does\n * not know about and therefore silently drops from its returned\n * {@link FileMetadata} object.\n *\n * @internal\n */\nfunction parseRawImetaEntries(tag) {\n const map = new Map();\n for (const part of tag.slice(1)) {\n const match = part.match(/^(.+?)\\s(.+)$/);\n if (match)\n map.set(match[1], match[2]);\n }\n return map;\n}\n/**\n * Parses an `imeta` tag array into a {@link MediaAttachment}.\n *\n * The MIP-04-specific fields (`filename`, `n`, `v`) are read directly from\n * the raw tag entries because applesauce's {@link getFileMetadataFromImetaTag}\n * only copies known NIP-92 fields and silently drops unknown keys. Standard\n * NIP-92 fields (`url`, `type`/`m`, `sha256`/`x`, `size`, `dimensions`/`dim`,\n * `blurhash`, `thumbnail`/`thumb`, `alt`, etc.) are delegated to applesauce.\n *\n * Returns `null` if:\n * - The tag is not a valid `imeta` tag (first element is not `\"imeta\"`)\n * - The `v` field is absent or does not match {@link MIP04_VERSION}\n * - The `n` (nonce) field is absent or is not exactly 24 characters (hex-encoded 12-byte nonce)\n * - The `filename` field is absent or empty\n * - The `x` (sha256) field is absent or is not exactly 64 characters (hex-encoded 32-byte hash)\n * - The `m` (MIME type) field is absent or is not a valid `type/subtype` string\n *\n * Per the MIP-04 spec, clients MUST reject deprecated `mip04-v1` tags.\n *\n * @param tag - A raw `imeta` tag array from a Nostr event (e.g. `rumor.tags`)\n * @returns A fully-typed {@link MediaAttachment}, or `null` if the tag is\n * not a valid MIP-04 v2 attachment\n */\nexport function parseMediaImetaTag(tag) {\n if (tag[0] !== \"imeta\")\n return null;\n // Parse raw entries to read MIP-04 fields that applesauce strips.\n const raw = parseRawImetaEntries(tag);\n const version = raw.get(\"v\");\n const nonce = raw.get(\"n\");\n const filename = raw.get(\"filename\");\n if (version !== MIP04_VERSION)\n return null;\n if (!nonce || !isValidHex(nonce, 12))\n return null;\n if (!filename || filename.length === 0)\n return null;\n // Delegate standard NIP-92 field parsing to applesauce.\n const base = getFileMetadataFromImetaTag(tag);\n if (!base.sha256 || !isValidHex(base.sha256, 32))\n return null;\n // m must be a valid MIME type\n if (!base.type || !isValidMimeType(base.type))\n return null;\n return {\n ...base,\n sha256: base.sha256,\n type: base.type,\n filename,\n nonce,\n version: MIP04_VERSION,\n };\n}\n/**\n * Extracts all valid MIP-04 v2 attachments from a tag list.\n *\n * Non-`imeta` tags and `imeta` tags that fail MIP-04 validation (wrong or\n * absent `v` field, missing `n`/`filename`) are silently skipped.\n *\n * @param tags - The `tags` array from a Nostr event or rumor\n * @returns Array of valid {@link MediaAttachment} objects (may be empty)\n */\nexport function getMediaAttachments(tags) {\n return tags\n .filter((t) => t[0] === \"imeta\")\n .map(parseMediaImetaTag)\n .filter((a) => a !== null);\n}\n/**\n * Extracts a MIP-04 v2 attachment from a NIP-94 kind 1063 file-metadata event.\n *\n * Kind 1063 events use flat tags (`url`, `m`, `x`, `filename`, `n`, `v`, …)\n * rather than the space-separated `imeta` format. Standard NIP-94 fields are\n * parsed by applesauce's {@link getFileMetadata}; the MIP-04-specific fields\n * (`filename`, `n`, `v`) are read directly from the flat tag list.\n *\n * Returns `null` if:\n * - The `v` tag is absent or does not match {@link MIP04_VERSION}\n * - The `n` (nonce) tag is absent or is not exactly 24 characters (hex-encoded 12-byte nonce)\n * - The `filename` tag is absent or empty\n * - The `x` (sha256) tag is absent or is not exactly 64 characters (hex-encoded 32-byte hash)\n * - The `m` (MIME type) tag is absent or is not a valid `type/subtype` string\n *\n * @param event - A kind 1063 Nostr event\n * @returns A fully-typed {@link MediaAttachment}, or `null` if the event\n * does not carry a valid MIP-04 v2 attachment\n */\nexport function getMediaAttachmentFromFileEvent(event) {\n /** Helper: return the value of the first tag with the given name, or undefined. */\n const getTag = (name) => event.tags.find((t) => t[0] === name)?.[1];\n const version = getTag(\"v\");\n const nonce = getTag(\"n\");\n const filename = getTag(\"filename\");\n if (version !== MIP04_VERSION)\n return null;\n if (!nonce || !isValidHex(nonce, 12))\n return null;\n if (!filename || filename.length === 0)\n return null;\n // Delegate standard NIP-94 tag parsing to applesauce.\n const base = getFileMetadata(event);\n if (!base.sha256 || !isValidHex(base.sha256, 32))\n return null;\n // m must be a valid MIME type\n if (!base.type || !isValidMimeType(base.type))\n return null;\n return {\n ...base,\n sha256: base.sha256,\n type: base.type,\n filename,\n nonce,\n version: MIP04_VERSION,\n };\n}\n//# sourceMappingURL=media.js.map","import { isEvent } from \"applesauce-core/helpers/event\";\nimport { defaultProposalTypes } from \"ts-mls\";\nimport { getKeyPackage } from \"../../../core/key-package-event.js\";\n/** Builds a proposal to invite a user to the group from a key package event or raw key package */\nexport function proposeInviteUser(keyPackageEvent) {\n return async () => {\n const keyPackage = isEvent(keyPackageEvent)\n ? getKeyPackage(keyPackageEvent)\n : keyPackageEvent;\n return {\n proposalType: defaultProposalTypes.add,\n add: { keyPackage },\n };\n };\n}\n//# sourceMappingURL=invite-user.js.map","import { defaultCredentialTypes, getGroupMembers as getMlsGroupMembers, nodeTypes, } from \"ts-mls\";\nimport { getCredentialPubkey, isSameCredential } from \"./credential.js\";\nfunction nodeToLeafIndex(nodeIndex) {\n // This matches ts-mls treemath: nodeToLeafIndex(nodeIndex) = nodeIndex / 2\n // for leaf positions in the ratchet tree.\n return Math.floor(nodeIndex / 2);\n}\n/** Gets all the nostr pubkey keys in a group */\nexport function getGroupMembers(state) {\n const pubkeys = new Set();\n for (const leaf of getMlsGroupMembers(state)) {\n if (leaf.credential.credentialType === defaultCredentialTypes.basic) {\n pubkeys.add(getCredentialPubkey(leaf.credential));\n }\n }\n return Array.from(pubkeys);\n}\n/** Gets all leaf nodes for a given nostr pubkey in a group */\nexport function getPubkeyLeafNodes(state, pubkey) {\n return state.ratchetTree\n .filter((node) => node?.nodeType === nodeTypes.leaf)\n .filter((node) => node.leaf.credential.credentialType === defaultCredentialTypes.basic &&\n getCredentialPubkey(node.leaf.credential) === pubkey)\n .map((node) => node.leaf);\n}\n/**\n * Gets all leaf node indexes for a given nostr pubkey in a group.\n *\n * @param state - The ClientState to search\n * @param pubkey - The nostr pubkey to find\n * @returns Array of leaf node indexes (numbers) for the given pubkey\n */\nexport function getPubkeyLeafNodeIndexes(state, pubkey) {\n const leafIndexes = [];\n for (let nodeIndex = 0; nodeIndex < state.ratchetTree.length; nodeIndex++) {\n const node = state.ratchetTree[nodeIndex];\n if (node &&\n node.nodeType === nodeTypes.leaf &&\n node.leaf.credential.credentialType === defaultCredentialTypes.basic) {\n if (getCredentialPubkey(node.leaf.credential) === pubkey)\n leafIndexes.push(Number(nodeToLeafIndex(nodeIndex)));\n }\n }\n return leafIndexes;\n}\n/**\n * Gets all leaf node indexes for a given credential in a group.\n *\n * @param state - The ClientState to search\n * @param credential - The credential to find\n * @returns Array of leaf node indexes (numbers) for the given credential\n */\nexport function getCredentialLeafNodeIndexes(state, credential) {\n const leafIndexes = [];\n for (let nodeIndex = 0; nodeIndex < state.ratchetTree.length; nodeIndex++) {\n const node = state.ratchetTree[nodeIndex];\n if (node && node.nodeType === nodeTypes.leaf) {\n if (isSameCredential(node.leaf.credential, credential))\n leafIndexes.push(Number(nodeToLeafIndex(nodeIndex)));\n }\n }\n return leafIndexes;\n}\n//# sourceMappingURL=group-members.js.map","import { defaultProposalTypes } from \"ts-mls\";\nimport { getPubkeyLeafNodeIndexes } from \"../../../core/group-members.js\";\n/**\n * Proposes removing all leaf nodes belonging to the given pubkey from the\n * group. Intended for self-removal (leaving), where the caller passes their\n * own public key.\n *\n * Per RFC 9420 §12.4 a member cannot *commit* a Remove targeting their own\n * leaf — the resulting proposals must be committed by another member (e.g.\n * an admin calling {@link MarmotGroup.commit}).\n *\n * @param pubkey - The Nostr public key (hex string) of the member leaving.\n * @returns A {@link ProposalAction} that yields one {@link ProposalRemove}\n * per leaf node found for the given pubkey.\n */\nexport function proposeLeaveGroup(pubkey) {\n return async ({ state }) => {\n const leafIndexes = getPubkeyLeafNodeIndexes(state, pubkey);\n if (leafIndexes.length === 0)\n throw new Error(`Could not find own leaf node in the ratchet tree.`);\n return leafIndexes.map((leafIndex) => ({\n proposalType: defaultProposalTypes.remove,\n remove: { removed: leafIndex },\n }));\n };\n}\n//# sourceMappingURL=leave-group.js.map","import { bytesToHex, getEventHash, } from \"applesauce-core/helpers/event\";\nimport { EventEmitter } from \"eventemitter3\";\nimport { acceptAll, contentTypes, createApplicationMessage, createCommit, createProposal, defaultCryptoProvider, defaultProposalTypes, getCredentialFromLeafIndex, processMessage, wireformats, } from \"ts-mls\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { marmotAuthService } from \"../../core/auth-service.js\";\nimport { getMarmotGroupData, serializeClientState, } from \"../../core/client-state.js\";\nimport { getCredentialPubkey } from \"../../core/credential.js\";\nimport { createGroupEvent, decryptGroupMessages, serializeApplicationRumor, sortGroupCommits, } from \"../../core/group-message.js\";\nimport { getKeyPackage } from \"../../core/key-package-event.js\";\nimport { canonicalizeMimeType, decryptMediaFile, deriveMediaEncryptionKey, encryptMediaFile, MIP04_VERSION, } from \"../../core/media.js\";\nimport { isPrivateMessage } from \"../../core/message.js\";\nimport { ADDRESSABLE_KEY_PACKAGE_KIND, KEY_PACKAGE_KIND, } from \"../../core/protocol.js\";\nimport { createWelcomeRumor } from \"../../core/welcome.js\";\nimport { logger } from \"../../utils/debug.js\";\nimport { createGiftWrap, hasAck } from \"../../utils/index.js\";\nimport { unixNow } from \"../../utils/nostr.js\";\nimport { proposeInviteUser } from \"./proposals/invite-user.js\";\nimport { proposeLeaveGroup } from \"./proposals/leave-group.js\";\n/** An error that is thrown when a group has no relays available to send messages. */\nexport class NoGroupRelaysError extends Error {\n constructor() {\n super(\"Group has no relays available to send messages.\");\n }\n}\n/** An error that is thrown the client is unable to find the MarmotGroupData in the ClientState of a group. */\nexport class NoMarmotGroupDataError extends Error {\n constructor() {\n super(\"MarmotGroupData not found in ClientState.\");\n }\n}\nfunction toLeafIndex(index) {\n return index;\n}\n/**\n * Build an incoming-message callback that enforces MIP-03 \"admin-only commits\".\n *\n * Kept as a pure helper for test ergonomics and clearer policy control.\n */\nexport function createAdminCommitPolicyCallback(args) {\n const { ratchetTree, adminPubkeys, onUnverifiableCommit = \"retry\" } = args;\n return (incoming) => {\n if (incoming.kind === \"proposal\")\n return \"accept\";\n // Commit must be attributable to a concrete member leaf.\n const senderLeafIndexUnknown = incoming.senderLeafIndex;\n if (senderLeafIndexUnknown === undefined)\n return \"reject\";\n const senderLeafIndex = typeof senderLeafIndexUnknown === \"number\"\n ? toLeafIndex(senderLeafIndexUnknown)\n : senderLeafIndexUnknown;\n try {\n const senderCredential = getCredentialFromLeafIndex(ratchetTree, senderLeafIndex);\n const senderPubkey = getCredentialPubkey(senderCredential);\n // Admins may commit any proposal set.\n if (adminPubkeys.includes(senderPubkey))\n return \"accept\";\n // Non-admin compatibility path:\n // - accept no-proposal commits (current ts-mls self-update shape), OR\n // - accept commits whose proposals are ONLY update proposals authored by sender.\n if (incoming.proposals.length === 0)\n return \"accept\";\n const isSelfUpdateOnly = incoming.proposals.every((p) => p.proposal.proposalType === defaultProposalTypes.update &&\n p.senderLeafIndex !== undefined &&\n Number(p.senderLeafIndex) === Number(senderLeafIndex));\n return isSelfUpdateOnly ? \"accept\" : \"reject\";\n }\n catch {\n // \"retry\" here means we don't want to permanently reject the commit;\n // MarmotGroup.ingest() will treat processing errors as unreadable/retryable.\n if (onUnverifiableCommit === \"retry\") {\n throw new Error(\"unverifiable commit sender\");\n }\n return \"reject\";\n }\n };\n}\n/**\n * The main class for interacting with a MLS group\n * @template THistory - The type of the history store to use for the group, must implement the {@link BaseGroupHistory} interface. (Default is no history store)\n */\nexport class MarmotGroup extends EventEmitter {\n /** The key-value backend where serialized group state bytes are persisted */\n store;\n /** The signer used for the clients identity */\n signer;\n /** The ciphersuite implementation to use for the group */\n ciphersuite;\n /** The nostr relay pool to use for the group */\n network;\n /** The storage interface for the groups application message history */\n history;\n /** The storage interface for the groups media */\n media;\n /** Whether group state has been modified */\n dirty = false;\n /** Internal ClientState */\n #state;\n #groupData = null;\n /**\n * Event IDs of application messages we sent ourselves, used to skip self-echoes in ingest()\n * NOTE: this is not persisted at the moment, its only in memory and used to skip self-echoes in ingest()\n */\n #sentEventIds = new Set();\n /** In-flight media decrypts keyed by plaintext SHA-256 hex. */\n #decryptingMedia = new Map();\n get id() {\n return this.state.groupContext.groupId;\n }\n /** The group id as a hex string */\n idStr;\n /** Read the current group state */\n get state() {\n return this.#state;\n }\n get groupData() {\n // If not cached, extract the group data from the state\n if (!this.#groupData)\n this.#groupData = getMarmotGroupData(this.state);\n return this.#groupData;\n }\n get unappliedProposals() {\n return this.state.unappliedProposals;\n }\n /**\n * Overrides the current group state\n * @warning It is not recommended to use this\n */\n set state(newState) {\n // Read new group data from the state\n this.#groupData = getMarmotGroupData(newState);\n // Set new state and mark as dirty\n this.#state = newState;\n this.dirty = true;\n this.emit(\"stateChanged\", newState);\n }\n // Common accessors for marmot group data\n get relays() {\n return this.groupData?.relays;\n }\n log;\n constructor(state, options) {\n super();\n this.#state = state;\n this.store = options.store;\n this.signer = options.signer;\n this.ciphersuite = options.ciphersuite;\n this.network = options.network;\n // Create the history store (optional)\n if (options.history) {\n if (typeof options.history === \"function\") {\n this.history = options.history(this.id);\n }\n else {\n this.history = options.history;\n }\n }\n else {\n this.history = undefined;\n }\n // Create the media store\n if (options.media) {\n if (typeof options.media === \"function\") {\n this.media = options.media(this.id);\n }\n else {\n this.media = options.media;\n }\n }\n else {\n this.media = undefined;\n }\n // Set useful fields\n this.idStr = bytesToHex(this.id);\n this.log = logger.extend(`group:${this.idStr.slice(0, 8)}`);\n }\n /** Creates a new {@link MarmotGroup} instance from a {@link ClientState} object */\n static async fromClientState(state, options) {\n // Get the group's ciphersuite implementation\n // In v2, getCiphersuiteImpl is available on the cryptoProvider and takes a CiphersuiteName directly\n const cryptoProvider = options.cryptoProvider ?? defaultCryptoProvider;\n const cipherSuite = await cryptoProvider.getCiphersuiteImpl(state.groupContext.cipherSuite);\n return new MarmotGroup(state, { ...options, ciphersuite: cipherSuite });\n }\n /**\n * Persists any pending changes to the group state in the store.\n *\n * @param force - When `true`, writes the current state even if `dirty` is\n * `false`. Useful for persisting the initial state of a freshly constructed\n * group (e.g. after `createGroup` / `joinGroupFromWelcome` / import) without\n * having to mutate `dirty` externally.\n */\n async save(force = false) {\n if (!force && !this.dirty)\n return;\n const stateBytes = serializeClientState(this.state);\n await this.store.setItem(bytesToHex(this.id), stateBytes);\n this.dirty = false;\n this.emit(\"stateSaved\", this);\n }\n /**\n * Performs a self-update commit (no proposals) to rotate this member's leaf key material.\n *\n * This is required by MIP-02 for forward secrecy after joining from a Welcome.\n *\n * Unlike {@link commit}, this operation is allowed for non-admin members.\n */\n async selfUpdate() {\n this.log(\"self-update commit\");\n const groupData = this.groupData;\n if (!groupData)\n throw new NoMarmotGroupDataError();\n const relays = this.relays;\n if (!relays)\n throw new NoGroupRelaysError();\n // Create a commit with explicitly empty proposals. In ts-mls, this results in\n // a self-update commit that includes an UpdatePath (rotating leaf secrets).\n const { commit, newState } = await createCommit({\n context: {\n cipherSuite: this.ciphersuite,\n authService: marmotAuthService,\n },\n state: this.state,\n wireAsPublicMessage: false,\n ratchetTreeExtension: true,\n extraProposals: [],\n });\n const commitEvent = await createGroupEvent({\n message: commit,\n state: this.state,\n ciphersuite: this.ciphersuite,\n });\n const response = await this.network.publish(relays, commitEvent);\n if (!hasAck(response)) {\n throw new Error(\"Failed to publish commit event: no relay acknowledged\");\n }\n // Advance local state after publish.\n this.state = newState;\n await this.save();\n return response;\n }\n /**\n * Leaves the group by publishing a self-remove proposal for each of the\n * caller's leaf nodes, then purging all local group data from storage.\n *\n * Per RFC 9420 §12.4 a member cannot commit a Remove targeting their own\n * leaf. Instead, a Remove *proposal* is sent so that the next committer\n * (e.g. an admin calling {@link commit}) can include it and finalise the\n * departure. At least one relay must acknowledge the proposals before local\n * state is destroyed; if no relay acks, an error is thrown and local state\n * is preserved so the caller can retry.\n *\n * Unlike {@link commit}, this operation is allowed for non-admin members.\n *\n * @returns The relay publish responses for the leave proposal event(s).\n */\n async leave() {\n this.log(\"leave group\");\n const groupData = this.groupData;\n if (!groupData)\n throw new NoMarmotGroupDataError();\n const relays = this.relays;\n if (!relays)\n throw new NoGroupRelaysError();\n // Resolve own pubkey and build self-remove proposals via the shared action.\n const ownPubkey = await this.signer.getPublicKey();\n const removeProposals = await proposeLeaveGroup(ownPubkey)({\n state: this.state,\n ciphersuite: this.ciphersuite,\n groupData,\n });\n // Publish one proposal event per leaf index (handles multi-device members).\n // RFC 9420 §12.4 forbids committing a Remove targeting own leaf, so we\n // send proposals and let the next admin commit pick them up.\n const responses = {};\n for (const proposal of removeProposals) {\n const response = await this.sendProposal(proposal);\n Object.assign(responses, response);\n }\n if (!hasAck(responses)) {\n throw new Error(\"Failed to publish leave proposals: no relay acknowledged. Local state preserved — retry leave() to try again.\");\n }\n // Purge all local group data (history, media, state store).\n await this.destroy();\n return responses;\n }\n async propose(...args) {\n const groupData = this.groupData;\n if (!groupData)\n throw new NoMarmotGroupDataError();\n const context = {\n state: this.state,\n ciphersuite: this.ciphersuite,\n groupData: this.groupData,\n };\n let proposals;\n if (args.length === 1) {\n proposals = await args[0](context);\n }\n else {\n proposals = await args[0](...args)(context);\n }\n if (!proposals) {\n throw new Error(\"Proposal is undefined. This should not happen.\");\n }\n // Handle both single proposals and arrays of proposals\n const proposalArray = Array.isArray(proposals) ? proposals : [proposals];\n // Send all proposals and collect responses\n const responses = {};\n for (const proposal of proposalArray) {\n const response = await this.sendProposal(proposal);\n // Merge responses (later responses override earlier ones for the same relay)\n Object.assign(responses, response);\n }\n return responses;\n }\n /** Sends a proposal to the group relays */\n async sendProposal(proposal) {\n const { message, newState } = await createProposal({\n context: {\n cipherSuite: this.ciphersuite,\n authService: marmotAuthService,\n externalPsks: {},\n },\n state: this.state,\n proposal,\n wireAsPublicMessage: false,\n });\n // Wrap the message in a group event\n const proposalEvent = await createGroupEvent({\n message,\n state: this.state,\n ciphersuite: this.ciphersuite,\n });\n // Publish to the group's relays\n const relays = this.relays;\n if (!relays)\n throw new NoGroupRelaysError();\n const response = await this.network.publish(relays, proposalEvent);\n if (!hasAck(response)) {\n throw new Error(\"Failed to publish proposal event: no relay acknowledged\");\n }\n // Advance local state only after at least one relay acknowledges the event.\n this.state = newState;\n await this.save();\n return response;\n }\n /**\n * Creates and sends an application message to the group.\n *\n * Application messages contain actual content shared within the group (e.g., chat messages,\n * reactions, etc.). The inner Nostr event (rumor) must be unsigned and will be serialized\n * according to the Marmot spec.\n *\n * @param rumor - The unsigned Nostr event (rumor) to send as an application message\n * @returns Promise resolving to the publish response from the relays\n */\n async sendApplicationRumor(rumor) {\n this.log(\"sending application rumor kind:%d\", rumor.kind);\n // Serialize the Nostr event (rumor) to application data according to the Marmot spec\n const applicationData = serializeApplicationRumor(rumor);\n // Create the application message using ts-mls\n // In v2, createApplicationMessage takes a single params object with context\n const { newState, message } = await createApplicationMessage({\n context: {\n cipherSuite: this.ciphersuite,\n authService: marmotAuthService,\n externalPsks: {},\n },\n state: this.state,\n message: applicationData,\n });\n // Wrap the message in a group event\n // Use this.state (not newState) to get the exporter_secret for the current epoch\n const applicationEvent = await createGroupEvent({\n message,\n state: this.state,\n ciphersuite: this.ciphersuite,\n });\n // Track this event ID so ingest() can skip the self-echo without re-running\n // processMessage against an already-advanced ratchet (which would throw\n // \"desired gen in the past\").\n this.#sentEventIds.add(applicationEvent.id);\n // Save to history immediately so the sender sees their own message without\n // waiting for the relay echo to arrive and be ingested.\n if (this.history) {\n try {\n await this.history.saveMessage(applicationData);\n }\n catch (err) {\n this.emit(\"historyError\", err);\n }\n }\n // Update the group state after successful publish\n // Application messages update state for forward secrecy (key schedule rotation)\n this.state = newState;\n // Publish to the group's relays\n const relays = this.relays;\n if (!relays)\n throw new NoGroupRelaysError();\n const response = await this.network.publish(relays, applicationEvent);\n if (!hasAck(response)) {\n const errors = Object.values(response)\n .filter((r) => !r.ok && r.message)\n .map((r) => r.message)\n .join(\"; \");\n throw new Error(`Failed to publish application message: ${errors || \"no relay acknowledged\"}`);\n }\n return response;\n }\n /**\n * Creates and sends a kind 9 chat message to the group.\n *\n * This is a convenience wrapper around {@link sendApplicationRumor} that constructs\n * the rumor for you. The message is encrypted via MLS and published as a kind 445\n * group event to the group's relays.\n *\n * @param content - The text content of the chat message\n * @param tags - Optional Nostr tags to include on the rumor\n * @returns Promise resolving to the publish response from the relays\n *\n * @example\n * ```ts\n * await group.sendChatMessage(\"Hello, group!\");\n * await group.sendChatMessage(\"Reply\", [[\"e\", replyToId]]);\n * ```\n */\n async sendChatMessage(content, tags = []) {\n const pubkey = await this.signer.getPublicKey();\n const rumor = {\n id: \"\",\n kind: 9,\n pubkey,\n created_at: unixNow(),\n content,\n tags,\n };\n rumor.id = getEventHash(rumor);\n return this.sendApplicationRumor(rumor);\n }\n /**\n * Creates a commit from proposals and sends it to the group.\n *\n * You can provide proposals in two ways:\n * 1. Pass extraProposals to include new proposals inline\n * 2. Pass proposalRefs to select specific proposals from unappliedProposals\n * 3. Pass both to combine new proposals with selected ones\n *\n * If no extraProposals or proposalRefs are provided, createCommit will use ALL proposals\n * from state.unappliedProposals automatically.\n *\n * @param options - Options for creating the commit\n * @param options.extraProposals - New proposals to include in the commit (inline)\n * @param options.proposalRefs - Proposal references (hex strings) to select from unappliedProposals\n * @param options.welcomeRecipients - Explicit list of users to send Welcome messages to (for Add operations)\n */\n async commit(options) {\n this.log(\"committing (%d extra proposals, %d recipients)\", options?.extraProposals?.length ?? 0, options?.welcomeRecipients?.length ?? 0);\n const groupData = this.groupData;\n if (!groupData)\n throw new NoMarmotGroupDataError();\n const actorPubkey = await this.signer.getPublicKey();\n if (!groupData.adminPubkeys.includes(actorPubkey)) {\n throw new Error(\"Not a group admin. Cannot commit proposals.\");\n }\n const context = {\n state: this.state,\n ciphersuite: this.ciphersuite,\n groupData: this.groupData,\n };\n // Build new proposals from extraProposals\n const newProposals = [];\n if (options?.extraProposals && options.extraProposals.length > 0) {\n for (const item of options.extraProposals.flat()) {\n if (typeof item === \"function\") {\n newProposals.push(await item(context));\n }\n else {\n newProposals.push(item);\n }\n }\n }\n // Extract proposals from unappliedProposals using the provided references\n const selectedProposals = [];\n if (options?.proposalRefs) {\n for (const ref of options.proposalRefs) {\n const proposalWithSender = this.state.unappliedProposals[ref];\n if (!proposalWithSender) {\n throw new Error(`Proposal reference not found in unappliedProposals: ${ref}`);\n }\n selectedProposals.push(proposalWithSender.proposal);\n }\n }\n // Combine new proposals with selected proposals from unappliedProposals\n const allProposals = [...newProposals, ...selectedProposals];\n // Build options for createCommit\n const commitOptions = {\n // All messages should be private\n wireAsPublicMessage: false,\n ratchetTreeExtension: true,\n };\n // If the caller explicitly provided extraProposals or proposalRefs, use\n // exactly those (even if empty — that means \"self-update, no proposals\").\n // Only fall through to the \"commit all unapplied\" default when neither is set.\n if (options?.extraProposals || options?.proposalRefs) {\n commitOptions.extraProposals = allProposals;\n }\n // Create the commit\n // In v2, createCommit takes a single params object with context\n const { commit, newState, welcome } = await createCommit({\n context: {\n cipherSuite: this.ciphersuite,\n authService: marmotAuthService,\n },\n state: this.state,\n ...commitOptions,\n });\n // Wrap the commit in a group event\n // Use this.state (not newState) to get the exporter_secret for the current epoch\n // This ensures all members at the current epoch can decrypt the commit\n const commitEvent = await createGroupEvent({\n message: commit,\n state: this.state,\n ciphersuite: this.ciphersuite,\n });\n // Publish to the group's relays.\n // MIP-02 REQUIRES: Commit MUST be published and acknowledged by relays BEFORE sending Welcome messages.\n // This ordering is critical for protocol correctness - new members must be able to fetch the commit\n // that added them before processing their Welcome.\n const relays = this.relays;\n if (!relays)\n throw new NoGroupRelaysError();\n const response = await this.network.publish(relays, commitEvent);\n if (!hasAck(response)) {\n const errors = Object.values(response)\n .filter((r) => !r.ok && r.message)\n .map((r) => r.message)\n .join(\"; \");\n throw new Error(`Failed to publish commit: ${errors || \"no relay acknowledged\"}`);\n }\n // Update the group state after successful publish\n this.state = newState;\n // Persist local-authoritative epoch transition immediately.\n await this.save();\n // If new users were added, send welcome events\n // The commit has been published and acked, so it's safe to send Welcomes now (MIP-02 compliance)\n if (welcome &&\n options?.welcomeRecipients &&\n options.welcomeRecipients.length > 0) {\n this.log(\"Sending Welcome messages to %d recipient(s)\", options.welcomeRecipients.length);\n // Send all welcome events in parallel\n // In v2, welcome is wrapped in MlsWelcomeMessage, need to access welcome.welcome\n const innerWelcome = welcome?.welcome;\n if (!innerWelcome)\n return response;\n const welcomeResults = await Promise.allSettled(options.welcomeRecipients.map(async (recipient) => {\n const welcomeRumor = createWelcomeRumor({\n welcome: innerWelcome,\n author: actorPubkey,\n groupRelays: groupData.relays,\n keyPackageEventId: recipient.keyPackageEventId,\n keyPackageEvent: recipient.keyPackageEvent,\n });\n // Gift wrap the welcome event to the newly added user\n const giftWrapEvent = await createGiftWrap({\n rumor: welcomeRumor,\n recipient: recipient.pubkey,\n signer: this.signer,\n });\n // Get the newly added user's inbox relays using the GroupNostrInterface\n // Fallback to group relays if inbox relays are not available\n let inboxRelays;\n try {\n inboxRelays = await this.network.getUserInboxRelays(recipient.pubkey);\n this.log(\"Retrieved inbox relays for recipient: %O\", inboxRelays);\n }\n catch (error) {\n this.log(\"Failed to get inbox relays for recipient %s...: %O\", recipient.pubkey.slice(0, 16), error);\n // Fallback to group relays\n inboxRelays = groupData.relays || [];\n }\n if (inboxRelays.length === 0) {\n throw new Error(`No relays available to send Welcome to recipient ${recipient.pubkey.slice(0, 16)}...`);\n }\n // Welcome is the most critical delivery — new members can't join without it.\n const publishResult = await this.network.publish(inboxRelays, giftWrapEvent);\n this.log(\"Gift wrap publish result: %O\", publishResult);\n return publishResult;\n }));\n // Surface welcome delivery failures so callers can detect and retry\n const failureDetails = welcomeResults\n .map((r, i) => ({\n result: r,\n recipient: options.welcomeRecipients[i],\n }))\n .filter((x) => x.result.status === \"rejected\")\n .map((x) => {\n const msg = x.result.reason instanceof Error\n ? x.result.reason.message\n : String(x.result.reason);\n return `${x.recipient.pubkey.slice(0, 16)}…: ${msg}`;\n });\n if (failureDetails.length > 0) {\n this.log(\"%d/%d Welcome(s) failed to deliver: %O\", failureDetails.length, options.welcomeRecipients.length, failureDetails);\n throw new Error(`Failed to deliver ${failureDetails.length}/${options.welcomeRecipients.length} Welcome message(s): ${failureDetails.join(\"; \")}`);\n }\n }\n return response;\n }\n /**\n * Invites a user to the group using their KeyPackage event (kind 443).\n *\n * This method:\n * 1. Validates the KeyPackage event (kind 443)\n * 2. Validates that the credential identity matches the event pubkey\n * 3. Builds an Add proposal using the KeyPackage\n * 4. Commits the proposal\n * 5. After commit ack, sends a Welcome message to the invitee via NIP-59 gift wrap\n *\n * @param keyPackageEvent - The KeyPackage event (kind 443 or kind 30443) for the user to invite\n * @returns Promise resolving to the publish response from the relays\n * @throws Error if the event is not a key package kind or if the credential identity doesn't match\n */\n async inviteByKeyPackageEvent(keyPackageEvent) {\n // Validate the event is a KeyPackage event (kind 443 or kind 30443)\n if (keyPackageEvent.kind !== KEY_PACKAGE_KIND &&\n keyPackageEvent.kind !== ADDRESSABLE_KEY_PACKAGE_KIND) {\n throw new Error(`inviteByKeyPackageEvent: Expected KeyPackage event kind ${KEY_PACKAGE_KIND} or ${ADDRESSABLE_KEY_PACKAGE_KIND}, got ${keyPackageEvent.kind}`);\n }\n // Validate that the credential identity matches the event pubkey\n const keyPackage = getKeyPackage(keyPackageEvent);\n const credentialIdentity = getCredentialPubkey(keyPackage.leafNode.credential);\n if (credentialIdentity !== keyPackageEvent.pubkey) {\n throw new Error(`inviteByKeyPackageEvent: Credential identity ${credentialIdentity} does not match event pubkey ${keyPackageEvent.pubkey}`);\n }\n // Build the Add proposal using the existing proposeInviteUser function\n const proposalAction = proposeInviteUser(keyPackageEvent);\n // Commit with the proposal and explicit welcome recipient\n return await this.commit({\n extraProposals: [proposalAction],\n welcomeRecipients: [\n {\n pubkey: keyPackageEvent.pubkey,\n keyPackageEventId: keyPackageEvent.id,\n keyPackageEvent,\n },\n ],\n });\n }\n /**\n * Creates an incoming message callback that enforces admin-only commits.\n *\n * Per MIP-03, only admins can send commits. This callback:\n * - Accepts all proposals (they don't require admin privileges)\n * - For commits, verifies that the sender is in the group's admin list\n * - Rejects commits from non-admin senders\n *\n * @returns An IncomingMessageCallback that enforces admin verification\n */\n createAdminVerificationCallback() {\n const groupData = this.groupData;\n if (!groupData) {\n // If no group data, we can't verify - accept all (shouldn't happen in normal flow)\n return acceptAll;\n }\n return createAdminCommitPolicyCallback({\n ratchetTree: this.state.ratchetTree,\n adminPubkeys: groupData.adminPubkeys,\n onUnverifiableCommit: \"retry\",\n });\n }\n /**\n * ingests an array of group messages and applies commits to the group state.\n *\n * Processing happens in two stages:\n * 1. Process all non-commit messages (proposals, application messages)\n * - If a message fails to process, it's added to unreadable for retry\n * 2. Process commits according to MIP-03 (sorted by epoch, timestamp, event id)\n * - Commits advance the epoch and update the group state\n *\n * After both stages, recursively retry unreadable messages until no more can be read.\n * Events that can never be processed are yielded as {@link UnreadableIngestResult}.\n *\n * @param events - Array of Nostr events containing encrypted MLS messages\n * @param options - Options for controlling retry behavior\n * @param options.retryCount - Current retry attempt count (internal use)\n * @param options.maxRetries - Maximum number of retry attempts (default: 5)\n * @yields IngestResult - The result of processing the event\n */\n async *ingest(events, options) {\n // Each ingest call gets its own sub-namespace so concurrent or sequential\n // batches can be distinguished at a glance in debug output.\n const log = this.log.extend(`ingest:${Date.now().toString(36).slice(-5)}`);\n // Set default retry options\n const retryCount = options?.retryCount ?? 0;\n const maxRetries = options?.maxRetries ?? 5;\n const errorList = options?._errors ?? [];\n if (retryCount === 0) {\n log(\"start – %d event(s), maxRetries=%d\", events.length, maxRetries);\n }\n else {\n log(\"retry %d/%d – %d event(s) remaining\", retryCount, maxRetries, events.length);\n }\n // Check if we've exceeded the maximum retry attempts.\n //\n // IMPORTANT: ingest() processes untrusted network input. If we throw here,\n // a single permanently-unreadable message (e.g. encrypted under an epoch we\n // can never decrypt, malformed ciphertext, spam) can DoS consumers.\n // Instead, stop retrying and yield the remaining events as unreadable.\n if (retryCount > maxRetries) {\n log(\"max retries exceeded – yielding %d event(s) as unreadable\", events.length);\n for (const event of events) {\n yield {\n kind: \"unreadable\",\n event,\n errors: errorList\n .filter((e) => e.eventId === event.id)\n .map((e) => e.error),\n };\n }\n return;\n }\n // Early return if no events to process\n if (events.length === 0)\n return;\n // ============================================================================\n // STEP 1: Decrypt NIP-44 layer to get MLSMessages\n // ============================================================================\n // Each Nostr event contains an MLSMessage encrypted with NIP-44 using the\n // group's exporter_secret. We decrypt this first layer to get the actual\n // MLS message structure.\n const { read, unreadable: decryptFailed } = await decryptGroupMessages(events, this.state, this.ciphersuite);\n log(\"decryption: %d/%d readable, %d failed\", read.length, events.length, decryptFailed.length);\n // Record a decryption error for each event that failed the NIP-44 layer.\n for (const event of decryptFailed) {\n log(\"decrypt failed event:%s\", event.id.slice(0, 8));\n errorList.push({\n eventId: event.id,\n error: new Error(\"Failed to decrypt group message\"),\n });\n }\n // If nothing was readable the exporter_secret cannot change this round, so\n // retrying would always fail the same way. Yield decrypt failures now.\n if (read.length === 0) {\n log(\"nothing readable – yielding %d decrypt failure(s) as unreadable\", decryptFailed.length);\n for (const event of decryptFailed) {\n yield {\n kind: \"unreadable\",\n event,\n errors: errorList\n .filter((e) => e.eventId === event.id)\n .map((e) => e.error),\n };\n }\n return;\n }\n // Collect events that need a retry after state advances (e.g. after a commit\n // rotates the exporter_secret so we can decrypt previously opaque events).\n const unreadable = [...decryptFailed];\n // ============================================================================\n // STEP 2: Separate commits from non-commit messages\n // ============================================================================\n // We process non-commit messages first (proposals, application messages),\n // then process commits. This ensures proposals are in unappliedProposals\n // before commits try to reference them.\n let commits = [];\n const nonCommits = [];\n for (const pair of read) {\n if (isPrivateMessage(pair.message) &&\n pair.message.privateMessage.contentType === contentTypes.commit) {\n commits.push(pair);\n }\n else {\n nonCommits.push(pair);\n }\n }\n log(\"split: %d commit(s), %d non-commit(s)\", commits.length, nonCommits.length);\n // ============================================================================\n // STEP 3: Process all non-commit messages\n // ============================================================================\n // Process all proposals and application messages. If a message fails to process\n // (wrong epoch, invalid, etc.), add it to unreadable for retry later.\n //\n // Proposals are added to state.unappliedProposals when processed, making them\n // available for commits to reference via ProposalRef.\n for (const { event, message } of nonCommits) {\n try {\n // Skip application messages that we sent ourselves. When we sent the\n // message we already advanced this.state via the newState returned by\n // createApplicationMessage. If we ran processMessage again against that\n // advanced ratchet the generation counter would be in the past and\n // ts-mls would throw \"desired gen in the past\". History was already\n // saved at send time, so nothing is lost by skipping here.\n if (this.#sentEventIds.delete(event.id)) {\n log(\"skip event:%s reason:self-echo\", event.id.slice(0, 8));\n yield { kind: \"skipped\", event, message, reason: \"self-echo\" };\n continue;\n }\n // Yield unexpected wireformats as skipped rather than silently ignoring them.\n if (message.wireformat !== wireformats.mls_private_message &&\n message.wireformat !== wireformats.mls_public_message) {\n log(\"skip event:%s reason:wrong-wireformat\", event.id.slice(0, 8));\n yield { kind: \"skipped\", event, message, reason: \"wrong-wireformat\" };\n continue;\n }\n // processMessage handles:\n // - Proposals: Adds them to state.unappliedProposals (keyed by proposal reference)\n // - Application messages: Decrypts content and returns it\n // - Both update state as needed (for forward secrecy)\n // In v2, processMessage takes a single params object with context\n const result = await processMessage({\n context: {\n cipherSuite: this.ciphersuite,\n authService: marmotAuthService,\n externalPsks: {},\n },\n state: this.state,\n message,\n callback: acceptAll, // Accept all proposals (adds them to unappliedProposals)\n });\n // Update state if message changed it\n if (result.kind === \"newState\") {\n log(\"proposal accepted event:%s epoch:%d\", event.id.slice(0, 8), this.state.groupContext.epoch);\n this.state = result.newState;\n yield { kind: \"processed\", result, event, message };\n }\n else if (result.kind === \"applicationMessage\") {\n log(\"application message event:%s\", event.id.slice(0, 8));\n // Application messages also update state (for forward secrecy)\n this.state = result.newState;\n // Save application message to history (best-effort)\n if (this.history) {\n try {\n await this.history.saveMessage(result.message);\n }\n catch (err) {\n this.emit(\"historyError\", err);\n }\n }\n yield { kind: \"processed\", result, event, message };\n this.emit(\"applicationMessage\", result.message);\n }\n }\n catch (error) {\n // Message processing failed - might be invalid or from wrong epoch\n // Add to unreadable for retry later (might become readable after state updates)\n log(\"non-commit failed event:%s – queued for retry: %O\", event.id.slice(0, 8), error);\n errorList.push({ eventId: event.id, error });\n unreadable.push(event);\n }\n }\n // ============================================================================\n // STEP 4: Sort commits to handle race conditions (MIP-03)\n // ============================================================================\n commits = sortGroupCommits(commits);\n // ============================================================================\n // STEP 5: Process commits sequentially\n // ============================================================================\n // Commits advance the epoch and update the group state. We process them in\n // sorted order. Each commit changes the epoch and rotates keys, so later\n // commits depend on earlier ones.\n // Create admin verification callback for commit processing\n const adminCallback = this.createAdminVerificationCallback();\n for (const { event, message } of commits) {\n if (!isPrivateMessage(message)) {\n log(\"skip commit event:%s reason:wrong-wireformat\", event.id.slice(0, 8));\n yield { kind: \"skipped\", event, message, reason: \"wrong-wireformat\" };\n continue;\n }\n const commitEpoch = typeof message.privateMessage.epoch === \"bigint\"\n ? message.privateMessage.epoch\n : BigInt(message.privateMessage.epoch);\n const currentEpoch = this.state.groupContext.epoch;\n // Commits from past epochs were already applied — skip and report them.\n if (commitEpoch < currentEpoch) {\n log(\"skip commit event:%s reason:past-epoch (commit=%d current=%d)\", event.id.slice(0, 8), commitEpoch, currentEpoch);\n yield { kind: \"skipped\", event, message, reason: \"past-epoch\" };\n continue;\n }\n // Commits too far in the future can't be applied yet.\n // Add to unreadable so they are retried after state advances.\n if (commitEpoch > currentEpoch + 1n) {\n log(\"defer commit event:%s epoch:%d too far ahead (current=%d)\", event.id.slice(0, 8), commitEpoch, currentEpoch);\n errorList.push({\n eventId: event.id,\n error: new Error(`Commit epoch ${commitEpoch} is too far ahead of current epoch ${currentEpoch}`),\n });\n unreadable.push(event);\n continue;\n }\n log(\"processing commit event:%s epoch:%d->%d\", event.id.slice(0, 8), currentEpoch, commitEpoch);\n try {\n // processMessage handles:\n // - Decrypts the private message using group secrets from the current state\n // - Verifies message authenticity and sender\n // - Resolves proposal references from state.unappliedProposals (if needed)\n // - Applies the commit (updates ratchet tree, advances epoch, rotates keys)\n // In v2, processMessage takes a single params object with context\n const result = await processMessage({\n context: {\n cipherSuite: this.ciphersuite,\n authService: marmotAuthService,\n externalPsks: {},\n },\n state: this.state,\n message,\n callback: adminCallback, // Use admin verification callback for commits\n });\n if (result.kind === \"newState\") {\n // If the commit was rejected by the callback (admin verification),\n // do not advance state and do not retry — yield it so callers can observe it.\n if (result.actionTaken === \"reject\") {\n log(\"commit event:%s rejected by admin policy\", event.id.slice(0, 8));\n yield { kind: \"rejected\", result, event, message };\n continue;\n }\n // Successfully processed the commit - update our state\n // After each commit, the epoch advances and keys rotate\n this.state = result.newState;\n log(\"commit event:%s applied – new epoch:%d\", event.id.slice(0, 8), this.state.groupContext.epoch);\n yield { kind: \"processed\", result, event, message };\n }\n }\n catch (error) {\n // Commit processing failed - add to unreadable for retry\n // It might become valid after processing more proposals or state updates\n log(\"commit failed event:%s – queued for retry: %O\", event.id.slice(0, 8), error);\n errorList.push({ eventId: event.id, error });\n unreadable.push(event);\n }\n }\n // Save the group state after processing all messages\n await this.save();\n log(\"state saved – epoch:%d\", this.state.groupContext.epoch);\n // ============================================================================\n // STEP 6: Recursively retry unreadable events\n // ============================================================================\n // After processing commits and updating the state, some events that were\n // unreadable might now be readable. For example:\n // - An event from epoch N+1 might have been unreadable when we were at epoch N\n // - After processing a commit that advances us to epoch N+1, we can now read it\n //\n // We recursively call ingest on unreadable events to retry them.\n // This continues until no more events can be read.\n if (unreadable.length > 0) {\n log(\"scheduling retry for %d unreadable event(s)\", unreadable.length);\n yield* this.ingest(unreadable, {\n retryCount: retryCount + 1,\n maxRetries: maxRetries,\n _errors: errorList,\n });\n }\n else {\n log(\"done – no unreadable events remain\");\n }\n }\n /**\n * Encrypts a media file for sharing in a group message (MIP-04 v2).\n *\n * Derives the per-file key from the current MLS epoch, encrypts with\n * ChaCha20-Poly1305, and returns the ciphertext alongside a fully\n * populated {@link MediaAttachment} ready to be serialised into an\n * `imeta` tag via `createImetaTagForAttachment` from applesauce.\n *\n * **Caller responsibilities:**\n * 1. Upload `encrypted` to Blossom (or any content-addressed store).\n * 2. Set `attachment.url` to the resulting upload URL.\n * 3. Pass `attachment` (with `url`) to `createImetaTagForAttachment` and\n * include the resulting tag on the group message rumor.\n */\n async encryptMedia(blob, metadata) {\n const mimeType = metadata.type ?? blob.type;\n if (!mimeType) {\n throw new Error(\"encryptMedia: MIME type is required — pass metadata.type or ensure blob.type is set\");\n }\n const plaintext = new Uint8Array(await blob.arrayBuffer());\n const plaintextHash = bytesToHex(sha256(plaintext));\n const skeleton = {\n sha256: plaintextHash,\n type: canonicalizeMimeType(mimeType),\n filename: metadata.filename,\n nonce: \"\", // filled by encryptMediaFile\n version: MIP04_VERSION,\n size: metadata.size ?? blob.size,\n ...(metadata.dimensions !== undefined\n ? { dimensions: metadata.dimensions }\n : {}),\n ...(metadata.blurhash !== undefined\n ? { blurhash: metadata.blurhash }\n : {}),\n ...(metadata.alt !== undefined ? { alt: metadata.alt } : {}),\n };\n const fileKey = await deriveMediaEncryptionKey(this.state, this.ciphersuite, skeleton);\n return encryptMediaFile(plaintext, fileKey, skeleton);\n }\n /**\n * Decrypts a MIP-04 v2 media attachment downloaded from Blossom.\n *\n * On the first call for a given file the plaintext bytes are derived via\n * key-derivation + ChaCha20-Poly1305 decryption and stored in\n * {`@link` media}. Subsequent calls for the same `attachment.sha256`\n * are served directly from the cache, skipping key-derivation entirely.\n */\n async decryptMedia(encrypted, attachment) {\n if (!attachment.sha256) {\n throw new Error(\"decryptMedia: attachment.sha256 is required\");\n }\n // Cache hit — return immediately without re-deriving the key\n const cached = await this.media?.getMedia(attachment.sha256);\n if (cached)\n return cached;\n const inFlight = this.#decryptingMedia.get(attachment.sha256);\n if (inFlight)\n return inFlight;\n const decryptPromise = (async () => {\n const fileKey = await deriveMediaEncryptionKey(this.state, this.ciphersuite, attachment);\n const plaintext = decryptMediaFile(encrypted, fileKey, attachment);\n await this.media?.addMedia(attachment.sha256, {\n data: plaintext,\n attachment,\n });\n return { data: plaintext, attachment };\n })();\n this.#decryptingMedia.set(attachment.sha256, decryptPromise);\n try {\n return await decryptPromise;\n }\n finally {\n this.#decryptingMedia.delete(attachment.sha256);\n }\n }\n /** Destroys the group and purges the group history */\n async destroy() {\n this.log(\"destroying group\");\n this.log(\"clearing group history\");\n if (this.history)\n await this.history.purgeMessages();\n this.log(\"clearing group media\");\n if (this.media)\n await this.media.clearMedia();\n this.log(\"removing group from store\");\n await this.store.removeItem(bytesToHex(this.id));\n // Emit the destroyed event\n this.emit(\"destroyed\", this);\n }\n}\n//# sourceMappingURL=marmot-group.js.map","import { bytesToHex } from \"@noble/hashes/utils.js\";\nimport { hexToBytes } from \"applesauce-core/helpers\";\nimport { EventEmitter } from \"eventemitter3\";\nimport { ciphersuites, defaultCryptoProvider, } from \"ts-mls\";\nimport { deserializeClientState, } from \"../core/client-state.js\";\nimport { createCredential } from \"../core/credential.js\";\nimport { createSimpleGroup } from \"../core/group.js\";\nimport { generateKeyPackage } from \"../core/key-package.js\";\nimport { logger } from \"../utils/debug.js\";\nimport { MarmotGroup, } from \"./group/marmot-group.js\";\nconst log = logger.extend(\"GroupsManager\");\n/**\n * Manages the lifecycle of {@link MarmotGroup} instances — persistence,\n * in-memory caching, creation, loading, unloading, destroying, and leaving.\n */\nexport class GroupsManager extends EventEmitter {\n /** The backend storing serialized group state bytes */\n store;\n /** The signer used for the clients identity */\n signer;\n /** The nostr relay pool to use for the client */\n network;\n /** Crypto provider for cryptographic operations */\n cryptoProvider;\n /** Group history factory passed to group instances */\n historyFactory;\n /** Group media factory passed to group instances */\n mediaFactory;\n /** In-memory cache of loaded group instances, keyed by hex group id */\n #groups = new Map();\n /** Per-group listener handles, so we can detach them when a group is unloaded. */\n #groupListeners = new Map();\n /** Tracks in-flight group loads to prevent duplicate instances under concurrency */\n #groupLoadPromises = new Map();\n constructor(options) {\n super();\n this.store = options.store;\n this.signer = options.signer;\n this.network = options.network;\n this.cryptoProvider = options.cryptoProvider ?? defaultCryptoProvider;\n this.historyFactory =\n options.historyFactory;\n this.mediaFactory = options.mediaFactory;\n }\n /** Returns the list of currently loaded group instances */\n get loaded() {\n return Array.from(this.#groups.values());\n }\n /** Get a ciphersuite implementation from a name */\n async #getCiphersuiteImpl(name) {\n const ciphersuiteName = name ?? \"MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519\";\n const id = ciphersuites[ciphersuiteName];\n return await this.cryptoProvider.getCiphersuiteImpl(id);\n }\n /** Hydrates a SerializedClientState into a ClientState */\n #hydrateState(serialized) {\n return deserializeClientState(serialized);\n }\n /** Reads the serialized state bytes for a group directly from the backend */\n async #getSerializedState(groupId) {\n return this.store.getItem(bytesToHex(groupId));\n }\n /** Lists all persisted group IDs, decoded from their hex storage keys. */\n async listIds() {\n const keys = await this.store.keys();\n return keys.map((key) => hexToBytes(key));\n }\n /** Checks if a group exists in the backend */\n async has(groupId) {\n const key = typeof groupId === \"string\" ? groupId : bytesToHex(groupId);\n const item = await this.store.getItem(key);\n return item !== null;\n }\n /** Sets a group instance in the cache and subscribes to its state events */\n #setGroupInstance(group) {\n const id = bytesToHex(group.id);\n this.#groups.set(id, group);\n // If a group self-destroys, drop it from the cache so `loaded` stays accurate.\n const destroyed = () => this.#clearGroupInstance(id);\n group.on(\"destroyed\", destroyed);\n this.#groupListeners.set(id, { destroyed });\n this.emit(\"updated\", this.loaded);\n }\n #clearGroupInstance(groupId) {\n const id = typeof groupId === \"string\" ? groupId : bytesToHex(groupId);\n const existing = this.#groups.get(id);\n if (!existing)\n return;\n const listeners = this.#groupListeners.get(id);\n if (listeners) {\n existing.off(\"destroyed\", listeners.destroyed);\n this.#groupListeners.delete(id);\n }\n this.#groups.delete(id);\n this.emit(\"updated\", this.loaded);\n }\n /** Loads a new group from the store */\n async #loadGroup(groupId) {\n const id = typeof groupId === \"string\" ? hexToBytes(groupId) : groupId;\n log(\"loading group %s from store\", bytesToHex(id));\n const stateBytes = await this.#getSerializedState(id);\n if (!stateBytes) {\n throw new Error(`Group ${bytesToHex(id)} not found`);\n }\n const state = this.#hydrateState(stateBytes);\n return await MarmotGroup.fromClientState(state, {\n store: this.store,\n signer: this.signer,\n cryptoProvider: this.cryptoProvider,\n network: this.network,\n history: this.historyFactory,\n media: this.mediaFactory,\n });\n }\n /** Gets a group from cache or loads it from store */\n async get(groupId) {\n const id = typeof groupId === \"string\" ? groupId : bytesToHex(groupId);\n let group = this.#groups.get(id);\n if (!group) {\n const existingLoad = this.#groupLoadPromises.get(id);\n if (existingLoad) {\n group = await existingLoad;\n }\n else {\n const loadPromise = this.#loadGroup(groupId)\n .then((loaded) => {\n this.#setGroupInstance(loaded);\n this.emit(\"loaded\", loaded);\n return loaded;\n })\n .finally(() => {\n this.#groupLoadPromises.delete(id);\n });\n this.#groupLoadPromises.set(id, loadPromise);\n group = await loadPromise;\n }\n }\n return group;\n }\n /** Loads all groups from the store and returns them */\n async loadAll() {\n const groupIds = await this.listIds();\n return await Promise.all(groupIds.map((groupId) => this.get(groupId)));\n }\n /**\n * Persists and caches a group built from a {@link ClientState}, emitting\n * the given lifecycle event. Used by higher-level flows (e.g. joining from\n * a welcome message) that construct ClientStates themselves.\n *\n * @param state - The ClientState to adopt\n * @param options.emit - Which lifecycle event to emit. Defaults to `\"imported\"`.\n * @returns The persisted and cached MarmotGroup\n * @throws Error if a group with the same id already exists\n */\n async adoptClientState(state, options) {\n const eventName = options?.emit ?? \"imported\";\n const id = bytesToHex(state.groupContext.groupId);\n if (await this.has(state.groupContext.groupId)) {\n throw new Error(`Group ${id} already exists`);\n }\n const group = await MarmotGroup.fromClientState(state, {\n store: this.store,\n signer: this.signer,\n cryptoProvider: this.cryptoProvider,\n network: this.network,\n history: this.historyFactory,\n media: this.mediaFactory,\n });\n // Persist initial state via the group's own save() path.\n // MarmotGroup.save() is the single writer into the group state store.\n await group.save(true);\n this.#setGroupInstance(group);\n this.emit(eventName, group);\n log(\"adopted group %s (emit=%s)\", id, eventName);\n return group;\n }\n /**\n * Imports a new group from a {@link ClientState} object, persisting it to\n * the store and emitting `imported`.\n */\n async import(state) {\n return this.adoptClientState(state, { emit: \"imported\" });\n }\n /** Unloads a group from the client but does not remove it from the store */\n async unload(groupId) {\n const hex = typeof groupId === \"string\" ? hexToBytes(groupId) : groupId;\n this.#clearGroupInstance(hex);\n this.emit(\"unloaded\", hex);\n }\n /** Destroys a group and purges the group history */\n async destroy(groupId) {\n const id = typeof groupId === \"string\" ? groupId : bytesToHex(groupId);\n log(\"destroying group %s\", id);\n const group = this.#groups.get(id) || (await this.#loadGroup(groupId));\n // NOTE: MarmotGroup.destroy() is the single owner of removing group state\n // from storage. It emits `destroyed`, which our listener uses to clear the\n // in-memory cache and emit `updated`.\n await group.destroy();\n const hexId = typeof groupId === \"string\" ? hexToBytes(groupId) : groupId;\n this.emit(\"destroyed\", hexId);\n }\n /**\n * Leaves a group by publishing a self-remove proposal and purging all\n * local group data from storage.\n *\n * At least one relay must acknowledge the proposals before local state is\n * destroyed. If no relay acks, an error is thrown and local state is\n * preserved so the caller can retry.\n *\n * @param groupId - The group ID as a hex string or Uint8Array.\n * @returns The relay publish responses for the leave proposal event(s).\n */\n async leave(groupId) {\n const id = typeof groupId === \"string\" ? groupId : bytesToHex(groupId);\n log(\"leaving group %s\", id);\n const group = this.#groups.get(id) || (await this.#loadGroup(groupId));\n const groupIdBytes = typeof groupId === \"string\" ? hexToBytes(groupId) : groupId;\n // MarmotGroup.leave() purges local state via destroy(), which emits\n // `destroyed` — our listener clears the cache and emits `updated`.\n const response = await group.leave();\n this.emit(\"left\", groupIdBytes);\n return response;\n }\n /** Creates a new simple group */\n async create(name, options) {\n log(\"creating group %o\", name);\n const ciphersuiteImpl = await this.#getCiphersuiteImpl(options?.ciphersuite);\n const pubkey = await this.signer.getPublicKey();\n const credential = await createCredential(pubkey);\n const keyPackage = await generateKeyPackage({\n credential,\n ciphersuiteImpl,\n });\n const { clientState } = await createSimpleGroup(keyPackage, ciphersuiteImpl, name, {\n ...options,\n adminPubkeys: [...new Set([pubkey, ...(options?.adminPubkeys || [])])],\n });\n const group = new MarmotGroup(clientState, {\n ciphersuite: ciphersuiteImpl,\n store: this.store,\n signer: this.signer,\n network: this.network,\n history: this.historyFactory,\n media: this.mediaFactory,\n });\n await group.save(true);\n this.#setGroupInstance(group);\n this.emit(\"created\", group);\n log(\"created group %s\", group.idStr);\n return group;\n }\n /**\n * Watches for changes to the groups in the store.\n * Returns an async generator that yields the current list of groups\n * whenever the store changes.\n *\n * @example\n * ```ts\n * for await (const groups of client.groups.watch()) {\n * console.log(`Groups updated: ${groups.length} groups`);\n * }\n * ```\n */\n async *watch() {\n let resolveNext = null;\n const handleChange = () => {\n if (resolveNext) {\n resolveNext();\n resolveNext = null;\n }\n };\n // `updated` fires whenever the set of loaded groups changes\n // (create, import, join, load, unload, destroy, leave).\n this.on(\"updated\", handleChange);\n try {\n // Yield initial state after listeners are installed to avoid missing updates\n // that occur between snapshot and subscription.\n yield [...(await this.loadAll())];\n while (true) {\n await new Promise((resolve) => {\n resolveNext = resolve;\n });\n yield [...(await this.loadAll())];\n }\n }\n finally {\n this.off(\"updated\", handleChange);\n }\n }\n}\n//# sourceMappingURL=groups-manager.js.map","import { unlockGiftWrap } from \"applesauce-common/helpers/gift-wrap\";\nimport { kinds, } from \"applesauce-core/helpers/event\";\nimport { EventEmitter } from \"eventemitter3\";\nimport { WELCOME_EVENT_KIND } from \"../core/protocol.js\";\nimport { getWelcome } from \"../core/welcome.js\";\nimport { logger } from \"../utils/debug.js\";\nconst SEEN_KEY = \"__seen\";\nconst RECEIVED_PREFIX = \"received:\";\nconst UNREAD_PREFIX = \"unread:\";\nfunction isGiftWrap(event) {\n return event.kind === kinds.GiftWrap;\n}\n/**\n * InviteManager orchestrates the lifecycle of reading Welcome invites.\n *\n * It takes gift-wrapped events from the app, handles decryption/parsing,\n * persists invites to storage, and provides interfaces for consumption.\n *\n * The app is responsible for:\n * - Syncing events from relays\n * - Passing gift wrap events (kind 1059) to ingestEvent()\n * - Calling decryptGiftWraps() to decrypt (triggers nip-44 decryption prompts)\n * - Reading unread invites via getUnread(), watchUnread(), or event listeners\n * - Marking invites as read after processing\n *\n * State lifecycle:\n * 1. RECEIVED: Gift wrap ingested, stored, awaiting decryption\n * 2. UNREAD: Decrypted and parsed, ready for app consumption\n * 3. SEEN: Event ID tracked to prevent re-processing\n * 4. (DELETED): Read invites are removed from storage\n *\n * Store layout:\n * - `__seen` key holds a serialized set of all seen event IDs\n * - `received:<eventId>` keys hold undecrypted gift wraps\n * - `unread:<rumorId>` keys hold decrypted welcome rumors\n *\n * @example\n * ```typescript\n * const inviteReader = new InviteManager({\n * signer: mySigner,\n * store: myStore,\n * });\n *\n * // 1. Ingest gift wraps from relay sync\n * await inviteReader.ingestEvents(giftWraps);\n *\n * // 2. Process received invites (prompts user for decryption)\n * await inviteReader.decryptGiftWraps();\n *\n * // 3. Consume unread invites\n * const unread = await inviteReader.getUnread();\n * for (const invite of unread) {\n * await client.joinGroupFromWelcome({ welcomeRumor: invite });\n * await inviteReader.markAsRead(invite.id);\n * }\n * ```\n */\nexport class InviteManager extends EventEmitter {\n signer;\n store;\n seenCache = null;\n #log = logger.extend(\"InviteManager\");\n constructor(options) {\n super();\n this.signer = options.signer;\n this.store = options.store;\n }\n /** Lazily load the seen set from store into memory */\n async getSeenSet() {\n if (this.seenCache)\n return this.seenCache;\n const entry = await this.store.getItem(SEEN_KEY);\n if (entry && entry.type === \"seen\") {\n this.seenCache = new Set(entry.ids);\n }\n else {\n this.seenCache = new Set();\n }\n return this.seenCache;\n }\n /** Persist the in-memory seen set to the store */\n async persistSeen() {\n const seen = await this.getSeenSet();\n await this.store.setItem(SEEN_KEY, { type: \"seen\", ids: [...seen] });\n }\n /**\n * Ingest a gift wrap event (kind 1059).\n *\n * The event is checked against the seen index for deduplication.\n * If new, it's stored in the 'received' state awaiting decryption.\n *\n * @param event - Gift wrap event (kind 1059)\n * @returns true if event was new and stored, false if already seen\n * @throws Error if event is not kind 1059\n */\n async ingestEvent(event) {\n if (!isGiftWrap(event)) {\n throw new Error(`Expected kind 1059 gift wrap, got kind ${event.kind}`);\n }\n const seen = await this.getSeenSet();\n if (seen.has(event.id))\n return false;\n this.#log(\"ingesting gift wrap %s\", event.id);\n // Write data first (crash-safe ordering)\n await this.store.setItem(`${RECEIVED_PREFIX}${event.id}`, {\n type: \"received\",\n giftwrap: event,\n });\n // Then update seen index\n seen.add(event.id);\n await this.persistSeen();\n this.emit(\"received\", event);\n return true;\n }\n /**\n * Ingest multiple gift wrap events in batch.\n *\n * @param events - Array of gift wrap events\n * @returns Count of new events stored\n */\n async ingestEvents(events) {\n let newCount = 0;\n for (const event of events) {\n try {\n const isNew = await this.ingestEvent(event);\n if (isNew)\n newCount++;\n }\n catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.emit(\"error\", err, event.id);\n }\n }\n return newCount;\n }\n /**\n * Process a single received (undecrypted) gift wrap by event ID.\n *\n * Attempts to decrypt and parse the specified event.\n * - On success: moves to 'unread' state and emits 'newInvite' event\n * - On failure: emits 'error' event (event remains in 'seen' to prevent retry)\n *\n * This method prompts the user via signer for decryption.\n *\n * @param eventId - The gift wrap event ID to decrypt, or the gift wrap event itself\n * @returns The decrypted welcome rumor, or null if failed to decrypt\n * @throws Error if the event is not found in received store\n */\n async decryptGiftWrap(eventId) {\n let giftwrap;\n if (typeof eventId === \"string\") {\n const entry = await this.store.getItem(`${RECEIVED_PREFIX}${eventId}`);\n giftwrap = entry?.type === \"received\" ? entry.giftwrap : null;\n }\n else {\n giftwrap = eventId;\n }\n if (!giftwrap) {\n throw new Error(`Event ${eventId} not found in received store`);\n }\n this.#log(\"decrypting gift wrap %s\", giftwrap.id);\n try {\n const rumor = await unlockGiftWrap(giftwrap, this.signer);\n if (rumor.kind !== WELCOME_EVENT_KIND) {\n throw new Error(`Expected kind ${WELCOME_EVENT_KIND} Welcome, got kind ${rumor.kind}`);\n }\n // Parse and validate the Welcome message\n getWelcome(rumor);\n this.#log(\"decrypted gift wrap %s → rumor %s\", giftwrap.id, rumor.id);\n // Move to unread state\n await this.store.setItem(`${UNREAD_PREFIX}${rumor.id}`, {\n type: \"unread\",\n rumor,\n });\n await this.store.removeItem(`${RECEIVED_PREFIX}${giftwrap.id}`);\n this.emit(\"processed\", giftwrap.id);\n this.emit(\"decrypted\", rumor);\n return rumor;\n }\n catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.emit(\"error\", err, giftwrap.id);\n // Remove from received (failed to process)\n await this.store.removeItem(`${RECEIVED_PREFIX}${giftwrap.id}`);\n this.emit(\"processed\", giftwrap.id);\n return null;\n }\n }\n /**\n * Decrypts all received gift wraps.\n *\n * Attempts to decrypt and parse each received gift wrap.\n * - On success: moves to 'unread' state and emits 'newInvite' event\n * - On failure: emits 'error' event (event remains in 'seen' to prevent retry)\n *\n * This method prompts the user via signer for each decryption,\n * so it should be called deliberately by the app (not automatically).\n *\n * @returns Array of successfully decrypted welcome rumors\n */\n async decryptGiftWraps() {\n const allKeys = await this.store.keys();\n const receivedIds = allKeys\n .filter((k) => k.startsWith(RECEIVED_PREFIX))\n .map((k) => k.slice(RECEIVED_PREFIX.length));\n const newInvites = [];\n for (const id of receivedIds) {\n try {\n const rumor = await this.decryptGiftWrap(id);\n if (rumor)\n newInvites.push(rumor);\n }\n catch (error) {\n // Event not found in received store (already processed by another call)\n continue;\n }\n }\n return newInvites;\n }\n /**\n * Get all unread invites.\n *\n * @returns Array of unread welcome rumors\n */\n async getUnread() {\n const allKeys = await this.store.keys();\n const invites = [];\n for (const key of allKeys) {\n if (!key.startsWith(UNREAD_PREFIX))\n continue;\n const entry = await this.store.getItem(key);\n if (entry?.type === \"unread\")\n invites.push(entry.rumor);\n }\n return invites;\n }\n /**\n * Get all received (encrypted) invites.\n *\n * @returns Array of received invites awaiting decryption\n */\n async getReceived() {\n const allKeys = await this.store.keys();\n const invites = [];\n for (const key of allKeys) {\n if (!key.startsWith(RECEIVED_PREFIX))\n continue;\n const entry = await this.store.getItem(key);\n if (entry?.type === \"received\")\n invites.push(entry.giftwrap);\n }\n return invites;\n }\n /**\n * Mark an invite as read and remove it from storage.\n *\n * Emits 'inviteRead' event after removal.\n *\n * @param inviteId - The rumor ID (from the welcome rumor)\n */\n async markAsRead(inviteId) {\n this.#log(\"marking invite %s as read\", inviteId);\n await this.store.removeItem(`${UNREAD_PREFIX}${inviteId}`);\n this.emit(\"read\", inviteId);\n }\n /**\n * Watch for unread invites.\n *\n * Yields the current array of unread invites, then yields again\n * whenever the unread list changes (via 'newInvite' or 'inviteRead' events).\n *\n * This does NOT automatically mark invites as read - the app must\n * call markAsRead() after processing each invite.\n *\n * @example\n * ```typescript\n * for await (const invites of inviteReader.watchUnread()) {\n * for (const invite of invites) {\n * await client.joinGroupFromWelcome({ welcomeRumor: invite });\n * await inviteReader.markAsRead(invite.id);\n * }\n * }\n * ```\n */\n async *watchUnread() {\n yield await this.getUnread();\n while (true) {\n await new Promise((resolve) => {\n const handler = () => {\n resolve();\n this.off(\"decrypted\", handler);\n this.off(\"read\", handler);\n };\n this.once(\"decrypted\", handler);\n this.once(\"read\", handler);\n });\n yield await this.getUnread();\n }\n }\n /**\n * Watch for received (encrypted) invites.\n *\n * Yields the current list of received gift wraps, then yields again\n * whenever the received list changes (via 'ReceivedGiftWrap' or 'receivedProcessed' events).\n *\n * @example\n * ```typescript\n * for await (const received of inviteReader.watchReceived()) {\n * console.log(`${received.length} gift wraps waiting to decrypt`);\n * }\n * ```\n */\n async *watchReceived() {\n yield await this.getReceived();\n while (true) {\n await new Promise((resolve) => {\n const handler = () => {\n resolve();\n this.off(\"received\", handler);\n this.off(\"processed\", handler);\n };\n this.once(\"received\", handler);\n this.once(\"processed\", handler);\n });\n yield await this.getReceived();\n }\n }\n /**\n * Clear all stored invites (received and unread).\n *\n * Note: This does NOT clear the seen index to maintain deduplication history.\n * If you need to clear seen events, use clearSeen() or create a fresh store.\n */\n async clear() {\n const allKeys = await this.store.keys();\n for (const key of allKeys) {\n if (key.startsWith(RECEIVED_PREFIX) || key.startsWith(UNREAD_PREFIX)) {\n await this.store.removeItem(key);\n }\n }\n }\n /**\n * Clear the seen event IDs.\n * Warning: This will allow previously processed events to be re-ingested.\n */\n async clearSeen() {\n await this.store.removeItem(SEEN_KEY);\n this.seenCache = null;\n }\n}\n//# sourceMappingURL=invite-manager.js.map","import { bytesToHex, randomBytes } from \"@noble/hashes/utils.js\";\nimport { EventEmitter } from \"eventemitter3\";\nimport { ciphersuites, defaultCryptoProvider, } from \"ts-mls\";\nimport { createCredential } from \"../core/credential.js\";\nimport { createDeleteKeyPackageEvent, createKeyPackageEvent, getKeyPackage, getKeyPackageIdentifier, getKeyPackageReference, getKeyPackageRelays, } from \"../core/key-package-event.js\";\nimport { calculateKeyPackageRef, generateKeyPackage, } from \"../core/key-package.js\";\nimport { ADDRESSABLE_KEY_PACKAGE_KIND, KEY_PACKAGE_KIND, } from \"../core/protocol.js\";\nimport { logger } from \"../utils/debug.js\";\nfunction getReplaceableEventKey(event) {\n const identifier = getKeyPackageIdentifier(event);\n if (identifier === undefined)\n return undefined;\n return `${event.kind}:${event.pubkey}:${identifier}`;\n}\nfunction deduplicatePublishedEvents(events) {\n const seenIds = new Set();\n const replaceableIndexes = new Map();\n const deduplicated = [];\n for (const event of events) {\n if (seenIds.has(event.id))\n continue;\n seenIds.add(event.id);\n const replaceableKey = getReplaceableEventKey(event);\n if (replaceableKey === undefined) {\n deduplicated.push(event);\n continue;\n }\n const existingIndex = replaceableIndexes.get(replaceableKey);\n if (existingIndex === undefined) {\n replaceableIndexes.set(replaceableKey, deduplicated.length);\n deduplicated.push(event);\n continue;\n }\n const existing = deduplicated[existingIndex];\n if (event.created_at > existing.created_at) {\n deduplicated[existingIndex] = event;\n }\n }\n return deduplicated;\n}\n// ---------------------------------------------------------------------------\n// Error types\n// ---------------------------------------------------------------------------\n/**\n * Thrown by {@link KeyPackageManager.create} when no relay URLs are provided.\n * Callers can catch this specifically to prompt the user for relay configuration.\n */\nexport class MissingRelayError extends Error {\n constructor() {\n super(\"At least one relay URL is required to publish a key package\");\n this.name = \"MissingRelayError\";\n }\n}\n/**\n * Thrown by {@link KeyPackageManager.create} when no slot identifier (`d` tag)\n * can be determined — neither passed in options nor set as `clientId` on the\n * manager. Set `clientId` on the manager or pass `d` in the options.\n */\nexport class MissingSlotIdentifierError extends Error {\n constructor() {\n super(\"Cannot create key package: no slot identifier available. Pass 'd' in options or set 'clientId' on the manager.\");\n this.name = \"MissingSlotIdentifierError\";\n }\n}\n/**\n * Thrown by {@link KeyPackageManager.rotate} when the given key package\n * reference is not found in the local store.\n */\nexport class KeyPackageNotFoundError extends Error {\n constructor(refHex) {\n super(`Key package not found: ${refHex}`);\n this.name = \"KeyPackageNotFoundError\";\n }\n}\n/**\n * Thrown by {@link KeyPackageManager.rotate} when no relay URLs can be\n * determined for the replacement key package — neither passed explicitly\n * nor recoverable from the old package's publish records.\n */\nexport class KeyPackageRotatePreconditionError extends Error {\n constructor() {\n super(\"Cannot rotate: no relay URLs available. Pass relays in options or ensure the old key package has published events.\");\n this.name = \"KeyPackageRotatePreconditionError\";\n }\n}\n/**\n * Manages the full lifecycle of MLS key packages — local private material and\n * the Nostr kind-30443 events that advertise this client to potential inviters.\n *\n * Legacy kind-443 events are supported for reading and deletion only; new\n * events are always published as kind 30443.\n *\n * @example\n * ```typescript\n * const manager = new KeyPackageManager({\n * backend: myKeyValueBackend,\n * signer,\n * network,\n * clientId: \"my-app-desktop\",\n * });\n * const pkg = await manager.create({ relays: [\"wss://relay.example.com\"] });\n *\n * // Feed observed relay events — kind 443 and kind 30443 with an `i` tag are recorded\n * await manager.track(nostrEvent);\n *\n * // Rotate: publish a new kind 30443 under the same `d` slot (relay replaces automatically)\n * const newPkg = await manager.rotate(pkg.keyPackageRef);\n *\n * // List all key packages, filtering to those with published events\n * const published = (await manager.list()).filter(p => p.published.length > 0);\n * ```\n */\nexport class KeyPackageManager extends EventEmitter {\n /**\n * Default slot identifier (`d` tag value) used by {@link create} when no\n * explicit `d` is passed in options. Set this to a stable string (e.g.\n * `\"my-app-desktop\"`) so all key packages from this manager share a single\n * addressable slot on relays.\n */\n clientId;\n store;\n cryptoProvider;\n signer;\n network;\n #log = logger.extend(\"KeyPackageManager\");\n constructor(options) {\n super();\n this.store = options.store;\n this.cryptoProvider = options.cryptoProvider ?? defaultCryptoProvider;\n this.signer = options.signer;\n this.network = options.network;\n this.clientId = options.clientId;\n }\n // ---------------------------------------------------------------------------\n // Storage helpers (inlined from KeyPackageStore)\n // ---------------------------------------------------------------------------\n /** Resolves a ref argument to a hex storage key */\n resolveStorageKey(ref) {\n if (typeof ref === \"string\")\n return ref;\n return bytesToHex(ref);\n }\n /**\n * Adds a {@link LocalKeyPackage} to the store.\n *\n * @param keyPackage - Must include `publicPackage` and `privatePackage`.\n * Optionally include `identifier` to persist the addressable slot identifier.\n * @returns The storage key (hex ref string)\n */\n async add(keyPackage) {\n const keyPackageRef = await calculateKeyPackageRef(keyPackage.publicPackage, this.cryptoProvider);\n const key = bytesToHex(keyPackageRef);\n const entry = {\n keyPackageRef,\n publicPackage: keyPackage.publicPackage,\n privatePackage: keyPackage.privatePackage,\n ...(keyPackage.identifier !== undefined\n ? { identifier: keyPackage.identifier }\n : {}),\n ...(keyPackage.published !== undefined\n ? { published: deduplicatePublishedEvents(keyPackage.published) }\n : {}),\n };\n await this.store.setItem(key, entry);\n this.emit(\"added\", entry);\n this.#log(\"added %s\" + (entry.privatePackage ? \" with private key\" : \"\"), key);\n return key;\n }\n /**\n * Appends a kind-443 or kind-30443 Nostr event to the `published` list of\n * the key package identified by `ref`. If no entry exists yet, a\n * {@link TrackedKeyPackage} is created by decoding the public key package\n * from the event body.\n *\n * Throws if the event body cannot be decoded as a valid key package.\n */\n async storeAddPublished(ref, event) {\n const key = typeof ref === \"string\" ? ref : bytesToHex(ref);\n const existing = await this.store.getItem(key);\n // Extract the addressable slot identifier if this is a kind 30443 event\n const identifier = getKeyPackageIdentifier(event);\n if (existing) {\n const published = deduplicatePublishedEvents([\n ...(existing.published ?? []),\n event,\n ]);\n const shouldPersistIdentifier = identifier !== undefined && existing.identifier === undefined;\n const publishedChanged = existing.published === undefined ||\n published.length !== existing.published.length ||\n !published.every((e, index) => e.id === existing.published?.[index]?.id);\n if (!publishedChanged && !shouldPersistIdentifier) {\n return;\n }\n const updated = {\n ...existing,\n // Persist identifier if discovered for the first time on this entry\n ...(shouldPersistIdentifier ? { identifier } : {}),\n published,\n };\n await this.store.setItem(key, updated);\n this.emit(\"updated\", updated);\n this.#log(\"stored published event %s for %s\", event.id, ref);\n }\n else {\n // No local entry — decode the public key package from the event body.\n // Throws if the event content is not a valid encoded KeyPackage.\n const publicPackage = getKeyPackage(event);\n const keyPackageRef = await calculateKeyPackageRef(publicPackage, this.cryptoProvider);\n const entry = {\n keyPackageRef,\n publicPackage,\n ...(identifier !== undefined ? { identifier } : {}),\n published: [event],\n };\n await this.store.setItem(key, entry);\n this.emit(\"added\", entry);\n this.#log(\"added key package from event %s\", event.id);\n }\n }\n /**\n * Retrieves the stored key package entry.\n * Returns any entry regardless of whether it has private material.\n */\n async storeGetKeyPackage(ref) {\n const key = this.resolveStorageKey(ref);\n return this.store.getItem(key);\n }\n /**\n * Removes a key package from the backend.\n */\n async storeRemove(ref) {\n const key = this.resolveStorageKey(ref);\n const stored = await this.store.getItem(key);\n await this.store.removeItem(key);\n if (stored) {\n this.emit(\"removed\", stored.keyPackageRef);\n this.#log(\"removed key package %s\", key);\n }\n }\n /**\n * Lists all {@link LocalKeyPackage} entries (those with private material),\n * without the private package itself.\n */\n async storeList() {\n const allKeys = await this.store.keys();\n const packages = await Promise.all(allKeys.map((key) => this.store.getItem(key)));\n return packages\n .filter((pkg) => pkg !== null && pkg.privatePackage !== undefined)\n .map(({ keyPackageRef, publicPackage, identifier, published, used }) => ({\n keyPackageRef,\n publicPackage,\n ...(identifier !== undefined ? { identifier } : {}),\n ...(published !== undefined ? { published } : {}),\n ...(used !== undefined ? { used } : {}),\n }));\n }\n // ---------------------------------------------------------------------------\n // Creation and publishing\n // ---------------------------------------------------------------------------\n /**\n * Creates a new key package, stores the private material locally, signs and\n * publishes a kind 30443 addressable event to the specified relays, and\n * records the event.\n *\n * The `d` (slot identifier) is resolved in order:\n * 1. `options.d` (explicit)\n * 2. `this.clientId` (manager default)\n * 3. Throws {@link MissingSlotIdentifierError}\n *\n * @param options - Creation options, including required relay URLs\n * @returns The stored key package (without private material)\n * @throws {MissingRelayError} if relays is empty\n * @throws {MissingSlotIdentifierError} if no slot identifier can be determined\n */\n async create(options) {\n if (!options.relays || options.relays.length === 0) {\n throw new MissingRelayError();\n }\n const identifier = options.identifier ?? this.clientId;\n if (!identifier) {\n throw new MissingSlotIdentifierError();\n }\n this.#log(\"creating key package on relays: %O\", options.relays);\n const pubkey = await this.signer.getPublicKey();\n const credential = createCredential(pubkey);\n const ciphersuite = await this.#getCiphersuiteImpl(options.ciphersuite);\n const keyPackage = await generateKeyPackage({\n credential,\n ciphersuiteImpl: ciphersuite,\n isLastResort: options.isLastResort,\n });\n // Store private material locally, including the slot identifier\n const refHex = await this.add({ ...keyPackage, identifier: identifier });\n // Build, sign and publish the kind 30443 event\n const eventTemplate = await createKeyPackageEvent({\n keyPackage: keyPackage.publicPackage,\n identifier: identifier,\n relays: options.relays,\n client: options.client,\n protected: options.protected,\n });\n const signed = await this.signer.signEvent(eventTemplate);\n await this.network.publish(options.relays, signed);\n // Record the published event on the stored entry\n await this.storeAddPublished(refHex, signed);\n const stored = await this.storeGetKeyPackage(refHex);\n if (!stored)\n throw new Error(\"Key package not found after store operation\");\n this.emit(\"published\", refHex, signed.id, options.relays);\n this.#log(\"created and published key package %s with slot %s\", refHex, identifier);\n return {\n keyPackageRef: stored.keyPackageRef,\n publicPackage: stored.publicPackage,\n identifier: stored.identifier,\n };\n }\n // ---------------------------------------------------------------------------\n // Rotation\n // ---------------------------------------------------------------------------\n /**\n * Rotates a key package: publishes a new kind 30443 event (reusing the same\n * `d` slot so relays replace the old event automatically), then removes the\n * old private key material.\n *\n * For legacy kind-443 published events on the entry, a NIP-09 deletion is\n * sent before publishing the replacement. Kind-30443 published events do not\n * need explicit deletion — the new event supersedes them on relays.\n *\n * @param ref - The key package reference of the key package to rotate\n * @param options - Options for the new key package\n * @returns The new stored key package (without private material)\n * @throws {KeyPackageNotFoundError} if the key package ref is not found in the local store\n * @throws {KeyPackageRotatePreconditionError} if no relay URLs can be determined for the new key package\n */\n async rotate(ref, options) {\n const refHex = typeof ref === \"string\" ? ref : bytesToHex(ref);\n this.#log(\"rotating key package %s\", refHex);\n const existing = await this.storeGetKeyPackage(ref);\n if (!existing) {\n throw new KeyPackageNotFoundError(refHex);\n }\n // Determine relays for the new key package\n const oldEvents = existing.published ?? [];\n const relaysForNew = options?.relays ??\n (oldEvents.length > 0\n ? getKeyPackageRelays(oldEvents[oldEvents.length - 1])\n : undefined);\n if (!relaysForNew || relaysForNew.length === 0) {\n throw new KeyPackageRotatePreconditionError();\n }\n // Resolve the slot identifier for the new event:\n // prefer an explicit override, then the stored entry's d (same slot = relay auto-replaces),\n // then generate a fresh random value.\n const newD = options?.d ?? existing.identifier ?? bytesToHex(randomBytes(32));\n // Publish NIP-09 deletion only for legacy kind-443 published events.\n // Kind-30443 events are superseded automatically by the new event on relays.\n const legacyEvents = oldEvents.filter((e) => e.kind === KEY_PACKAGE_KIND);\n if (legacyEvents.length > 0) {\n const eventIds = legacyEvents.map((e) => e.id);\n const deleteTemplate = createDeleteKeyPackageEvent({ events: eventIds });\n const signedDelete = await this.signer.signEvent(deleteTemplate);\n const allOldRelays = [\n ...new Set(legacyEvents.flatMap((e) => getKeyPackageRelays(e) ?? [])),\n ];\n await this.network.publish(allOldRelays, signedDelete);\n }\n // Create and publish the new key package under the resolved slot\n const newPkg = await this.create({\n relays: relaysForNew,\n identifier: newD,\n ciphersuite: options?.ciphersuite,\n isLastResort: options?.isLastResort,\n client: options?.client,\n protected: options?.protected,\n });\n // Remove old private key material (and its published events)\n await this.storeRemove(ref);\n return newPkg;\n }\n // ---------------------------------------------------------------------------\n // Removal\n // ---------------------------------------------------------------------------\n /**\n * Removes a key package from local private key storage only.\n *\n * Does not publish a relay deletion and does not touch publish records.\n * Use when the key package was never published, or when relay cleanup has\n * already been handled separately.\n *\n * @param ref - The key package reference to remove\n */\n async remove(ref) {\n const refHex = typeof ref === \"string\" ? ref : bytesToHex(ref);\n await this.storeRemove(ref);\n this.#log(\"removed key package %s from local store\", refHex);\n }\n /**\n * Completely purges one or more key packages: publishes a NIP-09 deletion\n * for all known relay event IDs, removes local private key material, and\n * clears the publish records.\n *\n * @param refs - One or more key package references (hex string or Uint8Array)\n */\n async purge(refs) {\n const refList = Array.isArray(refs) ? refs : [refs];\n this.#log(\"purging %d key package(s)\", refList.length);\n // Collect all published events and relays across the provided refs\n const allEvents = [];\n const allRelays = new Set();\n for (const ref of refList) {\n const stored = await this.storeGetKeyPackage(ref);\n const events = stored?.published ?? [];\n for (const event of events) {\n allEvents.push(event);\n for (const relay of getKeyPackageRelays(event) ?? []) {\n allRelays.add(relay);\n }\n }\n }\n // Publish a single kind 5 deletion covering all events, if any\n if (allEvents.length > 0) {\n const draft = createDeleteKeyPackageEvent({ events: allEvents });\n const signed = await this.signer.signEvent(draft);\n await this.network.publish([...allRelays], signed);\n this.#log(\"published %s delete event for %d key packages\", signed.id, allEvents.length);\n }\n // Remove local private key material for all refs\n for (const ref of refList) {\n await this.storeRemove(ref);\n }\n }\n // ---------------------------------------------------------------------------\n // Publish tracking\n // ---------------------------------------------------------------------------\n /**\n * Observes a Nostr event and, if it is a kind 443 or kind 30443 key package\n * event with a valid `i` tag (MIP-00 keyPackageRef), records it in the store.\n *\n * @param event - Any Nostr event; non-key-package events are silently ignored\n * @returns `true` if the event was recorded, `false` if ignored\n */\n async track(event) {\n if (event.kind !== KEY_PACKAGE_KIND &&\n event.kind !== ADDRESSABLE_KEY_PACKAGE_KIND) {\n return false;\n }\n const refHex = getKeyPackageReference(event);\n if (!refHex)\n return false;\n try {\n await this.storeAddPublished(refHex, event);\n }\n catch {\n // Event body could not be decoded as a KeyPackage — treat as invalid\n return false;\n }\n const relays = getKeyPackageRelays(event) ?? [];\n this.emit(\"published\", refHex, event.id, relays);\n return true;\n }\n // ---------------------------------------------------------------------------\n // Queries\n // ---------------------------------------------------------------------------\n /**\n * Lists all locally stored key packages, each enriched with their published\n * Nostr events.\n */\n async list() {\n return this.#buildSnapshot();\n }\n /** Returns the number of locally stored key packages. */\n async count() {\n return (await this.storeList()).length;\n }\n /** Checks whether a key package exists in local private key storage. */\n async has(ref) {\n const key = this.resolveStorageKey(ref);\n const item = await this.store.getItem(key);\n return item !== null && item.privatePackage !== undefined;\n }\n /** Retrieves the full key package from the store. */\n async get(ref) {\n return this.storeGetKeyPackage(ref);\n }\n /**\n * Retrieves the private key material for a key package.\n * Used internally by {@link MarmotClient} when processing Welcome messages.\n *\n * @param ref - The key package reference\n * @returns The private key package, or null if not found\n */\n async getPrivateKey(ref) {\n const key = this.resolveStorageKey(ref);\n const stored = await this.store.getItem(key);\n return stored?.privatePackage ?? null;\n }\n /**\n * Marks a key package as used by setting `used = true` on the stored entry.\n *\n * Does nothing if no entry is found for the given ref.\n *\n * @param ref - The key package reference\n */\n async markUsed(ref) {\n const refHex = typeof ref === \"string\" ? ref : bytesToHex(ref);\n const key = this.resolveStorageKey(ref);\n const existing = await this.store.getItem(key);\n if (!existing)\n return;\n const updated = { ...existing, used: true };\n await this.store.setItem(key, updated);\n this.emit(\"updated\", updated);\n this.#log(\"marked key package %s as used\", refHex);\n }\n /** Clears all entries (local and tracked) from the store. */\n async clear() {\n const allKeys = await this.store.keys();\n for (const key of allKeys) {\n const stored = await this.store.getItem(key);\n await this.store.removeItem(key);\n if (stored) {\n this.emit(\"removed\", stored.keyPackageRef);\n }\n }\n }\n // ---------------------------------------------------------------------------\n // Watching\n // ---------------------------------------------------------------------------\n /**\n * Watches for any change to key packages or their published events.\n *\n * Yields the current snapshot on subscription, then re-yields on every\n * subsequent change.\n */\n async *watchKeyPackages() {\n let resolveNext = null;\n let pending = false;\n const signal = () => {\n if (resolveNext) {\n resolveNext();\n resolveNext = null;\n }\n else {\n pending = true;\n }\n };\n this.on(\"added\", signal);\n this.on(\"removed\", signal);\n this.on(\"updated\", signal);\n this.on(\"published\", signal);\n try {\n yield [...(await this.#buildSnapshot())];\n while (true) {\n await new Promise((resolve) => {\n if (pending) {\n pending = false;\n resolve();\n }\n else {\n resolveNext = resolve;\n }\n });\n yield [...(await this.#buildSnapshot())];\n }\n }\n finally {\n this.off(\"added\", signal);\n this.off(\"removed\", signal);\n this.off(\"updated\", signal);\n this.off(\"published\", signal);\n }\n }\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n async #buildSnapshot() {\n const local = await this.storeList();\n return local.map((pkg) => ({\n ...pkg,\n published: pkg.published ?? [],\n }));\n }\n async #getCiphersuiteImpl(name) {\n const ciphersuiteName = name ?? \"MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519\";\n const id = ciphersuites[ciphersuiteName];\n return defaultCryptoProvider.getCiphersuiteImpl(id);\n }\n}\n//# sourceMappingURL=key-package-manager.js.map","/**\n * A simple in-memory implementation of {@link GenericKeyValueStore}.\n *\n * Data lives only for the lifetime of the process / page — nothing is written\n * to disk. Useful as a default ephemeral backend when persistence is not\n * required or as a drop-in for testing.\n */\nexport class InMemoryKeyValueStore {\n store = new Map();\n async getItem(key) {\n return this.store.get(key) ?? null;\n }\n async setItem(key, value) {\n this.store.set(key, value);\n return value;\n }\n async removeItem(key) {\n this.store.delete(key);\n }\n async clear() {\n this.store.clear();\n }\n async keys() {\n return Array.from(this.store.keys());\n }\n}\n//# sourceMappingURL=in-memory-key-value-store.js.map","import { defaultCryptoProvider, joinGroup, } from \"ts-mls\";\nimport { marmotAuthService } from \"../core/auth-service.js\";\nimport { defaultCapabilities } from \"../core/default-capabilities.js\";\nimport { isRumorLike } from \"../core/nostr.js\";\nimport { getWelcome, getWelcomeKeyPackageRefs, readWelcomeGroupInfo, } from \"../core/welcome.js\";\nimport { logger } from \"../utils/debug.js\";\nimport { GroupsManager } from \"./groups-manager.js\";\nimport { InviteManager } from \"./invite-manager.js\";\nimport { KeyPackageManager } from \"./key-package-manager.js\";\nimport { InMemoryKeyValueStore } from \"../extra/in-memory-key-value-store.js\";\nconst log = logger.extend(\"client\");\nexport class MarmotClient {\n /** The signer used for the clients identity */\n signer;\n /** The capabilities to use for the client */\n capabilities;\n /** The nostr relay pool to use for the client */\n network;\n /** Manages key package lifecycle: local storage, publishing, and rotation */\n keyPackages;\n /** Manages group lifecycle: persistence, caching, creation, loading, leaving */\n groups;\n /** Manages invite lifecycle: ingestion, decryption, and storage */\n invites;\n /** Crypto provider for cryptographic operations */\n cryptoProvider;\n constructor(options) {\n this.signer = options.signer;\n this.capabilities = options.capabilities ?? defaultCapabilities();\n this.network = options.network;\n this.cryptoProvider = options.cryptoProvider ?? defaultCryptoProvider;\n this.keyPackages = new KeyPackageManager({\n store: options.keyPackageStore,\n signer: options.signer,\n network: options.network,\n clientId: options.clientId,\n });\n const historyFactory = (\"historyFactory\" in options ? options.historyFactory : undefined);\n const mediaFactory = (\"mediaFactory\" in options ? options.mediaFactory : undefined);\n this.groups = new GroupsManager({\n store: options.groupStateStore,\n signer: this.signer,\n network: this.network,\n cryptoProvider: this.cryptoProvider,\n historyFactory,\n mediaFactory,\n });\n this.invites = new InviteManager({\n signer: this.signer,\n store: options.inviteStore || new InMemoryKeyValueStore(),\n });\n }\n // ---------------------------------------------------------------------------\n // Welcome / invite flows\n //\n // These are higher-level methods that combine key package lookup with\n // MLS join logic. They delegate group persistence/caching to `this.groups`.\n // ---------------------------------------------------------------------------\n /**\n * Reads the {@link GroupInfo} from a Welcome rumor without joining the group.\n *\n * Finds the local key package that matches one of the welcome's recipient slots,\n * then decrypts the group info using that key package. Useful for previewing\n * group metadata (name, relays, admins) before deciding to join.\n *\n * @param welcomeRumor - The decrypted kind 444 welcome rumor\n * @returns The decrypted GroupInfo, or null if no matching key package is found or decryption fails\n */\n async readInviteGroupInfo(welcomeRumor) {\n const welcome = isRumorLike(welcomeRumor)\n ? getWelcome(welcomeRumor)\n : welcomeRumor;\n const refs = getWelcomeKeyPackageRefs(welcome);\n for (const ref of refs) {\n const stored = await this.keyPackages.get(ref);\n if (!stored?.privatePackage)\n continue;\n try {\n const ciphersuiteImpl = await this.cryptoProvider.getCiphersuiteImpl(stored.publicPackage.cipherSuite);\n return await readWelcomeGroupInfo({\n welcome,\n keyPackage: stored,\n ciphersuiteImpl,\n });\n }\n catch {\n // Ignore error, try other key packages\n }\n }\n return null;\n }\n /**\n * Joins a group from a Welcome message received via NIP-59 gift wrap.\n *\n * This method:\n * 1. Decodes the Welcome message from the kind 444 event\n * 2. Finds the matching local KeyPackage private material from the store\n * 3. Calls ts-mls joinGroup() to create a new ClientState\n * 4. Persists the resulting ClientState via `this.groups.adoptClientState()`\n * 5. Marks the consumed key package as used via `this.keyPackages.markUsed()`\n * 6. Returns a MarmotGroup instance\n *\n * After joining, callers can list used key packages with\n * `(await client.keyPackages.list()).filter(p => p.used)` and rotate them\n * via `client.keyPackages.rotate(ref)` to publish fresh ones to relays.\n *\n * @param options - Options for joining from a Welcome message\n * @param options.welcomeRumor - The unwrapped kind 444 rumor event containing the Welcome message\n * @returns Promise resolving to the joined group\n * @throws Error if no matching KeyPackage is found or if joining fails\n */\n async joinGroupFromWelcome(options) {\n const { welcomeRumor } = options;\n log(\"joining group from welcome rumor %s\", welcomeRumor.id);\n const welcome = getWelcome(welcomeRumor);\n // ts-mls v2: welcome.cipherSuite is a numeric CiphersuiteId\n const ciphersuiteImpl = await this.cryptoProvider.getCiphersuiteImpl(welcome.cipherSuite);\n const allKeyPackages = await this.keyPackages.list();\n const candidatePackages = [];\n // Collect all key packages with matching cipher suite and compute their KeyPackageRef\n // KeyPackageRef is used to identify which encrypted secret in the welcome is ours (RFC 9420)\n for (const keyPackage of allKeyPackages) {\n if (keyPackage.publicPackage.cipherSuite !== welcome.cipherSuite) {\n continue;\n }\n const privateKeyPackage = await this.keyPackages.getPrivateKey(keyPackage.keyPackageRef);\n if (!privateKeyPackage)\n continue;\n // Check if this key package's ref matches any secret in the welcome\n // This is the RFC 9420 KeyPackageRef matching semantics\n const hasMatchingSecret = welcome.secrets.some((secret) => secret.newMember.length === keyPackage.keyPackageRef.length\n ? secret.newMember.every((val, idx) => val === keyPackage.keyPackageRef[idx])\n : false);\n candidatePackages.push({\n publicPackage: keyPackage.publicPackage,\n privatePackage: privateKeyPackage,\n keyPackageRef: keyPackage.keyPackageRef,\n hasMatchingSecret,\n });\n }\n if (candidatePackages.length === 0) {\n throw new Error(\"No matching KeyPackage found in local store. Make sure you have published a KeyPackage event.\");\n }\n // Prioritize packages that have matching secrets in the welcome\n // This ensures we try the most likely candidates first (RFC 9420 compliance)\n const prioritizedKeyPackages = [\n ...candidatePackages.filter((p) => p.hasMatchingSecret),\n ...candidatePackages.filter((p) => !p.hasMatchingSecret),\n ];\n let clientState = null;\n let lastError = null;\n let consumedKeyPackageRef = null;\n for (const keyPackage of prioritizedKeyPackages) {\n try {\n // In v2, joinGroup takes a single params object with context\n clientState = await joinGroup({\n context: {\n cipherSuite: ciphersuiteImpl,\n authService: marmotAuthService,\n externalPsks: {},\n },\n welcome,\n keyPackage: keyPackage.publicPackage,\n privateKeys: keyPackage.privatePackage,\n });\n consumedKeyPackageRef = keyPackage.keyPackageRef;\n break;\n }\n catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n }\n if (!clientState) {\n const errorMessage = lastError\n ? `Failed to join group with any matching key package. Last error: ${lastError.message}`\n : \"Failed to join group with any matching key package\";\n throw new Error(errorMessage);\n }\n // Mark the consumed key package as used. Callers can later list used packages\n // with (await client.keyPackages.list()).filter(p => p.used) and rotate them\n // via client.keyPackages.rotate(ref) to publish fresh ones to relays.\n if (consumedKeyPackageRef) {\n await this.keyPackages.markUsed(consumedKeyPackageRef);\n }\n // Persist and register the joined group via the groups manager. The\n // manager emits `joined` on itself; listen on `client.groups` to observe it.\n const group = await this.groups.adoptClientState(clientState, {\n emit: \"joined\",\n });\n log(\"joined group %s\", group.idStr);\n // MIP-02 SHOULD: callers are responsible for calling group.selfUpdate() after\n // joining to rotate leaf key material for forward secrecy. Doing it automatically\n // here caused the joining member to fork off to a new epoch before other members\n // could ingest the commit.\n return { group };\n }\n}\n//# sourceMappingURL=marmot-client.js.map","/**\n * MIP-01 group image encryption and Blossom upload identity helpers.\n *\n * Provides ChaCha20-Poly1305 encryption/decryption for the group avatar image\n * stored on Blossom, and HKDF-based derivation of the Nostr keypair used to\n * authenticate uploads and deletions.\n *\n * No HTTP client is included. Callers are responsible for uploading encrypted\n * blobs to Blossom (or any content-addressed store).\n */\nimport { chacha20poly1305 } from \"@noble/ciphers/chacha.js\";\nimport { expand as hkdf_expand } from \"@noble/hashes/hkdf.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { randomBytes } from \"@noble/hashes/utils.js\";\nimport { getPublicKey } from \"applesauce-core/helpers\";\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\nconst enc = new TextEncoder();\n/** HKDF info label for MIP-01 Blossom upload keypair derivation. */\nconst MIP01_BLOSSOM_LABEL = enc.encode(\"mip01-blossom-upload-v1\");\n// ---------------------------------------------------------------------------\n// Functions\n// ---------------------------------------------------------------------------\n/**\n * Encrypts a group image using ChaCha20-Poly1305 (MIP-01).\n *\n * Generates cryptographically random `imageKey` and `imageNonce`, encrypts\n * the image, and pre-derives the Blossom upload keypair seed. All output\n * fields should be stored in `MarmotGroupData` via an MLS proposal/commit.\n *\n * @param imageData - The raw image bytes to encrypt\n * @returns Encryption outputs ready to store in `MarmotGroupData`\n */\nexport function encryptGroupImage(imageData) {\n const imageKey = randomBytes(32);\n const imageNonce = randomBytes(12);\n const encrypted = chacha20poly1305(imageKey, imageNonce).encrypt(imageData);\n const imageHash = sha256(encrypted);\n const imageUploadKey = hkdf_expand(sha256, imageKey, MIP01_BLOSSOM_LABEL, 32);\n return { encrypted, imageKey, imageNonce, imageHash, imageUploadKey };\n}\n/**\n * Decrypts a group image using fields from `MarmotGroupData` (MIP-01).\n *\n * @param encrypted - The encrypted blob downloaded from Blossom\n * @param imageKey - `MarmotGroupData.imageKey` (32 bytes)\n * @param imageNonce - `MarmotGroupData.imageNonce` (12 bytes)\n * @returns The decrypted image bytes\n * @throws If AEAD authentication or decryption fails\n */\nexport function decryptGroupImage(encrypted, imageKey, imageNonce) {\n return chacha20poly1305(imageKey, imageNonce).decrypt(encrypted);\n}\n/**\n * Derives the Nostr keypair used to authenticate Blossom upload/delete\n * requests for a group image (MIP-01).\n *\n * Derivation:\n * ```\n * upload_secret = HKDF-Expand(imageKey, \"mip01-blossom-upload-v1\", 32)\n * upload_keypair = secp256k1_keypair_from_secret(upload_secret)\n * ```\n *\n * This is the same value stored in `MarmotGroupData.imageUploadKey`. The\n * function exists so callers can re-derive the keypair from a previously\n * stored `imageKey` at any time — for example, to delete an old image blob\n * from Blossom after updating the group avatar.\n *\n * @param imageKey - `MarmotGroupData.imageKey` (32 bytes)\n * @returns The Blossom upload/delete keypair\n */\nexport function deriveGroupImageBlossomAuthKeypair(imageKey) {\n const secretKey = hkdf_expand(sha256, imageKey, MIP01_BLOSSOM_LABEL, 32);\n const pubkey = getPublicKey(secretKey);\n return { secretKey, pubkey };\n}\n//# sourceMappingURL=group-image.js.map"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172],"mappings":"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"}