@makaio/framework 1.0.0-dev-1789609124644 → 1.0.0-dev-1790066089222

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 (361) hide show
  1. package/dist/.makaio-build.json +2 -2
  2. package/dist/{adapter-C4v_gNTI.mjs → adapter-DSRgsh2d.mjs} +1 -1
  3. package/dist/adapter-subsystem/index.d.mts +15 -7
  4. package/dist/adapter-subsystem/index.mjs +1 -1
  5. package/dist/adapters/claude/index.mjs +3 -3
  6. package/dist/adapters/config/index.d.mts +1 -1
  7. package/dist/adapters/index.d.mts +2 -2
  8. package/dist/adapters/node.d.mts +1 -1
  9. package/dist/{attempt-record-codec-DaQ3WHUs.mjs → attempt-record-codec-DXpdMgyI.mjs} +1 -1
  10. package/dist/bus/index.d.mts +120 -8
  11. package/dist/bus/index.mjs +1 -1
  12. package/dist/bus-ceMF9rsq.mjs +9 -0
  13. package/dist/client-DWSwtFyI.mjs +1 -0
  14. package/dist/clients/index.d.mts +179 -12
  15. package/dist/clients/index.mjs +1 -1
  16. package/dist/clients/managed-install.d.mts +1 -1
  17. package/dist/code-execution/worker-entry.d.mts +1 -1
  18. package/dist/code-execution/worker-entry.mjs +1 -1
  19. package/dist/{code-execution-pUF4IO462.mjs → code-execution-DWSux6k1.mjs} +1 -1
  20. package/dist/contracts/adapter/index.d.mts +2 -2
  21. package/dist/contracts/adapter/index.mjs +1 -1
  22. package/dist/contracts/adapter/schemas/session-lineage.d.mts +1 -1
  23. package/dist/contracts/artifact/index.d.mts +2 -2
  24. package/dist/contracts/auth/index.d.mts +2 -2
  25. package/dist/contracts/automation-trigger/index.d.mts +3 -3
  26. package/dist/contracts/canonical-model/index.d.mts +1 -1
  27. package/dist/contracts/capabilities/index.d.mts +1 -1
  28. package/dist/contracts/client/index.d.mts +3 -3
  29. package/dist/contracts/client/index.mjs +1 -1
  30. package/dist/contracts/code-execution/index.d.mts +1 -1
  31. package/dist/contracts/common/index.d.mts +1 -1
  32. package/dist/contracts/config/index.d.mts +2 -47
  33. package/dist/contracts/context-projection/index.d.mts +232 -0
  34. package/dist/contracts/context-projection/index.mjs +1 -0
  35. package/dist/contracts/extension/index.d.mts +6 -6
  36. package/dist/contracts/extension/index.mjs +1 -1
  37. package/dist/contracts/facet/index.d.mts +1 -1
  38. package/dist/contracts/harness/index.d.mts +1 -1
  39. package/dist/contracts/host/index.d.mts +1 -1
  40. package/dist/contracts/index.d.mts +43 -43
  41. package/dist/contracts/index.mjs +1 -1
  42. package/dist/contracts/materialization/index.d.mts +2 -2
  43. package/dist/contracts/model-registry/index.d.mts +1 -1
  44. package/dist/contracts/native-session-supervisor/index.d.mts +1 -1
  45. package/dist/contracts/platform/index.d.mts +1 -1
  46. package/dist/contracts/provider/index.d.mts +2 -2
  47. package/dist/contracts/reaction/index.d.mts +1 -1
  48. package/dist/contracts/session/index.d.mts +3 -3
  49. package/dist/contracts/session/index.mjs +1 -1
  50. package/dist/contracts/shared/index.d.mts +2 -2
  51. package/dist/contracts/skill/index.d.mts +1 -1
  52. package/dist/contracts/telemetry/index.d.mts +1 -1
  53. package/dist/contracts/timeout/index.d.mts +1 -1
  54. package/dist/contracts/variant/index.d.mts +1 -1
  55. package/dist/contracts/worker/index.d.mts +2 -2
  56. package/dist/contracts/workflow/index.d.mts +2 -2
  57. package/dist/{contribution-DDbHzCPF.d.mts → contribution-1GL7Rjaq.d.mts} +2 -2
  58. package/dist/credential-ref-w4ZYpYW0.d.mts +49 -0
  59. package/dist/{definition-CuaBQyde.d.mts → definition-DeIGoROj.d.mts} +1 -1
  60. package/dist/{descriptor-to-package-Dw8dnl5E.mjs → descriptor-to-package-BPIArq6N.mjs} +1 -1
  61. package/dist/{detached-extension-handle-DN3aqLyq.mjs → detached-extension-handle-W5_yfCyE.mjs} +1 -1
  62. package/dist/drizzle/0040_session_generation.sql +1 -0
  63. package/dist/drizzle/0041_session_principal_owner.sql +1 -0
  64. package/dist/drizzle/meta/_journal.json +14 -0
  65. package/dist/{execution-attempt-owner-recovery-CE_rvHKE.mjs → execution-attempt-owner-recovery-BZOEVYFH.mjs} +1 -1
  66. package/dist/extension-C6ANjR33.mjs +1 -0
  67. package/dist/{extension-context-BH31eOMv.d.mts → extension-context-pQ7Uio_s.d.mts} +44 -1
  68. package/dist/{extension-discovery-CA2IhDRo.d.mts → extension-discovery-Rup-gANp.d.mts} +114 -15
  69. package/dist/extension-kOwzAMud.mjs +1 -0
  70. package/dist/extension-namespace-CeRpt6C8.mjs +1 -0
  71. package/dist/{framework-packages-Bg4edkkM.mjs → framework-packages-U4Xhouxe.mjs} +1 -1
  72. package/dist/{hook-responses-Dq16X3Cb.d.mts → hook-responses-B882RcQc.d.mts} +48 -5
  73. package/dist/{index-Dm3d490n.d.mts → index-B2bxgKiK.d.mts} +1 -1
  74. package/dist/{index-7CVumCjj.d.mts → index-BTpkpHIS.d.mts} +65 -9
  75. package/dist/{index-Bh57xARQ.d.mts → index-BUv9gfRT.d.mts} +3 -3
  76. package/dist/{index-C6e9cwAl2.d.mts → index-BjQtqMxP2.d.mts} +4 -4
  77. package/dist/{index-B-u0Tu8X.d.mts → index-Bqi44ODz.d.mts} +37 -37
  78. package/dist/{index-CIzvBH8O.d.mts → index-C8two8wz.d.mts} +1 -1
  79. package/dist/{index-oxZt93RL.d.mts → index-CESqYf8a.d.mts} +2 -2
  80. package/dist/{index-C87P0WpY2.d.mts → index-CmCLAMNs.d.mts} +1 -1
  81. package/dist/index-CyEE1RI5.d.mts +869 -0
  82. package/dist/{index-De_oh9M-2.d.mts → index-D6Uq1btG.d.mts} +87 -10
  83. package/dist/{index-CRZ1jrxp.d.mts → index-DDSt0uS2.d.mts} +160 -12
  84. package/dist/{index-B6WkHnCQ.d.mts → index-DRxgmrad.d.mts} +1 -1
  85. package/dist/{index-U--ajOHy.d.mts → index-DUYjTfHD.d.mts} +1 -1
  86. package/dist/{index-HJkz7i4E.d.mts → index-DdJKsdya.d.mts} +188 -10
  87. package/dist/{index-B4pPwpKk.d.mts → index-DfREUyAk.d.mts} +1 -1
  88. package/dist/{index-ClKwF6LE.d.mts → index-Di-R1gmo.d.mts} +2 -2
  89. package/dist/{index-DWANFpTG.d.mts → index-Jdju2W3y.d.mts} +1 -1
  90. package/dist/{index-DQKVQPUS.d.mts → index-L6mssyeZ.d.mts} +1 -1
  91. package/dist/{index-B8v1-2-V2.d.mts → index-anIxF_eT.d.mts} +1 -1
  92. package/dist/{index-iVisrVdC2.d.mts → index-bYBnDBl32.d.mts} +539 -4
  93. package/dist/{index-Bg3WVL8n.d.mts → index-gNdH1F6r.d.mts} +531 -26
  94. package/dist/{index-zmDRR8gv2.d.mts → index-m5ZQFglW2.d.mts} +1 -1
  95. package/dist/{index-mTaFX2HH2.d.mts → index-uk8icWON2.d.mts} +419 -19
  96. package/dist/kernel/cli/index.d.mts +2 -2
  97. package/dist/kernel/cli/register.d.mts +1 -1
  98. package/dist/kernel/extension/index.d.mts +3 -2
  99. package/dist/kernel/extension/index.mjs +1 -1
  100. package/dist/kernel/index.d.mts +6 -6
  101. package/dist/kernel/index.mjs +1 -1
  102. package/dist/kernel/namespace/index.d.mts +1 -1
  103. package/dist/kernel/observability/index.d.mts +2 -2
  104. package/dist/kernel/observability/index.mjs +1 -1
  105. package/dist/kernel/providers/index.d.mts +1 -1
  106. package/dist/kernel/window/index.d.mts +1 -1
  107. package/dist/{lib-BF5XBSfw.mjs → lib-BdyGVjpO.mjs} +1 -1
  108. package/dist/{lib-Dljw2Cqh.mjs → lib-DxP3tPm9.mjs} +1 -1
  109. package/dist/load-extensions-BGfSWW_R.mjs +1 -0
  110. package/dist/{load-extensions-DGstT4_p.d.mts → load-extensions-Be_lOjm_.d.mts} +27 -14
  111. package/dist/mcp-http-server/index.mjs +1 -1
  112. package/dist/{namespace-BMdYJN_t.mjs → namespace-CqJhR19O.mjs} +1 -1
  113. package/dist/{namespace-Cmu-5_P9.d.mts → namespace-DudchWPb.d.mts} +457 -0
  114. package/dist/{namespace-BEbQb19g.d.mts → namespace-Eir1wQ_r.d.mts} +2 -2
  115. package/dist/node/bus-server/index.d.mts +1 -1
  116. package/dist/node/bus-server/server-lifecycle.d.mts +1 -1
  117. package/dist/node/transports/index.d.mts +102 -4
  118. package/dist/node/transports/index.mjs +2 -2
  119. package/dist/{orchestrator-shared-CtPB6PAr.mjs → orchestrator-shared-CF-jPH91.mjs} +1 -1
  120. package/dist/ownership-memory-handler-C-y9zQf8.mjs +1 -0
  121. package/dist/package-AlsbnlSt.mjs +159 -0
  122. package/dist/{package-CDj3F-L3.d.mts → package-CwyC-Krg.d.mts} +1 -1
  123. package/dist/{package-DYScYC0D.mjs → package-kkPGlxMm.mjs} +1 -1
  124. package/dist/package.json +1 -1
  125. package/dist/{registry-DNMjJ-Oj.mjs → registry-DtaRGU8i.mjs} +1 -0
  126. package/dist/rules/index.d.mts +1 -1
  127. package/dist/rules/index.mjs +1 -1
  128. package/dist/rules/schemas.d.mts +1 -1
  129. package/dist/runtime-bun/index.d.mts +2 -2
  130. package/dist/runtime-bun/index.mjs +1 -1
  131. package/dist/runtime-node/boot-config.d.mts +45 -0
  132. package/dist/runtime-node/boot-config.mjs +1 -0
  133. package/dist/runtime-node/code-execution/index.d.mts +2 -2
  134. package/dist/runtime-node/code-execution/index.mjs +1 -1
  135. package/dist/runtime-node/extension-discovery.d.mts +2 -2
  136. package/dist/runtime-node/extension-discovery.mjs +1 -1
  137. package/dist/runtime-node/extension-validation.d.mts +1 -1
  138. package/dist/runtime-node/extension-validation.mjs +1 -1
  139. package/dist/runtime-node/index.d.mts +345 -27
  140. package/dist/runtime-node/index.mjs +21 -24
  141. package/dist/runtime-node/makaio-config.d.mts +1 -1
  142. package/dist/runtime-node/makaio-config.mjs +1 -1
  143. package/dist/runtime-node/workflow-worker/index.d.mts +1 -1
  144. package/dist/runtime-node/workflow-worker/index.mjs +1 -1
  145. package/dist/runtime-node/workflow-worker/worker-entry.mjs +1 -1
  146. package/dist/{schema-BA1cHBbc.d.mts → schema-FY0EakKe.d.mts} +56 -0
  147. package/dist/schemas-CkxAK13D.mjs +1 -0
  148. package/dist/{schemas-CaYEFzK_.d.mts → schemas-FgVQek-j.d.mts} +2 -2
  149. package/dist/services/adapter-runtime/index.d.mts +3 -3
  150. package/dist/services/adapter-runtime/namespace.d.mts +1 -1
  151. package/dist/services/adapter-runtime/schemas.d.mts +1 -1
  152. package/dist/services/adapter-subsystem/index.d.mts +3 -3
  153. package/dist/services/adapter-subsystem/namespace.d.mts +1 -1
  154. package/dist/services/agent-runtime/index.d.mts +2 -2
  155. package/dist/services/agent-runtime/namespace.d.mts +1 -1
  156. package/dist/services/agent-runtime/schemas.d.mts +1 -1
  157. package/dist/services/automation-trigger/index.d.mts +19 -0
  158. package/dist/services/capability/index.d.mts +2 -2
  159. package/dist/services/code-execution/index.d.mts +1 -1
  160. package/dist/services/codebase/index.d.mts +2 -2
  161. package/dist/services/codebase/namespace.d.mts +1 -1
  162. package/dist/services/codebase/schemas.d.mts +1 -1
  163. package/dist/services/compression/index.d.mts +2 -2
  164. package/dist/services/compression/namespace.d.mts +1 -1
  165. package/dist/services/compression/schemas.d.mts +1 -1
  166. package/dist/services/context-projection/index.d.mts +94 -0
  167. package/dist/services/context-projection/index.mjs +1 -0
  168. package/dist/services/context-rules/index.d.mts +1 -1
  169. package/dist/services/execution-target/index.d.mts +3 -3
  170. package/dist/services/execution-target/namespace.d.mts +1 -1
  171. package/dist/services/execution-target/schemas.d.mts +1 -1
  172. package/dist/services/filesystem/index.d.mts +1 -1
  173. package/dist/services/index.d.mts +45 -40
  174. package/dist/services/index.mjs +1 -1
  175. package/dist/services/log-import/browser.d.mts +2 -2
  176. package/dist/services/log-import/index.d.mts +2 -2
  177. package/dist/services/log-import/log-import.d.mts +1 -1
  178. package/dist/services/materialization/index.d.mts +1 -1
  179. package/dist/services/model-registry/index.d.mts +1 -1
  180. package/dist/services/preferences/index.d.mts +2 -2
  181. package/dist/services/preferences/schemas.d.mts +1 -1
  182. package/dist/services/preferences/storage-namespace.d.mts +2 -2
  183. package/dist/services/provider-context/index.d.mts +1 -1
  184. package/dist/services/session/handlers/index.d.mts +1 -1
  185. package/dist/services/session/index.d.mts +9 -9
  186. package/dist/services/session/index.mjs +1 -1
  187. package/dist/services/session/messages/namespace.d.mts +1 -1
  188. package/dist/services/session/orchestrator-testing/index.d.mts +1 -1
  189. package/dist/services/session/orchestrator-testing/index.mjs +1 -1
  190. package/dist/services/session/session-events/namespace.d.mts +1 -1
  191. package/dist/services/session/storage/namespace.d.mts +1 -1
  192. package/dist/services/session/storage/schema.d.mts +1 -1
  193. package/dist/services/session/storage/schema.mjs +1 -1
  194. package/dist/services/session/testing/index.mjs +4 -2
  195. package/dist/services/session/testing/orchestrator-shared.d.mts +1 -1
  196. package/dist/services/session/testing/orchestrator-shared.mjs +1 -1
  197. package/dist/services/session/turns/namespace.d.mts +1 -1
  198. package/dist/services/session-editor/index.d.mts +1 -1
  199. package/dist/services/settings/index.d.mts +3 -3
  200. package/dist/services/settings/namespace.d.mts +232 -3
  201. package/dist/services/settings/namespace.mjs +1 -1
  202. package/dist/services/settings/storage/clients-namespace.d.mts +1 -1
  203. package/dist/services/settings/storage/index.d.mts +3 -3
  204. package/dist/services/settings/storage/providers-namespace.d.mts +1 -1
  205. package/dist/services/subagent/index.d.mts +1 -1
  206. package/dist/services/subagent-template/index.d.mts +2 -2
  207. package/dist/services/subagent-template/namespace.d.mts +1 -1
  208. package/dist/services/subagent-template/schemas.d.mts +1 -1
  209. package/dist/services/tool-approval/index.d.mts +1 -1
  210. package/dist/services/tool-approval/index.mjs +1 -1
  211. package/dist/services/tools/index.d.mts +1 -1
  212. package/dist/services/tools/index.mjs +1 -1
  213. package/dist/services/tray-menu/index.d.mts +3 -3
  214. package/dist/services/tray-menu/namespace.d.mts +1 -1
  215. package/dist/services/tray-menu/schemas.d.mts +1 -1
  216. package/dist/services/turn/index.d.mts +1 -1
  217. package/dist/services/turn/namespace.d.mts +1 -1
  218. package/dist/services/workflow-transitions/index.d.mts +1 -1
  219. package/dist/services/workflow-transitions/index.mjs +1 -1
  220. package/dist/session-BNiMZnfF.mjs +1 -0
  221. package/dist/session-CMbztxNO.mjs +95 -0
  222. package/dist/src-BZdw54VU.mjs +1 -0
  223. package/dist/{src-CbAw9kjJ.mjs → src-C0sw_Vs_.mjs} +1 -1
  224. package/dist/{src-Xn6SS74f.mjs → src-CqQSqLQI.mjs} +1 -1
  225. package/dist/storage/drizzle/client.d.mts +1 -1
  226. package/dist/storage/drizzle/client.mjs +1 -1
  227. package/dist/storage/drizzle/index.d.mts +1 -1
  228. package/dist/storage/drizzle/index.mjs +1 -1
  229. package/dist/storage/handlers/drizzle/index.d.mts +1 -1
  230. package/dist/storage/handlers/index.d.mts +1 -1
  231. package/dist/{tool-approval-service-pbkGcAV8.mjs → tool-approval-service-CRo3fZRF.mjs} +1 -1
  232. package/dist/{tools-C5Gy0IQG.mjs → tools-CKaxi3Mb.mjs} +1 -1
  233. package/dist/{transition-D-Lgbp1j.d.mts → transition-DMv8cgEd.d.mts} +2 -2
  234. package/dist/{types-CjYcHDPo2.d.mts → types-7L3BrU9m2.d.mts} +1 -1
  235. package/dist/{types-DhbllltK.d.mts → types-DNYO_Rxj.d.mts} +12 -3
  236. package/dist/ui-hooks/index.d.mts +17 -24
  237. package/dist/ui-hooks/index.mjs +1 -1
  238. package/dist/ui-kernel/index.d.mts +11 -2
  239. package/dist/ui-kernel/index.mjs +1 -1
  240. package/dist/ui-kernel/pages/schemas.d.mts +1 -1
  241. package/dist/ui-views/index.mjs +1 -1
  242. package/dist/utils/index.d.mts +31 -1
  243. package/dist/utils/index.mjs +2 -2
  244. package/dist/{view-builder-CHUTXJDl.d.mts → view-builder-DJGz9I-u.d.mts} +2 -2
  245. package/dist/workflow-engine/execution-attempt-repository.d.mts +1 -1
  246. package/dist/workflow-engine/execution-attempt-repository.mjs +1 -1
  247. package/dist/workflow-engine/index.d.mts +2 -2
  248. package/dist/workflow-engine/index.mjs +1 -1
  249. package/dist/workflow-engine/package.d.mts +1 -1
  250. package/dist/workflow-engine/package.mjs +1 -1
  251. package/dist/workflow-engine/provider-operation.d.mts +1 -1
  252. package/dist/workflow-engine/testing/conformance.d.mts +1 -1
  253. package/dist/workflow-engine/testing/conformance.mjs +1 -1
  254. package/dist/workflow-engine/testing/index.d.mts +1 -1
  255. package/dist/workflow-engine/testing/index.mjs +1 -1
  256. package/dist/workflow-engine/testing/sqlite.d.mts +1 -1
  257. package/dist/workflow-engine/testing/sqlite.mjs +1 -1
  258. package/dist/workflow-engine/workflow-orchestrator.mjs +1 -1
  259. package/dist/{workflow-transitions-C0sg3kar.mjs → workflow-transitions-t0ORS1F5.mjs} +1 -1
  260. package/dist/workflow-worker-DXCXb3g-.mjs +3 -0
  261. package/package.json +9 -1
  262. package/dist/bus-BQ64i3DN.mjs +0 -9
  263. package/dist/client-Bg3_IdaF.mjs +0 -1
  264. package/dist/extension-CfrTp3rC.mjs +0 -1
  265. package/dist/extension-CnNcY1hR.mjs +0 -1
  266. package/dist/extension-namespace-Ct9L6SKr.mjs +0 -1
  267. package/dist/index-D_j_T3nS.d.mts +0 -435
  268. package/dist/load-extensions-BVgxTj_y.mjs +0 -1
  269. package/dist/ownership-memory-handler-xex7sLiX.mjs +0 -1
  270. package/dist/schemas-ClkcU_N5.mjs +0 -1
  271. package/dist/session-6UG5udTX.mjs +0 -95
  272. package/dist/session-BB0s7c2B.mjs +0 -1
  273. package/dist/workflow-worker-ChrMIcKm.mjs +0 -2
  274. /package/dist/{adapter-binding-BxjUfkOn.d.mts → adapter-binding-CaYBrIkL.d.mts} +0 -0
  275. /package/dist/{attempt-control-evidence-7lwRG73Y.mjs → attempt-control-evidence-CHBnJoqN.mjs} +0 -0
  276. /package/dist/{attempt-fixtures-DHdYmr3o.mjs → attempt-fixtures-D3IsP0KH.mjs} +0 -0
  277. /package/dist/{authority-state-bootstrap-CvuWPywM.mjs → authority-state-bootstrap-4F5Wc_6l.mjs} +0 -0
  278. /package/dist/{base-orchestrator-CrXiMJzf.d.mts → base-orchestrator-1ofFsqUz.d.mts} +0 -0
  279. /package/dist/{bootstrap-start-client-C1ZHbv6e.mjs → bootstrap-start-client-9nOdeDYl.mjs} +0 -0
  280. /package/dist/{capability-service-CQ1aw_p-.d.mts → capability-service-CUN0MIS7.d.mts} +0 -0
  281. /package/dist/{client-ByjHcS78.d.mts → client-BY3sBW2L.d.mts} +0 -0
  282. /package/dist/{client-binary-version-verifier-C4fEAUdo.d.mts → client-binary-version-verifier-BeO4Eptw.d.mts} +0 -0
  283. /package/dist/{clients-namespace-D4BxF2Nw.d.mts → clients-namespace-D92YsbKI.d.mts} +0 -0
  284. /package/dist/{config-namespace-B1zyOYwH.d.mts → config-namespace-OEckUfVE.d.mts} +0 -0
  285. /package/dist/{create-static-mount-Dgxgi4W3.mjs → create-static-mount-4B-mNtx1.mjs} +0 -0
  286. /package/dist/{cross-spawn-BMCAyqrN.mjs → cross-spawn-DGqEuNyT.mjs} +0 -0
  287. /package/dist/{definition-ClWxAKQ2.d.mts → definition-DLJg-P4G.d.mts} +0 -0
  288. /package/dist/{esm-Ccx-3z8E.mjs → esm-DwiWcwH0.mjs} +0 -0
  289. /package/dist/{execution-attempt-repository-aabFKcXN.mjs → execution-attempt-repository-CY289HlC.mjs} +0 -0
  290. /package/dist/{execution-attempt-repository-BUah8hma.d.mts → execution-attempt-repository-DOb5V4N2.d.mts} +0 -0
  291. /package/dist/{extension-package-provenance-C7oO5JAE.mjs → extension-package-provenance-ClpN3GHp.mjs} +0 -0
  292. /package/dist/{filesystem-service-CDYoiwWY.d.mts → filesystem-service-BmavE-uO.d.mts} +0 -0
  293. /package/dist/{index-BbkcbY6d.d.mts → index--gbsE1W0.d.mts} +0 -0
  294. /package/dist/{index-DdVpWkaI.d.mts → index-B36rL4gp.d.mts} +0 -0
  295. /package/dist/{index-DM72_93s.d.mts → index-BD1SbHpP.d.mts} +0 -0
  296. /package/dist/{index-KdlZRuTp.d.mts → index-BDcK7jqJ2.d.mts} +0 -0
  297. /package/dist/{index-DAaQ--ki.d.mts → index-BQYGOXY5.d.mts} +0 -0
  298. /package/dist/{index-gAyARaKS.d.mts → index-BneZFJ7x.d.mts} +0 -0
  299. /package/dist/{index-D8ELwT5y.d.mts → index-BujgCaKt.d.mts} +0 -0
  300. /package/dist/{index-DfU8s_xP.d.mts → index-C2StVLk4.d.mts} +0 -0
  301. /package/dist/{index-BGnQ0EyD.d.mts → index-CCTzitBA.d.mts} +0 -0
  302. /package/dist/{index-CVRT01082.d.mts → index-Cj_V1aRL.d.mts} +0 -0
  303. /package/dist/{index-nkix3hP7.d.mts → index-CpN2C9jq.d.mts} +0 -0
  304. /package/dist/{index-D6p17KPs.d.mts → index-CsRPJ9FV.d.mts} +0 -0
  305. /package/dist/{index-BPNfYEA22.d.mts → index-CvdvuhTL2.d.mts} +0 -0
  306. /package/dist/{index-DmX9W3xH2.d.mts → index-D3peNmHN2.d.mts} +0 -0
  307. /package/dist/{index-DiZ4LmyE.d.mts → index-D7smT-YD.d.mts} +0 -0
  308. /package/dist/{index-B78CRVi9.d.mts → index-DEx4ZFkz.d.mts} +0 -0
  309. /package/dist/{index-CjDQn6lw.d.mts → index-DGoJayJg.d.mts} +0 -0
  310. /package/dist/{index-F7cVpFJ9.d.mts → index-DTvYp2GT.d.mts} +0 -0
  311. /package/dist/{index-Htfr-K5U2.d.mts → index-DqliLe_D2.d.mts} +0 -0
  312. /package/dist/{index-BCU5oByg.d.mts → index-DubyRZD9.d.mts} +0 -0
  313. /package/dist/{index-DjSUOMlr.d.mts → index-DwOpaQAE.d.mts} +0 -0
  314. /package/dist/{index-BZoOYV-y.d.mts → index-DxkSkszz.d.mts} +0 -0
  315. /package/dist/{index-tbjIqwa3.d.mts → index-TBJ1kIGA.d.mts} +0 -0
  316. /package/dist/{index-DXQTkwLB.d.mts → index-YOXWpZAS.d.mts} +0 -0
  317. /package/dist/{index-CXpgL3gz2.d.mts → index-aIJ7A4DC2.d.mts} +0 -0
  318. /package/dist/{index-D6liU_KS.d.mts → index-fxh7TB0q.d.mts} +0 -0
  319. /package/dist/{index-xsaaa85T.d.mts → index-qczb9Yx3.d.mts} +0 -0
  320. /package/dist/{index-C_kOkO3E.d.mts → index-zqo2mX_Z.d.mts} +0 -0
  321. /package/dist/{json-value-Ymw2f8i_.d.mts → json-value-Bjl8jzom.d.mts} +0 -0
  322. /package/dist/{jsonl-transport-Bg033Ng0.mjs → jsonl-transport-Ct1RWs0h.mjs} +0 -0
  323. /package/dist/{lib-BizqbepU.mjs → lib-DomKag_k.mjs} +0 -0
  324. /package/dist/{namespace-rJ3ycPMg.d.mts → namespace-Bhx72V7S.d.mts} +0 -0
  325. /package/dist/{namespace-BCVKdu-U.d.mts → namespace-CxEQv9iZ.d.mts} +0 -0
  326. /package/dist/{namespace-COHHDh2I.d.mts → namespace-D09uQ231.d.mts} +0 -0
  327. /package/dist/{namespace-UFcDEBJB.d.mts → namespace-D5DkpaaN.d.mts} +0 -0
  328. /package/dist/{namespace-CvK86QFk.d.mts → namespace-DHLwz4o3.d.mts} +0 -0
  329. /package/dist/{namespace-B5IFLQc-.d.mts → namespace-DHbrNQYD.d.mts} +0 -0
  330. /package/dist/{namespace-s0e215xO.d.mts → namespace-DyD06b5-.d.mts} +0 -0
  331. /package/dist/{namespace-C1pPZKtI.d.mts → namespace-Dz5_Hrz7.d.mts} +0 -0
  332. /package/dist/{namespace-Phxf0Lep.d.mts → namespace-Lkv2nyzb.d.mts} +0 -0
  333. /package/dist/{namespace-DM5vykb7.d.mts → namespace-hlhPqSsw.d.mts} +0 -0
  334. /package/dist/{namespace-DlOQmhgX.d.mts → namespace-x-gk5SmK.d.mts} +0 -0
  335. /package/dist/{namespace-f6Kz5cwX.d.mts → namespace-zusFEJPh.d.mts} +0 -0
  336. /package/dist/{orchestrator-shared--srEeSaY.d.mts → orchestrator-shared-ChU5qRSe.d.mts} +0 -0
  337. /package/dist/{packages-B98-WETs.d.mts → packages-D2s51nGU.d.mts} +0 -0
  338. /package/dist/{providers-namespace-DRcl03bo.d.mts → providers-namespace-BLVt8OyP.d.mts} +0 -0
  339. /package/dist/{runtime-inputs-DBtVIy9h.d.mts → runtime-inputs-BU_kBrP7.d.mts} +0 -0
  340. /package/dist/{schemas-CEJe8O6P.d.mts → schemas-3KTmPuZg.d.mts} +0 -0
  341. /package/dist/{schemas-D_-iXLQ9.d.mts → schemas-B-5_Dp4_.d.mts} +0 -0
  342. /package/dist/{schemas-CeItAAQM.d.mts → schemas-BLxdGZkr.d.mts} +0 -0
  343. /package/dist/{schemas-Cj6Gbqch.d.mts → schemas-BegArpU_.d.mts} +0 -0
  344. /package/dist/{schemas-Ca5RILd-2.d.mts → schemas-BzB6z9oX2.d.mts} +0 -0
  345. /package/dist/{schemas-CtzZDp29.d.mts → schemas-CBBzvIh0.d.mts} +0 -0
  346. /package/dist/{schemas-Cq1d5tid.d.mts → schemas-CD3Mq-jC.d.mts} +0 -0
  347. /package/dist/{schemas-LiiyNNpr.d.mts → schemas-Cl7fPlRv.d.mts} +0 -0
  348. /package/dist/{schemas-DJ2vMsgm.d.mts → schemas-CqawCYTY.d.mts} +0 -0
  349. /package/dist/{schemas-2_D4iVbb.d.mts → schemas-DEg6R9ph.d.mts} +0 -0
  350. /package/dist/{schemas-JjyFxrC0.d.mts → schemas-rMUsvzeJ.d.mts} +0 -0
  351. /package/dist/{server-lifecycle-DUKp1Fbf.d.mts → server-lifecycle-CTJvpdeL.d.mts} +0 -0
  352. /package/dist/{session-lineage-C3myyt5x.d.mts → session-lineage-BuGN3RZs.d.mts} +0 -0
  353. /package/dist/{storage-namespace-IvLOIP7j.d.mts → storage-namespace-B5r_ScUz.d.mts} +0 -0
  354. /package/dist/{storage-namespace-definition-Cv0XiTXb.d.mts → storage-namespace-definition-DiYr8UNl.d.mts} +0 -0
  355. /package/dist/{types-hkExapGH.d.mts → types-BSx8YYlc.d.mts} +0 -0
  356. /package/dist/{types-BYEybzjX.d.mts → types-CpEoQapk.d.mts} +0 -0
  357. /package/dist/{types-QRSc2AUU.d.mts → types-Cuhnt15L.d.mts} +0 -0
  358. /package/dist/{types-QsyX4H21.d.mts → types-DEGuc-fn.d.mts} +0 -0
  359. /package/dist/{types-BRM1AZaP.d.mts → types-DciLiPMd.d.mts} +0 -0
  360. /package/dist/{types-CsmvIK25.mjs → types-wwuw7RkB.mjs} +0 -0
  361. /package/dist/{window-registry-DeG37kt8.d.mts → window-registry-C3W2wtlX.d.mts} +0 -0
@@ -1036,6 +1036,27 @@ type WebSocketTransportOptions = WebSocketClientTransportOptions$1 | WebSocketSe
1036
1036
  * codec and fall back to a plain JSON codec when none is provided.
1037
1037
  */
1038
1038
  interface ClientTransportCodec {
1039
+ /**
1040
+ * Report whether this codec can encode the given outbound bus message right now.
1041
+ *
1042
+ * When absent the codec is treated as able to encode any message. Return
1043
+ * `false` when a prerequisite is not yet satisfied for this specific message —
1044
+ * for example, when an end-to-end encryption session has not been established
1045
+ * and the message is not one of the control-plane frames that travel in
1046
+ * plaintext before the session exists.
1047
+ *
1048
+ * Unlike a global readiness gate, `canEncode` is message-selective: a relay
1049
+ * codec may return `true` for control-plane frames that travel in plaintext
1050
+ * while returning `false` for application-level messages that require an
1051
+ * established session key.
1052
+ *
1053
+ * Side effects must not occur inside `canEncode`. In particular, tracked
1054
+ * correlation IDs must only be consumed (deleted) inside `encode`, never
1055
+ * during a `canEncode` check.
1056
+ * @param message - Outbound bus message to test
1057
+ * @returns `true` when this codec can encode the message; `false` otherwise
1058
+ */
1059
+ canEncode?(message: BusMessage): boolean;
1039
1060
  /**
1040
1061
  * Encode a bus message for transmission.
1041
1062
  * @param message - Bus message to encode
@@ -1117,6 +1138,22 @@ interface WebSocketClientTransportHeartbeatOptions {
1117
1138
  */
1118
1139
  timeoutMs?: number;
1119
1140
  }
1141
+ /**
1142
+ * What "ready" means for a `WebSocketClientTransport`.
1143
+ *
1144
+ * The bus gates request dispatch on a transport's `ready` promise, so the mode
1145
+ * must describe a milestone the peer can actually deliver.
1146
+ *
1147
+ * - `'peer-sync'` — ready once the peer's `subscribe-sync-complete` handshake
1148
+ * arrives, meaning its remote handler routes have been advertised to this
1149
+ * node. Only a Makaio bus server answers that handshake.
1150
+ * - `'session-established'` — ready once this transport's own session is up:
1151
+ * socket open, authentication complete and buffered subscriptions replayed.
1152
+ * For a relay-backed peer that forwards frames without participating in bus
1153
+ * routing, this is the strongest promise the connection can honestly make;
1154
+ * declaring `'peer-sync'` there would leave `ready` pending forever.
1155
+ */
1156
+ type WebSocketClientTransportReadinessMode = 'peer-sync' | 'session-established';
1120
1157
  /**
1121
1158
  * Configuration options for `WebSocketClientTransport`.
1122
1159
  */
@@ -1138,6 +1175,16 @@ interface WebSocketClientTransportOptions {
1138
1175
  * Authentication strategy for HMAC or E2E handshakes.
1139
1176
  */
1140
1177
  auth?: TransportAuth;
1178
+ /**
1179
+ * Milestone at which this transport's `ready` promise resolves.
1180
+ *
1181
+ * Leave at the default when connecting to a Makaio bus server. Set
1182
+ * `'session-established'` when the peer relays frames without answering the
1183
+ * `subscribe-sync-complete` handshake, so `ready` reports the session this
1184
+ * connection actually establishes instead of one the peer never confirms.
1185
+ * @defaultValue 'peer-sync'
1186
+ */
1187
+ readiness?: WebSocketClientTransportReadinessMode;
1141
1188
  /**
1142
1189
  * Wire codec for encryption or custom framing.
1143
1190
  *
@@ -1243,6 +1290,7 @@ declare class WebSocketClientTransport implements BusTransport {
1243
1290
  private readonly autoReconnectConfig;
1244
1291
  private readonly heartbeatConfig;
1245
1292
  private readonly connectTimeoutMs;
1293
+ private readonly readiness;
1246
1294
  private readonly wsFactory;
1247
1295
  private readonly debug;
1248
1296
  private readonly onConnectedCallback;
@@ -1277,7 +1325,13 @@ declare class WebSocketClientTransport implements BusTransport {
1277
1325
  private reconnectLoopRunning;
1278
1326
  /** Resolver for the current ready promise; `null` once resolved. */
1279
1327
  private readyResolve;
1280
- /** Resolves when the subscribe-sync-complete handshake is received; reset on each reconnect. */
1328
+ /**
1329
+ * Resolves at the milestone selected by the `readiness` option; reset on each reconnect.
1330
+ *
1331
+ * Under `'peer-sync'` (the default) that is the inbound `subscribe-sync-complete`
1332
+ * handshake; under `'session-established'` it is this side's own session coming up.
1333
+ * Also resolved on disconnect so a dropped connection never gates bus dispatch.
1334
+ */
1281
1335
  ready: Promise<void>;
1282
1336
  /** Set by the transport registry to track each session's ready promise for dispatch gating. */
1283
1337
  onNewReadySession: ((promise: Promise<void>) => void) | undefined;
@@ -1352,11 +1406,42 @@ declare class WebSocketClientTransport implements BusTransport {
1352
1406
  * @param error - Optional cancellation error
1353
1407
  */
1354
1408
  cancelRequest(correlationId: string, error?: Error): void;
1409
+ /**
1410
+ * Whether the wire session is live: an owned socket is open and auth completed.
1411
+ *
1412
+ * Codec encoding eligibility (`canEncode`) is deliberately excluded — it gates
1413
+ * per-message outbound routing, not the session lifecycle. The transport lifecycle
1414
+ * (connected/disconnected) is driven by wire-session state so that `onDisconnected`
1415
+ * is always preceded by `onConnected` regardless of codec state.
1416
+ *
1417
+ * `hasLiveWireSession` is the internal predicate shared across the lifecycle and
1418
+ * reconnect logic. `isReady()` is the `BusTransport`-contract surface that delegates
1419
+ * to it; the two exist separately so lifecycle code can call the predicate without
1420
+ * going through the public method.
1421
+ * @returns `true` when the socket is open and authenticated
1422
+ */
1423
+ private hasLiveWireSession;
1355
1424
  /**
1356
1425
  * Returns `true` when the socket is open (`readyState === 1`) and auth has completed.
1357
- * @returns `true` if the transport can send messages
1426
+ *
1427
+ * Wire-session state only — codec encoding eligibility is deliberately excluded.
1428
+ * Use `canSend(message)` to check whether a specific outbound message can be
1429
+ * dispatched through this transport.
1430
+ * @returns `true` when the wire session is live
1358
1431
  */
1359
1432
  isReady(): boolean;
1433
+ /**
1434
+ * Returns `true` when the wire session is live and the codec can encode the given
1435
+ * outbound bus message.
1436
+ *
1437
+ * Combines `hasLiveWireSession()` with the codec's message-selective `canEncode`
1438
+ * gate. A relay codec may return `true` for control-plane frames that travel in
1439
+ * plaintext before the E2E session key is established, while returning `false`
1440
+ * for application-level messages.
1441
+ * @param message - Outbound bus message to test
1442
+ * @returns `true` when the wire session is live and the codec can encode the message
1443
+ */
1444
+ canSend(message: BusMessage): boolean;
1360
1445
  /**
1361
1446
  * Trigger an immediate reconnection attempt.
1362
1447
  *
@@ -1754,7 +1839,14 @@ interface E2ERelayClientTransportOptions extends Omit<WebSocketClientTransportOp
1754
1839
  * session when the codec is reused across reconnections.
1755
1840
  */
1756
1841
  interface E2ERelayCodecHandle {
1757
- /** Wire codec for E2E relay encryption. */
1842
+ /**
1843
+ * Wire codec for E2E relay encryption.
1844
+ *
1845
+ * Implements `canEncode` with message-selective logic: relay-control frames,
1846
+ * tracked relay-control responses, and subscription-control frames return `true`
1847
+ * before any E2E session exists; all other messages require a session key
1848
+ * (`e2eAuth.getSessionKey()` non-null).
1849
+ */
1758
1850
  codec: ClientTransportCodec;
1759
1851
  /**
1760
1852
  * Clear all relay-control correlation IDs.
@@ -1772,6 +1864,12 @@ interface E2ERelayCodecHandle {
1772
1864
  * routing. Use this when constructing a `WebSocketClientTransport` with E2E
1773
1865
  * relay encryption instead of the lower-level `createE2ERelayClientTransport`.
1774
1866
  *
1867
+ * The returned codec implements `canEncode` with message-selective logic: relay-control
1868
+ * frames, tracked relay-control responses, and subscription-control frames are allowed
1869
+ * before any E2E session exists; all other messages require a session key. Use
1870
+ * `WebSocketClientTransport.canSend(message)` to gate outbound bus traffic correctly
1871
+ * per message.
1872
+ *
1775
1873
  * The returned `reset()` method **must** be called at the start of each new
1776
1874
  * connection attempt when the codec is reused across reconnections. Failing to
1777
1875
  * reset allows relay-control correlation IDs from a previous session to
@@ -2153,4 +2251,4 @@ declare module '@makaio/framework/bus' {
2153
2251
  }
2154
2252
  }
2155
2253
  //#endregion
2156
- export { type ClientTransportCodec, DispatchingAuth, E2EAuth, E2ERelayAuth, type E2ERelayAuthOptions, HmacAuth, type HmacIdentitySecretRegistrationOptions, type HmacIdentitySecretRotationOptions, type RelayControlBusMessage, type RelayControlEnvelopeMessage, type RelayControlHelpers, type RelayControlRegistry, ServerTransport, type TransportAuth, WebSocketClientTransport, type WebSocketClientTransportHeartbeatOptions, type WebSocketClientTransportOptions, type WebSocketClientTransportReconnectOptions, type WebSocketCloseEvent, WebSocketConnectionError, type WebSocketConnectionErrorCode, type WebSocketLike, type WebSocketServerLike, captureHmacIdentitySecretCleanup, clearHmacIdentitySecretsForTesting, createE2EClientTransport, createE2ERelayClientTransport, createE2ERelayCodec, createRelayControlHelpers, createRelayControlRegistry, createWebSocketCloseEvent, createWebSocketTransport, index_d_exports as crypto, extractSocketErrorMessage, registerHmacIdentitySecret, resolveHmacIdentityAllowedMessageSubjects, resolveHmacIdentityAllowedSubscriptionSubjects, resolveHmacIdentityPeer, resolveHmacIdentitySecret, rotateHmacIdentitySecret };
2254
+ export { type ClientTransportCodec, DispatchingAuth, E2EAuth, E2ERelayAuth, type E2ERelayAuthOptions, HmacAuth, type HmacIdentitySecretRegistrationOptions, type HmacIdentitySecretRotationOptions, type RelayControlBusMessage, type RelayControlEnvelopeMessage, type RelayControlHelpers, type RelayControlRegistry, ServerTransport, type TransportAuth, WebSocketClientTransport, type WebSocketClientTransportHeartbeatOptions, type WebSocketClientTransportOptions, type WebSocketClientTransportReadinessMode, type WebSocketClientTransportReconnectOptions, type WebSocketCloseEvent, WebSocketConnectionError, type WebSocketConnectionErrorCode, type WebSocketLike, type WebSocketServerLike, captureHmacIdentitySecretCleanup, clearHmacIdentitySecretsForTesting, createE2EClientTransport, createE2ERelayClientTransport, createE2ERelayCodec, createRelayControlHelpers, createRelayControlRegistry, createWebSocketCloseEvent, createWebSocketTransport, index_d_exports as crypto, extractSocketErrorMessage, registerHmacIdentitySecret, resolveHmacIdentityAllowedMessageSubjects, resolveHmacIdentityAllowedSubscriptionSubjects, resolveHmacIdentityPeer, resolveHmacIdentitySecret, rotateHmacIdentitySecret };
@@ -1,2 +1,2 @@
1
- import{r as e}from"../../chunk-DTipWd-i.mjs";import{isRecord as t}from"@makaio/framework/utils";import{ConnectionLostError as n,CorrelationTracker as r,DEFAULT_REQUEST_TIMEOUT_MS as i,NoHandlerError as a,TimeoutError as o,buildSubscribeMessage as s,buildUnsubscribeMessage as c,deserializeTransportError as l,getSubjectFromBusMessage as u,handleCorrelationResponse as d,isNoHandlerErrorForSubject as f,matchesFilter as p,matchesSubscription as m,shouldReceiveMessage as ee,trackMessageCorrelation as h}from"@makaio/framework/bus";const te={baseMs:1e3,maxMs:1e4};function ne(e,t,n){let r=Math.max(t,100),i=Math.max(n,r);return Math.min(r*2**e,i)}function re(e,t){return new Promise(n=>{if(t.aborted){n();return}let r=()=>{clearTimeout(i),t.removeEventListener(`abort`,r),n()},i=setTimeout(()=>{t.removeEventListener(`abort`,r),n()},e);t.addEventListener(`abort`,r)})}const ie={intervalMs:3e4,timeoutMs:1e4},ae={encode:async e=>JSON.stringify(e),decode:async e=>e};function oe(e){return e===!1?!1:{baseMs:e?.baseMs??te.baseMs,maxMs:e?.maxMs??te.maxMs}}function se(e){if(e===!1)return!1;let t=e?.intervalMs??ie.intervalMs,n=e?.timeoutMs??ie.timeoutMs;if(!Number.isFinite(t)||t<=0)throw RangeError(`heartbeat.intervalMs must be a finite number > 0 (got ${String(t)})`);if(!Number.isFinite(n)||n<=0)throw RangeError(`heartbeat.timeoutMs must be a finite number > 0 (got ${String(n)})`);return{intervalMs:t,timeoutMs:n}}var g=class extends Error{code;constructor(e,t,n){super(t,n),this.code=e,this.name=`WebSocketConnectionError`}};function _(e){let t=typeof e==`object`&&!!e&&`code`in e&&e.code===1008;return new g(t?`WS_POLICY_REJECTED`:`WS_CONNECTION_UNAVAILABLE`,t?`WebSocket connection rejected by peer policy`:`WebSocket closed before connection completed`)}function v(e,t=`unknown error`){return`message`in e?String(e.message):t}async function y(e,t,n){let r=await t.encode(e);n.send(r)}function ce(e,t,n){return n?.aborted?Promise.reject(n.reason):e.readyState===1?Promise.resolve():e.readyState>=2?Promise.reject(_()):new Promise((r,i)=>{let a=()=>{u!==void 0&&clearTimeout(u),e.removeEventListener(`open`,o),e.removeEventListener(`error`,s),e.removeEventListener(`close`,c),n?.removeEventListener(`abort`,l)},o=()=>{a(),r()},s=e=>{a(),i(new g(`WS_CONNECTION_UNAVAILABLE`,`WebSocket connection failed — ${v(e)}`,{cause:e}))},c=e=>{a(),i(_(e))},l=()=>{a(),i(n?.reason)},u=t===void 0?void 0:setTimeout(()=>{a(),i(new g(`WS_CONNECTION_TIMEOUT`,`WebSocket open timed out after ${t}ms`))},t);e.addEventListener(`open`,o),e.addEventListener(`error`,s),e.addEventListener(`close`,c),n?.addEventListener(`abort`,l)})}function b(e){if(e.readyState!==0&&e.readyState!==1)return;let t=()=>{},n=()=>{e.removeEventListener(`error`,t),e.removeEventListener(`close`,n)};e.addEventListener(`error`,t),e.addEventListener(`close`,n);try{e.close()}catch(e){throw n(),e}}async function le(e,t,n){let r=await Promise.allSettled(Array.from(t).map(t=>t(e,n.receiveContext)));for(let e of r)e.status===`rejected`&&n.debug&&console.error(`[WebSocketClientTransport:${n.name}] Handler error:`,e.reason);return r.every(e=>e.status===`fulfilled`)}function ue(e,t){return{...t?.getReceiveContext?.(),transportName:e}}async function de(e,t){let{name:n,debug:r,auth:i,codec:a,messageTransform:o,correlations:s}=t,c=JSON.parse(e.toString());if(typeof c!=`object`||!c||typeof c.type!=`string`)return r&&console.error(`[WebSocketClientTransport:${n}] Invalid message structure:`,c),null;let l=c;if(i?.handleAuthMessage(l)||l.type===`heartbeat`)return null;let u=await a.decode(l);return!t.isCurrentSession()||o&&(u=await o(u),!t.isCurrentSession())||u.type===`heartbeat`?null:u.type===`subscribe-sync-complete`?(t.onSyncComplete(),null):u.type===`subscription-ack`?(typeof u.ackId==`string`&&t.onSubscriptionAck(u.ackId),null):d(u,s)?null:u}async function fe(e,t){let{name:n,debug:r,auth:i,handlers:a}=t,o=null;try{o=await de(e,t)}catch(e){r&&console.error(`[WebSocketClientTransport:${n}] Failed to parse message:`,e);return}if(o===null||!t.isCurrentSession())return;let s=ue(n,i),c=o;le(c,a,{debug:r,name:n,receiveContext:s}).then(async e=>{e&&(c.type===`subscribe`||c.type===`unsubscribe`)&&typeof c.ackId==`string`&&await t.sendSubscriptionAck(c.ackId)}).catch(e=>{r&&console.error(`[WebSocketClientTransport:${n}] Handler dispatch error:`,e)})}function pe(e){let t=e;return typeof t.ping==`function`&&typeof t.terminate==`function`&&typeof t.on==`function`&&typeof t.off==`function`}function me(e){e.unref?.()}function he(e,t,n){if(!pe(e))return()=>{};let r=!1,i=Date.now(),a=null,o=null,s=()=>{if(r)return;let e=Date.now()-i,n=Math.max(0,t.intervalMs-e);a=setTimeout(l,n),me(a)},c=()=>{o=null,f(),n.debug&&console.warn(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Heartbeat deadline expired (no message/pong within ${t.timeoutMs}ms) — terminating socket`),e.terminate()},l=()=>{if(a=null,!r&&o===null){if(Date.now()-i<t.intervalMs){s();return}e.readyState===1&&(e.ping(),o=setTimeout(c,t.timeoutMs),me(o))}},u=()=>{i=Date.now(),o!==null&&(clearTimeout(o),o=null),a===null&&s()},d=()=>{f()},f=()=>{r||(r=!0,a!==null&&(clearTimeout(a),a=null),o!==null&&(clearTimeout(o),o=null),e.removeEventListener(`message`,u),e.removeEventListener(`close`,d),e.off(`pong`,u))};return e.addEventListener(`message`,u),e.on(`pong`,u),e.addEventListener(`close`,d),s(),f}async function x(e,t){await Promise.allSettled(e.inFlightMessages),e.getSocket()===t&&e.correlations.rejectAll(e.getSessionFailure()??new n(e.name))}function ge(e,t){let n=n=>{if(t.getSocket()!==e)return;let r=fe(n.data,{isCurrentSession:()=>t.getSocket()===e,name:t.name,debug:t.debug,auth:t.auth,codec:t.codec,messageTransform:t.messageTransform,correlations:t.correlations,handlers:t.handlers,onSyncComplete:()=>{t.resolveReady()},onSubscriptionAck:e=>{t.resolveSubscriptionAck(e)},sendSubscriptionAck:async n=>{t.getSocket()!==e||e.readyState!==1||await y({type:`subscription-ack`,ackId:n},t.codec,e)}}).finally(()=>{t.inFlightMessages.delete(r)});t.inFlightMessages.add(r)};t.setMessageListener(n),e.addEventListener(`message`,n)}function S(e,t){if(t.getSocket()!==e)return;let n=t.getMessageListener();n!==null&&(e.removeEventListener(`message`,n),t.setMessageListener(null));let r=t.getCloseListener();r!==null&&(e.removeEventListener(`close`,r),t.setCloseListener(null))}function _e(e,t,n){let r=[n];if(t.getSocket()===e){S(e,t),t.setSocket(null,n instanceof Error?n:Error(`WebSocket connection failed`,{cause:n})),t.setAuthComplete(!1);try{t.auth?.cleanup()}catch(e){r.push(e)}}try{b(e)}catch(e){r.push(e)}return r.length===1?n:AggregateError(r,`WebSocket connection failed and cleanup was incomplete`,{cause:n})}async function ve(e,t){t.throwIfAborted();let n=new AbortController,r=()=>n.abort(new g(`WS_CONNECTION_UNAVAILABLE`,`WebSocket connection cancelled`));t.addEventListener(`abort`,r);let i=setTimeout(()=>n.abort(new g(`WS_CONNECTION_TIMEOUT`,`WebSocket connection timed out after ${e.connectTimeoutMs}ms`)),e.connectTimeoutMs),a=null,o=()=>{},s=()=>{a?.removeEventListener(`close`,c),a?.removeEventListener(`error`,l)},c=e=>n.abort(_(e)),l=e=>n.abort(new g(`WS_CONNECTION_UNAVAILABLE`,`WebSocket connection failed — ${v(e)}`,{cause:e})),u=t=>{if(o(),a===null)return t;let n=a;return s(),a=null,_e(n,e,t)},d=()=>{},f=new Promise((e,t)=>{d=()=>{t(u(n.signal.reason))},n.signal.addEventListener(`abort`,d)});try{let t=ye(e,n.signal,()=>{o=e.resetReadyPromise()},t=>{a=t,e.setSocket(t),e.setAuthComplete(!1),t.addEventListener(`close`,c),t.addEventListener(`error`,l),ge(t,e)});await Promise.race([t,f])}catch(e){throw u(e)}finally{clearTimeout(i),t.removeEventListener(`abort`,r),n.signal.removeEventListener(`abort`,d),s()}}async function ye(e,t,r,i){e.inFlightMessages.size>0&&await Promise.allSettled(e.inFlightMessages),t.throwIfAborted();let a=e.getSocket();e.correlations.rejectAll(e.getSessionFailure()??new n(e.name)),e.inFlightMessages.clear(),e.resolveReady(),e.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: reconnecting before subscription ack`)),r(),t.throwIfAborted(),a!==null&&S(a,e);let o=await e.wsFactory(e.url);t.aborted&&(b(o),t.throwIfAborted()),i(o),await be(o,e,t)}async function be(e,t,n){if(await ce(e,void 0,n),n.throwIfAborted(),t.auth&&(await t.auth.authenticateClient(t=>{if(n.throwIfAborted(),e.readyState!==1)throw _();e.send(JSON.stringify(t))}),n.throwIfAborted()),t.setAuthComplete(!0),t.localSubscriptions.size>0){let r=await t.codec.encode(s(t.localSubscriptions));n.throwIfAborted(),e.send(r)}t.heartbeat!==!1&&he(e,t.heartbeat,t),t.debug&&console.info(`[WebSocketClientTransport:${t.name}] Connected to ${t.url}`),t.notifyConnected()}function xe(e,t){return new Promise(n=>{if(e.readyState===3||t.aborted){n();return}let r=()=>{t.removeEventListener(`abort`,i),n()},i=()=>{e.removeEventListener(`close`,r),n()};e.addEventListener(`close`,r),t.addEventListener(`abort`,i)})}async function Se(e,t,r,i,a){a(!0);try{for(;!e.aborted;){let a=r.getSocket(),o=a!==null;if(a!==null&&a.readyState!==3&&await xe(a,e),e.aborted)break;if(o&&a!==null){if(await x(r,a),e.aborted)break;r.debug&&console.info(`[WebSocketClientTransport:${r.name}] ${new Date().toISOString()} Connection lost, starting reconnect loop (maxMs=${t.maxMs})`),r.notifyDisconnected()}let s=0;for(;!e.aborted;){let a=ne(s,t.baseMs,t.maxMs);r.debug&&console.info(`[WebSocketClientTransport:${r.name}] ${new Date().toISOString()} Reconnecting in ${a}ms (attempt ${s+1})`);let o=new AbortController;if(i(o),await re(a,AbortSignal.any([e,o.signal])),i(null),e.aborted)break;try{if(await ve(r,e),e.aborted)break;s=0;let t=r.getSocket();if(t!==null){let i=async()=>{await Promise.allSettled(r.inFlightMessages),!(e.aborted||r.getSocket()!==t)&&(r.correlations.rejectAll(r.getSessionFailure()??new n(r.name)),r.auth?.cleanup(),r.setAuthComplete(!1),r.debug&&console.info(`[WebSocketClientTransport:${r.name}] ${new Date().toISOString()} Connection closed`),r.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`)))};r.setCloseListener(i),t.addEventListener(`close`,i),await xe(t,e)}break}catch(e){if(r.debug){let t=e instanceof Error?e.message:String(e);console.warn(`[WebSocketClientTransport:${r.name}] ${new Date().toISOString()} Connect attempt ${s+1} failed: ${t}`)}s++}}}}finally{a(!1)}}function Ce(e,t,n){let r=async()=>{t.getSocket()===e&&(S(e,t),t.auth?.cleanup(),t.setAuthComplete(!1),n(),t.resolveReady(),t.notifyDisconnected(),await x(t,e),t.getSocket()===e&&(t.setSocket(null),t.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`))))};t.setCloseListener(r),e.addEventListener(`close`,r)}async function we(e,t,n,r,i){let a=i.localSubscriptions.get(e),o=a?.filter,c=t??o,l=r??a?.deliveryClass??`relayable`;if(i.localSubscriptions.set(e,{filter:c,priorities:n,deliveryClass:l}),i.socket!==null&&i.socket.readyState===1){let t=i.beginSubscriptionAck?.(),r=s(new Map([[e,{filter:c,priorities:n,deliveryClass:l}]]),t?.ackId);try{await y(r,i.codec,i.socket),await t?.promise}catch(e){throw t?.reject(e),e}}i.debug&&console.info(`[WebSocketClientTransport:${i.name}] Subscribed to ${e}${c?` with filter`:``}`)}async function Te(e,t){let n=t.localSubscriptions.get(e);if(t.localSubscriptions.delete(e),t.socket!==null&&t.socket.readyState===1){let r=t.beginSubscriptionAck?.(),i=c({[e]:n?.priorities??[]},r?.ackId);try{await y(i,t.codec,t.socket),await r?.promise}catch(e){throw r?.reject(e),e}}t.debug&&console.info(`[WebSocketClientTransport:${t.name}] Unsubscribed from ${e}`)}var Ee=class{name;termination=new AbortController;ownedSocket;onClose;constructor(e,t){this.name=t,this.ownedSocket=e,this.onClose=e=>{let r=_(e);this.end(r.code===`WS_POLICY_REJECTED`?r:new n(t))},e.addEventListener(`close`,this.onClose)}get socket(){return this.ownedSocket}get signal(){return this.termination.signal}get failure(){return this.signal.reason instanceof Error?this.signal.reason:void 0}end(e){this.ownedSocket?.removeEventListener(`close`,this.onClose),this.termination.abort(e)}release(e=new n(this.name)){this.end(e),this.ownedSocket=null}writable(e,t){if(t?.throwIfAborted(),this.signal.throwIfAborted(),e!==this||this.ownedSocket===null)throw new n(this.name);let r=this.ownedSocket;if(r.readyState===2||r.readyState===3){if(t===void 0)throw Error(`WebSocket is closing; uncorrelated message was not sent`);return De(new Promise(()=>{}),AbortSignal.any([t,this.signal]))}if(r.readyState!==1)throw new n(this.name);return r}};async function De(e,t){let n=()=>{},r=new Promise((e,r)=>{n=()=>r(t.reason),t.addEventListener(`abort`,n,{once:!0}),t.aborted&&n()});try{return await Promise.race([e,r])}finally{t.removeEventListener(`abort`,n)}}async function Oe(e,t,r){let i=e.session;if(i===null)throw new n(e.name);if(i.signal.throwIfAborted(),t.type!==`request`&&t.type!==`broadcast`)return await ke(e,i,t),h(t,e.correlations,r);let a=new AbortController,o=h(t,e.correlations,r).then(e=>(a.abort(),e),e=>{throw a.abort(e),e});return ke(e,i,t,a.signal).catch(n=>{if(a.signal.aborted)return;let r=n instanceof Error?n:Error(`WebSocket send failed`,{cause:n});e.correlations.reject(t.correlationId,r)}),o}async function ke(e,t,n,r){let i=t.writable(e.currentSession(),r);i instanceof Promise&&await i;let a=r===void 0?t.signal:AbortSignal.any([r,t.signal]);a.throwIfAborted();let o=await De(e.codec.encode(n),a),s=t.writable(e.currentSession(),r);s instanceof Promise?await s:s.send(o)}var C=class{name;url;auth;codec;messageTransform;autoReconnectConfig;heartbeatConfig;connectTimeoutMs;wsFactory;debug;onConnectedCallback;onDisconnectedCallback;session=null;authComplete=!1;correlations=new r;handlers=new Set;localSubscriptions=new Map;pendingSubscriptionAcks=new Map;subscriptionAckSeq=0;messageListener=null;closeListener=null;reconnectAbort=null;inFlightMessages=new Set;backoffWakeAbort=null;reconnectLoopRunning=!1;readyResolve=null;ready;onNewReadySession=void 0;onConnected=void 0;onDisconnected=void 0;get socket(){return this.session?.socket??null}constructor(e){this.url=e.url,this.name=e.name??`ws-client`,this.auth=e.auth,this.codec=e.codec??ae,this.messageTransform=e.messageTransform,this.debug=e.debug??!1,this.autoReconnectConfig=oe(e.autoReconnect),this.heartbeatConfig=se(e.heartbeat),this.connectTimeoutMs=e.connectTimeoutMs??3e4,this.wsFactory=e.createWebSocket??this.defaultWsFactory,this.onConnectedCallback=e.onConnected,this.onDisconnectedCallback=e.onDisconnected,this.ready=new Promise(e=>{this.readyResolve=e})}async connect(){if(this.reconnectAbort!==null)throw Error(`WebSocketClientTransport: already connected`);let e=new AbortController;this.reconnectAbort=e;try{await ve(this.connectionDeps(),e.signal)}catch(t){throw this.reconnectAbort===e&&(this.reconnectAbort=null),t}if(e.signal.aborted||this.reconnectAbort!==e)throw new g(`WS_CONNECTION_UNAVAILABLE`,`WebSocket connection cancelled`);this.autoReconnectConfig===!1?this.socket!==null&&this.wireNoReconnectClose(this.socket):this.startReconnectLoop(e.signal)}async disconnect(){let e=this.reconnectAbort,t=this.socket;this.reconnectAbort=null,e?.abort(new g(`WS_CONNECTION_UNAVAILABLE`,`WebSocket connection cancelled`));let r=t===null||this.socket===t;if(this.reconnectLoopRunning=!1,this.backoffWakeAbort=null,this.readyResolve?.(),this.readyResolve=null,this.socket!==null){S(this.socket,this.connectionDeps());let e=this.socket;this.session?.release(),this.authComplete=!1,b(e)}this.correlations.rejectAll(this.session?.failure??new n(this.name)),this.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`)),r&&this.auth?.cleanup(),this.handlers.clear(),this.debug&&console.info(`[WebSocketClientTransport:${this.name}] Disconnected`)}async send(e,t){return Oe({session:this.session,currentSession:()=>this.session,name:this.name,codec:this.codec,correlations:this.correlations},e,t??i)}onReceive(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}async subscribe(e,t,n=[],r){await we(e,t,n,r,this.subscriptionDeps())}async unsubscribe(e){await Te(e,this.subscriptionDeps())}getSubscriptions(){return new Set(this.localSubscriptions.keys())}cancelRequest(e,t){this.correlations.cancel(e,t)}isReady(){return this.socket!==null&&this.socket.readyState===1&&this.authComplete}async reconnect(){if(!this.isReady()){if(this.backoffWakeAbort!==null){this.backoffWakeAbort.abort(),this.backoffWakeAbort=null;return}if(this.autoReconnectConfig!==!1){if(this.reconnectLoopRunning){let e=this.socket;e!==null&&e.readyState===0&&e.close();return}return}try{this.reconnectAbort===null&&await this.connect()}catch{}}}startReconnectLoop(e){return Se(e,this.autoReconnectConfig,this.connectionDeps(),t=>{e.aborted||(this.backoffWakeAbort=t)},t=>{this.reconnectAbort?.signal===e&&(this.reconnectLoopRunning=t)})}subscriptionDeps(){return{name:this.name,debug:this.debug,codec:this.codec,socket:this.socket,localSubscriptions:this.localSubscriptions,beginSubscriptionAck:()=>this.beginSubscriptionAck()}}beginSubscriptionAck(){let e=`${this.name}:sub:${++this.subscriptionAckSeq}`,t,n,r=new Promise((e,r)=>{t=e,n=r});r.catch(()=>void 0);let i=t=>{this.pendingSubscriptionAcks.has(e)&&(this.pendingSubscriptionAcks.delete(e),t())};return this.pendingSubscriptionAcks.set(e,{resolve:()=>i(t),reject:e=>i(()=>n(e))}),{ackId:e,promise:r,reject:t=>this.rejectSubscriptionAck(e,t)}}resolveSubscriptionAck(e){this.pendingSubscriptionAcks.get(e)?.resolve()}rejectSubscriptionAck(e,t){this.pendingSubscriptionAcks.get(e)?.reject(t)}rejectPendingSubscriptionAcks(e){for(let t of this.pendingSubscriptionAcks.keys())this.rejectSubscriptionAck(t,e)}connectionDeps(){return{name:this.name,debug:this.debug,auth:this.auth,codec:this.codec,messageTransform:this.messageTransform,correlations:this.correlations,handlers:this.handlers,localSubscriptions:this.localSubscriptions,wsFactory:this.wsFactory,url:this.url,connectTimeoutMs:this.connectTimeoutMs,heartbeat:this.heartbeatConfig,getSocket:()=>this.socket,setSocket:(e,t)=>{this.session?.release(t),e!==null&&(this.session=new Ee(e,this.name))},getSessionFailure:()=>this.session?.failure,setAuthComplete:e=>{this.authComplete=e},getMessageListener:()=>this.messageListener,setMessageListener:e=>{this.messageListener=e},getCloseListener:()=>this.closeListener,setCloseListener:e=>{this.closeListener=e},resolveReady:()=>{this.readyResolve?.(),this.readyResolve=null},resetReadyPromise:()=>{let e;this.ready=new Promise(t=>{this.readyResolve=t,e=t});let t=()=>{e(),this.readyResolve===e&&(this.readyResolve=null)};try{this.onNewReadySession?.(this.ready)}catch(e){throw t(),e}return t},resolveSubscriptionAck:e=>{this.resolveSubscriptionAck(e)},rejectPendingSubscriptionAcks:e=>{this.rejectPendingSubscriptionAcks(e)},notifyConnected:()=>{let e=this.socket;this.onConnectedCallback?.(),e!==null&&this.socket===e&&this.isReady()&&this.onConnected?.()},notifyDisconnected:()=>{this.onDisconnectedCallback?.(),this.onDisconnected?.()},inFlightMessages:this.inFlightMessages}}defaultWsFactory=async e=>new(await(import(`ws`))).WebSocket(e);wireNoReconnectClose(e){Ce(e,this.connectionDeps(),()=>{this.reconnectAbort=null})}};function w(e){e.timer!==void 0&&clearTimeout(e.timer)}var Ae=class{pendingBroadcasts=new Map;timeout;debug;constructor(e={}){this.timeout=e.timeout??5e3,this.debug=e.debug??!1}startClientBroadcast(e,t,n,r,i){let a=t.correlationId,o=i??this.timeout,s={kind:`client`,sender:e,results:[],pendingClients:new Set(n),nodeResultsReceived:!1,timer:o===0?void 0:setTimeout(()=>{this.debug&&console.warn(`[BroadcastAggregator] Broadcast ${a} timed out`),this.finalizeBroadcast(a)},o)};this.pendingBroadcasts.set(a,s);let c=JSON.stringify(t);for(let e of n)r(e,c);this.debug&&console.info(`[BroadcastAggregator] Broadcast ${a} forwarded to ${n.length} clients`)}startServerBroadcast(e,t,n,r){let i=e.correlationId,a=r??this.timeout;return t.length===0?(this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${i} - no target clients`),Promise.resolve([])):new Promise(r=>{let o={kind:`server`,results:[],pendingClients:new Set(t),timer:a===0?void 0:setTimeout(()=>{this.debug&&console.warn(`[BroadcastAggregator] Server broadcast ${i} timed out`),this.finalizeServerBroadcast(i)},a),resolve:r};this.pendingBroadcasts.set(i,o);let s=JSON.stringify(e);for(let e of t)n(e,s);this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${i} sent to ${t.length} clients`)})}handleResponse(e,t){let n=this.pendingBroadcasts.get(t.correlationId);return n?(t.results&&n.results.push(...t.results),n.pendingClients.delete(e),this.debug&&console.info(`[BroadcastAggregator] Broadcast ${t.correlationId} got response, ${n.pendingClients.size} pending`),this.checkBroadcastComplete(t.correlationId,n),!0):!1}handleNodeResults(e,t,n){let r=this.pendingBroadcasts.get(e);return!r||r.kind!==`client`?!1:(r.results.push(...t),r.nodeResultsReceived=!0,r.nodeError=n,this.debug&&console.info(`[BroadcastAggregator] Broadcast ${e} node results aggregated${n?` (with error)`:``}`),this.checkBroadcastComplete(e,r),!0)}handleClientDisconnect(e){for(let[t,n]of this.pendingBroadcasts)n.kind===`client`&&n.sender===e?(w(n),this.pendingBroadcasts.delete(t)):n.pendingClients.has(e)&&(n.pendingClients.delete(e),this.checkBroadcastComplete(t,n))}cleanup(){for(let e of this.pendingBroadcasts.values())w(e),e.kind===`server`&&e.resolve(e.results);this.pendingBroadcasts.clear()}checkBroadcastComplete(e,t){if(!(t.pendingClients.size>0))if(t.kind===`client`){if(!t.nodeResultsReceived)return;this.finalizeBroadcast(e)}else this.finalizeServerBroadcast(e)}finalizeBroadcast(e){let t=this.pendingBroadcasts.get(e);if(!t||t.kind!==`client`)return;w(t),this.pendingBroadcasts.delete(e);let n=t.nodeError?{type:`broadcast-response`,correlationId:e,error:t.nodeError}:{type:`broadcast-response`,correlationId:e,results:t.results};t.sender.readyState===1&&t.sender.send(JSON.stringify(n)),this.debug&&console.info(`[BroadcastAggregator] Broadcast ${e} finalized with ${t.results.length} results`)}finalizeServerBroadcast(e){let t=this.pendingBroadcasts.get(e);!t||t.kind!==`server`||(w(t),this.pendingBroadcasts.delete(e),t.resolve(t.results),this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${e} finalized with ${t.results.length} results`))}},je=class{clients=new Set;authenticatingClients=new Set;clientSubscriptions=new Map;clientSubscriptionState=new Map;clientFilters=new Map;requestOrigins=new Map;debug;subscriptionSubjectRestrictionResolver;requiredSubscriptionFilterResolver;socketAuthChecker;constructor(e={}){this.debug=e.debug??!1,this.subscriptionSubjectRestrictionResolver=e.subscriptionSubjectRestrictionResolver,this.requiredSubscriptionFilterResolver=e.requiredSubscriptionFilterResolver,this.socketAuthChecker=e.socketAuthChecker}addAuthenticating(e){this.authenticatingClients.add(e)}removeAuthenticating(e){this.authenticatingClients.delete(e)}isAuthenticating(e){return this.authenticatingClients.has(e)}addClient(e){this.clients.add(e)}removeClient(e){let t=new Set(this.clientSubscriptionState.get(e)?.keys()??[]);this.clients.delete(e),this.authenticatingClients.delete(e),this.clientSubscriptions.delete(e),this.clientSubscriptionState.delete(e),this.clientFilters.delete(e);for(let[t,n]of this.requestOrigins)n.socket===e&&this.clearRequestOrigin(t,n);return this.debug&&console.info(`[ClientRegistry] Client removed (${this.clients.size} remaining)`),this.buildAggregateUpdates(t)}get size(){return this.clients.size}getAllSockets(){return new Set([...this.clients,...this.authenticatingClients])}handleSubscribeMessage(e,t){let n=this.clientSubscriptions.get(e);n||(n=new Set,this.clientSubscriptions.set(e,n));let r=this.clientFilters.get(e),i=this.clientSubscriptionState.get(e);i||(i=new Map,this.clientSubscriptionState.set(e,i));for(let[a,o]of Object.entries(t.subjects)){n.add(a),i.set(a,{priorities:o,deliveryClass:t.deliveryClasses?.[a]===`relayable`?`relayable`:`first-hop-only`});let s=t.filters?.[a];s===void 0?r?.delete(a):(r||(r=new Map,this.clientFilters.set(e,r)),r.set(a,s))}if(this.debug){let e=Object.keys(t.subjects).length,n=t.filters?Object.keys(t.filters).length:0;console.info(`[ClientRegistry] Client subscribed to ${e} subjects, ${n} filters`)}return this.buildAggregateUpdates(new Set(Object.keys(t.subjects)))}handleUnsubscribeMessage(e,t){let n=this.clientSubscriptions.get(e),r=this.clientFilters.get(e);for(let i of Object.keys(t))n?.delete(i),this.clientSubscriptionState.get(e)?.delete(i),r?.delete(i);return this.debug&&console.info(`[ClientRegistry] Client unsubscribed from ${Object.keys(t).length} subjects`),this.buildAggregateUpdates(new Set(Object.keys(t)))}getReadyClients(){let e=[];for(let t of this.clients)t.readyState===1&&e.push(t);return e}trackRequestOrigin(e,t){let{correlationId:n}=t;if(this.requestOrigins.has(n))return;let r=this.getRequestRemainingLifetime(t);if(r===0)return;let i={socket:e,expiration:void 0};r!==void 0&&(i.expiration=setTimeout(()=>{this.requestOrigins.get(n)===i&&this.requestOrigins.delete(n)},r)),this.requestOrigins.set(n,i)}getRequestOrigin(e){return this.requestOrigins.get(e)?.socket}consumeResponseClient(e){let t=this.requestOrigins.get(e);if(t)return this.clearRequestOrigin(e,t),this.isReadyAndAuthenticated(t.socket)?t.socket:void 0}cancelRequestOrigin(e){let t=this.requestOrigins.get(e);t&&this.clearRequestOrigin(e,t)}getInterestedClients(e,t,n){let r=[];for(let i of this.clients)i===n||!this.isReadyAndAuthenticated(i)||this.clientWantsMessage(i,e,t)&&this.isSubjectAllowedForClient(i,e)&&this.isPayloadAllowedForClient(i,e,t)&&r.push(i);return r}getInterestedRequestClients(e,t,n){return this.getInterestedClients(e,t,n).filter(t=>{let n=this.clientSubscriptionState.get(t);return n?[...n].some(([t,n])=>n.priorities.length>0&&m(e,t)):!1})}forwardEventToClients(e,t,n){let r=u(t)??void 0,i=`payload`in t?t.payload:void 0,a=JSON.stringify(t),o=this.getInterestedClients(r,i,e);for(let e of o)n(e,a)}clientWantsMessage(e,t,n){return ee(t,n,this.clientSubscriptions.get(e)??new Set,this.clientFilters.get(e)??new Map)}isReadyAndAuthenticated(e){return e.readyState===1?!this.socketAuthChecker||this.socketAuthChecker(e)?!0:(e.close(1008,`Authentication expired`),!1):!1}getRequestRemainingLifetime(e){if(e.deadline!==void 0)return Math.max(0,e.deadline-Date.now());let t=e.timeout??i;return t>0?t:void 0}clearRequestOrigin(e,t){t.expiration!==void 0&&clearTimeout(t.expiration),this.requestOrigins.delete(e)}isSubjectAllowedForClient(e,t){if(!this.subscriptionSubjectRestrictionResolver||t===void 0)return!0;let n=this.subscriptionSubjectRestrictionResolver(e);return n===null?!0:[...n].some(e=>m(t,e))}isPayloadAllowedForClient(e,t,n){if(!this.requiredSubscriptionFilterResolver||t===void 0)return!0;let r=this.requiredSubscriptionFilterResolver(e)?.[t];return r===void 0||p(n,r)}buildAggregateUpdates(e){let t={},n={},r={};for(let i of e){let e=new Set,a=!1,o=`relayable`;for(let t of this.clientSubscriptionState.values()){let n=t.get(i);if(n){a=!0;for(let t of n.priorities)e.add(t);n.deliveryClass===`first-hop-only`&&(o=`first-hop-only`)}}a?(t[i]=[...e].sort((e,t)=>t-e),n[i]=o):r[i]=[]}let i=[];return Object.keys(t).length>0&&i.push({type:`subscribe`,subjects:t,deliveryClasses:n}),Object.keys(r).length>0&&i.push({type:`unsubscribe`,subjects:r}),i}};const T=new Map;function Me(e){if(typeof e==`object`&&e){for(let t of Object.values(e))Me(t);Object.freeze(e)}return e}function Ne(e){let t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Me(structuredClone(t))]));return Object.freeze(t)}function E(e,t){let n=!0;return()=>{n&&(n=!1,T.get(e)===t&&T.delete(e))}}function Pe(e,t,n){if(e.trim().length===0)throw Error(`registerHmacIdentitySecret requires a non-empty identityId`);if(t.length===0)throw Error(`registerHmacIdentitySecret requires a non-empty secret`);if(`allowedSubjects`in n)throw Error(`registerHmacIdentitySecret no longer accepts allowedSubjects; use allowedMessageSubjects and/or allowedSubscriptionSubjects`);let r=n.peerKind.trim();if(r.length===0)throw Error(`registerHmacIdentitySecret requires a non-empty peerKind`);let i=n.allowedMessageSubjects!==void 0||n.allowedSubscriptionSubjects!==void 0;if(n.requiredSubscriptionFilters!==void 0){for(let e of Object.keys(n.requiredSubscriptionFilters))if(e.includes(`*`))throw Error(`registerHmacIdentitySecret requires exact full subjects for requiredSubscriptionFilters`)}let a={secret:t,peerKind:r,...n.claims===void 0?{}:{claims:n.claims},...i?{allowedMessageSubjects:new Set(n.allowedMessageSubjects??[]),allowedSubscriptionSubjects:new Set(n.allowedSubscriptionSubjects??[])}:{},...n.requiredSubscriptionFilters===void 0?{}:{requiredSubscriptionFilters:Ne(n.requiredSubscriptionFilters)}};return T.set(e,a),E(e,a)}function Fe(e,t,n={}){if(t.length===0)throw Error(`rotateHmacIdentitySecret requires a non-empty secret`);let r=T.get(e);if(!r)throw Error(`Cannot rotate HMAC identity secret: no registration exists for '${e}'`);let i={secret:t,peerKind:r.peerKind,...n.claims===void 0?r.claims===void 0?{}:{claims:r.claims}:{claims:n.claims},...r.allowedMessageSubjects===void 0?{}:{allowedMessageSubjects:r.allowedMessageSubjects},...r.allowedSubscriptionSubjects===void 0?{}:{allowedSubscriptionSubjects:r.allowedSubscriptionSubjects},...r.requiredSubscriptionFilters===void 0?{}:{requiredSubscriptionFilters:r.requiredSubscriptionFilters}};return T.set(e,i),E(e,i)}function Ie(e){let t=T.get(e);return t===void 0?void 0:E(e,t)}function Le(e){return T.get(e)?.secret??null}function Re(e){let t=T.get(e);return t?{kind:t.peerKind,id:e,authenticated:!0,...t.claims===void 0?{}:{claims:t.claims}}:null}function ze(e){return T.get(e)?.allowedMessageSubjects??null}function D(e){return T.get(e)?.allowedSubscriptionSubjects??null}function Be(e){return T.get(e)?.requiredSubscriptionFilters??null}function Ve(){T.clear()}function He(e){return e.type===`request`||e.type===`event`||e.type===`broadcast`}function Ue(e){return t(e)&&Object.values(e).every(e=>Array.isArray(e)&&e.every(e=>typeof e==`number`&&Number.isFinite(e)))}function We(e){return e.endsWith(`*`)}function Ge(e,t,n,r){let i={};for(let[a,o]of Object.entries(e))We(a)?t===null||t.has(a)?i[a]=o:n&&console.debug(`[ServerTransport] Dropping wildcard subscription '${a}': not in allowedSubscriptionSubjects for peer '${r}'`):t===null||[...t].some(e=>m(a,e))?i[a]=o:n&&console.debug(`[ServerTransport] Dropping subscription subject '${a}': not allowed for peer '${r}'`);return Object.keys(i).length>0?i:null}async function O(e,t,n){let r=await Promise.allSettled(Array.from(t).map(t=>t(e,n.receiveContext)));for(let e of r)if(e.status===`rejected`&&n.debug){let t=n.logContext?` ${n.logContext}`:``;console.error(`[ServerTransport] Handler error${t}:`,e.reason)}return r.every(e=>e.status===`fulfilled`)}async function Ke(e,t,n){let r=!0;for(let i of e)await O(i,t,n)||(r=!1);return r}function qe(e,t,n){let{correlations:r,broadcastAggregator:i,debug:a}=t;if(e.type===`heartbeat`)return!0;if(e.type===`response`){let t=e;return typeof t.correlationId==`string`?(t.error?r.reject(t.correlationId,l(t.error)):r.resolve(t.correlationId,t.result),!0):(a&&console.warn(`[ServerTransport] Malformed response message: missing correlationId`),!0)}if(e.type===`broadcast-response`){let t=e;return typeof t.correlationId==`string`?(i.handleResponse(n,t),!0):(a&&console.warn(`[ServerTransport] Malformed broadcast-response: missing correlationId`),!0)}return!1}function Je(e){let t=e?.peer?.id;if(t===void 0)return null;let n=ze(t),r=D(t);return n===null&&r===null?null:{peerId:t,allowedMessageSubjects:n,allowedSubscriptionSubjects:r}}function Ye(e,t,n,r){if(r===null||!He(e))return!1;let i=`${e.namespace}.${e.subject}`;return r.allowedMessageSubjects===null||r.allowedMessageSubjects.has(i)?!1:(e.type===`request`&&n.sendSafely(t,JSON.stringify({type:`response`,correlationId:e.correlationId,error:{message:`Subject '${i}' is not allowed for peer '${r.peerId}'`}})),n.debug&&console.warn(`[ServerTransport] Dropping ${e.type} to '${i}': not allowed for peer '${r.peerId}'`),!0)}function Xe(e,t,n){if(!Ue(e.subjects))return n&&console.warn(`[ServerTransport] Malformed ${e.type} message: missing subjects record`),null;if(t===null)return e.subjects;let r=Ge(e.subjects,t.allowedSubscriptionSubjects,n,t.peerId);return r===null&&n&&console.debug(`[ServerTransport] Dropping ${e.type} message: all subjects filtered for peer '${t.peerId}'`),r}async function Ze(e,t,n,r,i){if(e.type!==`subscribe`&&e.type!==`unsubscribe`)return!1;let a=e,o=Xe(a,i,n.debug);return o===null||await Ke(a.type===`subscribe`?n.registry.handleSubscribeMessage(t,{...a,subjects:o}):n.registry.handleUnsubscribeMessage(t,o),n.handlers,{debug:n.debug,receiveContext:r,logContext:`dispatching ${a.type}`})&&typeof a.ackId==`string`&&n.sendSafely(t,JSON.stringify({type:`subscription-ack`,ackId:a.ackId})),!0}async function Qe(e,t,n,r){if(e.type!==`broadcast`)return!1;let i=e;if(typeof i.correlationId!=`string`||typeof i.subject!=`string`)return n.debug&&console.warn(`[ServerTransport] Malformed broadcast message: missing correlationId or subject`),!0;let a=u(i)??void 0,o=n.registry.getInterestedClients(a,i.payload,t),s=n.normalizeBroadcastTimeout(i.timeout);return n.broadcastAggregator.startClientBroadcast(t,i,o,n.sendSafely,s),await O(e,n.handlers,{debug:n.debug,receiveContext:r}),!0}async function $e(e,t,n){if(qe(e,n,t))return;let r=n.auth?.getReceiveContext?.(t),i=Je(r);if(!Ye(e,t,n,i)){if(e.type===`subscribe`||e.type===`unsubscribe`){await Ze(e,t,n,r,i);return}if(e.type===`broadcast`){await Qe(e,t,n,r);return}e.type===`event`&&n.registry.forwardEventToClients(t,e,n.sendSafely),e.type===`request`&&n.registry.trackRequestOrigin(t,e),await O(e,n.handlers,{debug:n.debug,receiveContext:r})}}function et(e,t){let{auth:n,registry:r,debug:i}=t;return async a=>{let o;try{o=JSON.parse(a.toString())}catch(e){i&&console.error(`[ServerTransport] Failed to parse message:`,e);return}let s=o&&typeof o==`object`?o:void 0;if(!s||typeof s.type!=`string`){i&&console.error(`[ServerTransport] Invalid message structure:`,o);return}let c=o;try{if(n?.handleAuthMessage(c,e))return;if(n&&r.isAuthenticating(e)){i&&console.warn(`[ServerTransport] Ignoring message from unauthenticated client`);return}if(n?.isSocketAuthenticated?.(e)===!1){i&&console.warn(`[ServerTransport] Closing socket with expired authentication`),n.cleanupSocket(e),e.close(1008,`Authentication expired`);return}await $e(c,e,t)}catch(e){i&&console.error(`[ServerTransport] Failed to process message:`,e)}}}function tt(e){return typeof e!=`number`||!Number.isFinite(e)||e<=0?5e3:Math.min(e,6e4)}async function nt(e,t){let{registry:n,correlations:r,broadcastAggregator:i,handlers:a,auth:o,serverSubscriptions:c,sendSafely:l,debug:u}=t;o&&n.addAuthenticating(e);let d=et(e,{registry:n,correlations:r,broadcastAggregator:i,handlers:a,auth:o,normalizeBroadcastTimeout:tt,sendSafely:l,debug:u}),f=e=>{d(e.data)},p=()=>{o?.cleanupSocket(e);let t=n.removeClient(e);e.removeEventListener(`message`,f),e.removeEventListener(`close`,p),e.removeEventListener(`error`,m),i.handleClientDisconnect(e),Ke(t,a,{debug:u,logContext:`dispatching disconnected client subscriptions`}),u&&console.info(`[ServerTransport] Client disconnected (${n.size} remaining)`)},m=e=>{u&&console.error(`[ServerTransport] Client socket error:`,e)};e.addEventListener(`message`,f),e.addEventListener(`close`,p),e.addEventListener(`error`,m);try{if(o&&(await o.authenticateServer(e,t=>{if(e.readyState!==1)throw Error(`Cannot send auth message: socket not ready (state: ${e.readyState})`);e.send(JSON.stringify(t))}),n.removeAuthenticating(e)),e.readyState!==1)return;if(n.addClient(e),c.size>0){let t=s(c);l(e,JSON.stringify(t))}l(e,JSON.stringify({type:`subscribe-sync-complete`})),u&&console.info(`[ServerTransport] Client connected (${n.size} total)`)}catch(t){if(u&&console.error(`[ServerTransport] Client connection setup failed:`,t),e.readyState>=2)return;let n=t instanceof g&&(t.code===`WS_AUTHENTICATION_REJECTED`||t.code===`WS_POLICY_REJECTED`);e.close(n?1008:1011,n?`Authentication failed`:`Connection setup failed`)}}async function rt(e,t,n){let{registry:r,correlations:i}=n,s=`${e.namespace}.${e.subject}`,c=r.getRequestOrigin(e.correlationId),l=r.getInterestedRequestClients(s,e.payload,c);if(l.length===0)throw new a(s);for(let[n,r]of l.entries()){let a=`${e.correlationId}:attempt-${n+1}`,c={...e,correlationId:a};try{r.send(JSON.stringify(c))}catch{continue}try{return await i.track(a,t)}catch(e){if(f(e,s)||e instanceof o)continue;throw e}}throw new a(s)}var it=class{name;wss;auth;debug;handlers=new Set;registry;serverSubscriptions=new Map;broadcastAggregator;correlations=new r;connectionListener=null;constructor(e){let{websocket:t,name:n=`websocket`,auth:r,debug:i=!1}=e;this.wss=t,this.name=n,this.auth=r,this.debug=i,this.registry=new je({debug:i,subscriptionSubjectRestrictionResolver:r?e=>{let t=(r.getReceiveContext?.(e))?.peer?.id;return t===void 0?null:D(t)}:void 0,requiredSubscriptionFilterResolver:r?e=>{let t=(r.getReceiveContext?.(e))?.peer?.id;return t===void 0?null:Be(t)}:void 0,socketAuthChecker:r?e=>r.isSocketAuthenticated?.(e)??!0:void 0}),this.broadcastAggregator=new Ae({debug:i})}sendToClientSafely(e,t){try{e.send(t)}catch(e){this.debug&&console.warn(`[ServerTransport] Failed to send message to client:`,e)}}async connect(){if(this.connectionListener!==null)throw Error(`ServerTransport.connect() called while already connected`);this.connectionListener=e=>{nt(e,{registry:this.registry,correlations:this.correlations,broadcastAggregator:this.broadcastAggregator,handlers:this.handlers,auth:this.auth,serverSubscriptions:this.serverSubscriptions,sendSafely:(e,t)=>this.sendToClientSafely(e,t),debug:this.debug})},this.wss.on(`connection`,this.connectionListener),this.debug&&console.info(`[ServerTransport] Listening for connections`)}async disconnect(){this.connectionListener&&=(this.wss.off(`connection`,this.connectionListener),null);let e=this.registry.getAllSockets();for(let t of e)t.close();await new Promise((e,t)=>{this.wss.close(n=>n?t(n):e())}),this.correlations.cleanup(),this.broadcastAggregator.cleanup(),this.auth?.cleanup(),this.handlers.clear(),this.serverSubscriptions.clear(),this.debug&&console.info(`[ServerTransport] Disconnected`)}async send(e,t){if(e.type===`response`){let t=this.registry.consumeResponseClient(e.correlationId);return t?(this.sendToClientSafely(t,JSON.stringify(e)),!0):!1}if(e.type===`broadcast`){let n=u(e)??void 0,r=`payload`in e?e.payload:void 0,i=this.registry.getInterestedClients(n,r);return this.broadcastAggregator.startServerBroadcast(e,i,(e,t)=>{this.sendToClientSafely(e,t)},t)}if(e.type===`request`)return rt(e,t??i,{registry:this.registry,correlations:this.correlations});if(this.registry.size===0){if(this.debug){let t=u(e);console.debug(`[ServerTransport] No clients to receive ${e.type}${t?`: ${t}`:``}`)}return!1}let n=u(e)??void 0,r=`payload`in e?e.payload:void 0,a=JSON.stringify(e),o=this.registry.getInterestedClients(n,r);for(let e of o)this.sendToClientSafely(e,a);let s=o.length>0;if(!s&&(n&&this.debug&&console.warn(`[ServerTransport] No interested clients for subject: ${n}`),!n))throw Error(`No connected clients available to receive message`);return s}onReceive(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}cancelRequest(e,t){this.correlations.cancel(e,t),this.registry.cancelRequestOrigin(e)}onBroadcastResults(e,t,n){this.broadcastAggregator.handleNodeResults(e,t,n)}async subscribe(e,t,n=[],r){let i=this.serverSubscriptions.get(e),a=i?.filter,o=t??a,c=r??i?.deliveryClass??`relayable`;if(this.serverSubscriptions.set(e,{filter:o,priorities:n,deliveryClass:c}),this.registry.size>0){let t=s(new Map([[e,{filter:o,priorities:n,deliveryClass:c}]])),r=JSON.stringify(t);for(let e of this.registry.getReadyClients())this.sendToClientSafely(e,r)}}getConnectionCount(){return this.registry.getReadyClients().length}async unsubscribe(e){if(this.serverSubscriptions.delete(e),this.registry.size>0){let t=c({[e]:[]}),n=JSON.stringify(t);for(let e of this.registry.getReadyClients())this.sendToClientSafely(e,n)}}};function at(e,t){let n=new Event(`close`);return Object.defineProperties(n,{code:{value:e??1e3,enumerable:!0},reason:{value:t??``,enumerable:!0}}),n}function ot(e){if(typeof e!=`object`||!e)throw TypeError(`WebSocket transport options must be an object`);let t=e;if(t.mode!==`client`&&t.mode!==`server`)throw TypeError(`WebSocket transport mode must be "client" or "server"`);if(t.mode===`client`){if(!st(t.websocket))throw TypeError(`WebSocket transport client mode requires a websocket with addEventListener/removeEventListener`);return}if(!ct(t.websocket))throw TypeError(`WebSocket transport server mode requires a websocket with on/off listener methods`)}function st(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.send==`function`&&typeof t.close==`function`&&typeof t.addEventListener==`function`&&typeof t.removeEventListener==`function`}function ct(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.on==`function`&&typeof t.off==`function`&&typeof t.close==`function`}var lt=class{secret;algorithm;challengeTimeout;identityId;resolveSecret;resolvePeer;pendingChallenge;pendingResult;queuedChallengeNonce;queuedResult;clientAuthComplete=!1;serverPendingResponses=new Map;serverAuthenticatedSockets=new Set;serverAuthenticatedPeers=new Map;serverAuthenticatedSecrets=new Map;constructor(e){this.secret=e.secret,this.algorithm=e.algorithm??`sha256`,this.challengeTimeout=e.challengeTimeout??5e3,this.identityId=e.identityId,this.resolveSecret=e.resolveSecret,this.resolvePeer=e.resolvePeer}async authenticateServer(e,t){let n=crypto.getRandomValues(new Uint8Array(32)),r=Array.from(n).map(e=>e.toString(16).padStart(2,`0`)).join(``),i=this.waitForAuthResponseWithIdentity(e),a=this.serverPendingResponses.get(e);i.catch(()=>void 0);try{t({type:`auth-challenge`,nonce:r});let{signature:n,identityId:o}=await i;this.assertServerOwner(e,a);let s;if(this.resolveSecret&&o!==void 0){let i=this.resolveSecret(o);if(i===null)throw this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:`Unknown identity`}),new g(`WS_AUTHENTICATION_REJECTED`,`HMAC authentication failed: Unknown identity '${o}'`);s=await this.computeHmacWithSecret(r,i),this.assertServerOwner(e,a),this.constantTimeEqual(n,s)&&(this.serverAuthenticatedPeers.set(e,o),this.serverAuthenticatedSecrets.set(e,i))}else s=await this.computeHmac(r),this.assertServerOwner(e,a);if(!this.constantTimeEqual(n,s))throw this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:`Invalid signature`}),new g(`WS_AUTHENTICATION_REJECTED`,`HMAC authentication failed: Invalid signature`);try{t({type:`auth-result`,success:!0}),this.assertServerOwner(e,a)}catch(t){throw this.serverPendingResponses.get(e)===a&&this.cleanupSocket(e),t}this.serverAuthenticatedSockets.add(e)}finally{clearTimeout(a.timeoutHandle),this.serverPendingResponses.get(e)===a&&this.serverPendingResponses.delete(e)}}async authenticateClient(e){this.clientAuthComplete=!1;let t=this.waitForAuthChallenge(),n=this.pendingChallenge;try{let r=await t;this.assertClientOwner(n);let i=await this.computeHmac(r);this.assertClientOwner(n),e({type:`auth-response`,signature:i,...this.identityId!==void 0&&{identityId:this.identityId}}),this.assertClientOwner(n);let a=await this.waitForAuthResult();if(this.assertClientOwner(n),!a.success)throw new g(`WS_AUTHENTICATION_REJECTED`,`HMAC authentication failed: ${a.error??`Unknown error`}`);this.clientAuthComplete=!0}finally{clearTimeout(n.timeoutHandle),this.pendingChallenge===n&&(this.pendingChallenge=void 0)}}assertClientOwner(e){if(this.pendingChallenge!==e)throw new g(`WS_CONNECTION_UNAVAILABLE`,`Socket disconnected during HMAC authentication`)}assertServerOwner(e,t){if(this.serverPendingResponses.get(e)!==t)throw new g(`WS_CONNECTION_UNAVAILABLE`,`Socket disconnected during HMAC authentication`)}handleAuthMessage(e,t){if(typeof e!=`object`||!e||!(`type`in e)||typeof e.type!=`string`)return!1;let n=e;if(n.type===`auth-challenge`)return typeof n.nonce!=`string`||this.clientAuthComplete||(this.pendingChallenge?(clearTimeout(this.pendingChallenge.timeoutHandle),this.pendingChallenge.resolve(n.nonce)):this.queuedChallengeNonce=n.nonce),!0;if(n.type===`auth-result`){if(typeof n.success!=`boolean`||this.clientAuthComplete)return!0;let e={success:n.success,error:typeof n.error==`string`?n.error:void 0};return this.pendingResult?(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.resolve(e),this.pendingResult=void 0):this.queuedResult=e,!0}if(n.type===`auth-response`){if(t){let e=this.serverPendingResponses.get(t);if(e){if(clearTimeout(e.timeoutHandle),n.identityId!==void 0&&typeof n.identityId!=`string`)return e.reject(new g(`WS_AUTHENTICATION_REJECTED`,`Malformed HMAC identity`)),!0;e.resolve({signature:n.signature,identityId:n.identityId})}}return!0}return!1}async waitForAuthChallenge(){return new Promise((e,t)=>{let n=setTimeout(()=>{t(new g(`WS_HANDSHAKE_TIMEOUT`,`Authentication challenge timeout`))},this.challengeTimeout);this.pendingChallenge={resolve:e,reject:t,timeoutHandle:n},this.queuedChallengeNonce!==void 0&&(clearTimeout(n),e(this.queuedChallengeNonce),this.queuedChallengeNonce=void 0)})}async waitForAuthResponseWithIdentity(e){return new Promise((t,n)=>{let r={resolve:t,reject:n,timeoutHandle:setTimeout(()=>{n(new g(`WS_HANDSHAKE_TIMEOUT`,`Authentication response timeout`))},this.challengeTimeout)};this.serverPendingResponses.set(e,r)})}async waitForAuthResult(){if(this.queuedResult!==void 0){let e=this.queuedResult;return this.queuedResult=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingResult=void 0,t(new g(`WS_HANDSHAKE_TIMEOUT`,`Authentication result timeout`))},this.challengeTimeout);this.pendingResult={resolve:e,reject:t,timeoutHandle:n}})}async computeHmac(e){return this.computeHmacWithSecret(e,this.secret)}async computeHmacWithSecret(e,t){let n=new TextEncoder,r=n.encode(t),i=this.algorithm.replace(/^sha/,`SHA-`),a=await crypto.subtle.importKey(`raw`,r,{name:`HMAC`,hash:i},!1,[`sign`]),o=await crypto.subtle.sign(`HMAC`,a,n.encode(e));return Array.from(new Uint8Array(o)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}getReceiveContext(e){if(!e)return;let t=this.serverAuthenticatedPeers.get(e);if(t===void 0)return;let n=this.resolvePeer?.(t);if(n!=null)return{transportName:``,peer:{...n,id:n.id??t,authenticated:!0}}}isSocketAuthenticated(e){if(!this.serverAuthenticatedSockets.has(e))return!1;if(!this.resolveSecret)return!0;let t=this.serverAuthenticatedPeers.get(e);if(t===void 0)return!0;let n=this.resolveSecret(t);if(n===null)return this.cleanupSocket(e),!1;let r=this.serverAuthenticatedSecrets.get(e);return r!==void 0&&n!==r?(this.cleanupSocket(e),!1):!0}constantTimeEqual(e,t){if(typeof e!=`string`||e.length!==t.length||!/^[0-9a-f]+$/i.test(e))return!1;let n=new Uint8Array(e.length/2),r=new Uint8Array(t.length/2);for(let i=0;i<n.length;i++)n[i]=parseInt(e.slice(i*2,i*2+2),16),r[i]=parseInt(t.slice(i*2,i*2+2),16);let i=0;for(let e=0;e<n.length;e++)i|=n[e]^r[e];return i===0}sendAuthResultBestEffort(e,t){try{e(t)}catch{}}cleanupSocket(e){let t=this.serverPendingResponses.get(e);t&&(clearTimeout(t.timeoutHandle),this.serverPendingResponses.delete(e),t.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Socket disconnected during HMAC authentication`))),this.serverAuthenticatedPeers.delete(e),this.serverAuthenticatedSecrets.delete(e),this.serverAuthenticatedSockets.delete(e)}cleanup(){this.pendingChallenge&&=(clearTimeout(this.pendingChallenge.timeoutHandle),this.pendingChallenge.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Socket disconnected during HMAC authentication`)),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Socket disconnected during HMAC authentication`)),void 0),this.queuedChallengeNonce=void 0,this.queuedResult=void 0,this.clientAuthComplete=!1;for(let e of this.serverPendingResponses.values())clearTimeout(e.timeoutHandle),e.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Socket disconnected during HMAC authentication`));this.serverPendingResponses.clear(),this.serverAuthenticatedPeers.clear(),this.serverAuthenticatedSecrets.clear(),this.serverAuthenticatedSockets.clear()}};function k(e){let t=Array.from(e,e=>String.fromCharCode(e)).join(``);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=/g,``)}function A(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=(4-t.length%4)%4;t+=`=`.repeat(n);let r=atob(t),i=new Uint8Array(r.length);for(let e=0;e<r.length;e++)i[e]=r.charCodeAt(e);return i}function j(e){return new TextEncoder().encode(e)}function M(e){return new TextDecoder().decode(e)}async function N(e){let t=await crypto.subtle.exportKey(`spki`,e);return k(new Uint8Array(t))}async function P(e){let t=await crypto.subtle.exportKey(`raw`,e);return k(new Uint8Array(t))}async function F(e,t,n=[]){let r=A(e);return crypto.subtle.importKey(`spki`,r,t,!0,n)}async function I(e,t,n=[]){let r=A(e);return crypto.subtle.importKey(`raw`,r,t,!0,n)}async function L(e){let t=await crypto.subtle.exportKey(`pkcs8`,e),n=k(new Uint8Array(t)).replace(/-/g,`+`).replace(/_/g,`/`),r=(4-n.length%4)%4;return n+=`=`.repeat(r),`-----BEGIN PRIVATE KEY-----\n${n.match(/.{1,64}/g)?.join(`
2
- `)??n}\n-----END PRIVATE KEY-----`}async function R(e,t,n){let r=A(e.replace(/-----BEGIN PRIVATE KEY-----/,``).replace(/-----END PRIVATE KEY-----/,``).replace(/\s/g,``).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=/g,``));return crypto.subtle.importKey(`pkcs8`,r,t,!0,n)}const z={name:`ECDH`,namedCurve:`P-256`};async function B(e=!0){return crypto.subtle.generateKey(z,e,[`deriveKey`,`deriveBits`])}async function V(e){return N(e)}async function ut(e){return P(e)}async function dt(e){return I(e,z)}async function H(e,t=[]){return F(e,z,t)}async function ft(e){return L(e)}async function pt(e){return R(e,z,[`deriveKey`,`deriveBits`])}async function U(e,t){return crypto.subtle.deriveBits({name:`ECDH`,public:t},e,256)}async function W(e,t){let n=crypto.getRandomValues(new Uint8Array(12)),r=await crypto.subtle.encrypt({name:`AES-GCM`,iv:n},e,t);return{ciphertext:new Uint8Array(r),nonce:n}}async function G(e,t,n){let r=await crypto.subtle.decrypt({name:`AES-GCM`,iv:n},e,t);return new Uint8Array(r)}async function mt(e){return crypto.subtle.importKey(`raw`,e,{name:`AES-GCM`},!1,[`encrypt`,`decrypt`])}async function ht(e,t,n){let r=await crypto.subtle.importKey(`raw`,e,{name:`HKDF`},!1,[`deriveKey`]);return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:t,info:j(n)},r,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`])}const K={name:`ECDSA`,namedCurve:`P-256`};async function gt(e=!0){return crypto.subtle.generateKey(K,e,[`sign`,`verify`])}async function _t(e,t){let n=await crypto.subtle.sign({name:`ECDSA`,hash:{name:`SHA-256`}},e,t);return new Uint8Array(n)}async function vt(e,t,n){return crypto.subtle.verify({name:`ECDSA`,hash:{name:`SHA-256`}},e,t,n)}async function yt(e){return N(e)}async function bt(e){return F(e,K,[`verify`])}async function xt(e){return P(e)}async function St(e){return I(e,K,[`verify`])}async function Ct(e){return L(e)}async function wt(e){return R(e,K,[`sign`])}var Tt=e({decodeText:()=>M,decrypt:()=>G,deriveSessionKey:()=>ht,deriveSharedSecret:()=>U,encodeText:()=>j,encrypt:()=>W,exportPrivateKeyPEM:()=>ft,exportPublicKey:()=>V,exportPublicKeyRaw:()=>ut,exportSigningPrivateKeyPEM:()=>Ct,exportSigningPublicKey:()=>yt,exportSigningPublicKeyRaw:()=>xt,fromBase64Url:()=>A,generateECDHKeyPair:()=>B,generateSigningKeyPair:()=>gt,importAESKey:()=>mt,importPrivateKeyPEM:()=>pt,importPublicKey:()=>H,importPublicKeyRaw:()=>dt,importSigningPrivateKeyPEM:()=>wt,importSigningPublicKey:()=>bt,importSigningPublicKeyRaw:()=>St,sign:()=>_t,toBase64Url:()=>k,verify:()=>vt});function Et(e){let t=e.match(/.{1,2}/g);return new Uint8Array(t?.map(e=>parseInt(e,16))??[])}function q(e){return Array.from(e).map(e=>e.toString(16).padStart(2,`0`)).join(``)}async function J(e,t){let n=await B(!0),r=await V(n.publicKey);return{ephemeralKeyPair:n,ephemeralPublicKey:r,signature:q(await _t(e,j(r+t)))}}function Dt(){return q(crypto.getRandomValues(new Uint8Array(16)))}async function Y(e,t,n,r){let i=j(t+r);return vt(e,Et(n),i)}async function X(e,t,n,r){let i;try{i=await H(t)}catch(e){throw e instanceof DOMException&&e.name===`DataError`?new g(`WS_AUTHENTICATION_REJECTED`,`Invalid E2E peer public key`,{cause:e}):e}return ht(await U(e,i),Et(n),r)}async function Ot(e,t,n,r){if(e===t)throw Error(`deriveRelaySaltHex: identityId must differ from peerId`);let[i,a]=e<t?[e,t]:[t,e],[o,s]=e<t?[n,r]:[r,n],c=j(`${i}${a}${o}${s}`),l=new Uint8Array(c).buffer,u=await crypto.subtle.digest(`SHA-256`,l);return q(new Uint8Array(u))}function Z(e,t){return typeof e==`string`&&/^[A-Za-z0-9_-]+$/.test(e)&&e.length%4!=1&&typeof t==`string`&&/^[0-9a-f]{128}$/i.test(t)}function kt(e){return Z(e.ephemeralPublicKey,e.signature)&&typeof e.salt==`string`&&/^[0-9a-f]{32}$/i.test(e.salt)}var At=class{signingKeyPair;identityId;peerId;getPeerSigningKey;timeout;pendingKeyExchange;pendingResult;clientSession;clientEphemeralKeyPair;serverPendingKeyExchange=new Map;serverSessions=new Map;serverEphemeralKeyPairs=new Map;constructor(e){this.signingKeyPair=e.signingKeyPair,this.identityId=e.identityId,this.peerId=e.peerId,this.getPeerSigningKey=e.getPeerSigningKey,this.timeout=e.timeout??1e4}async authenticateClient(e){if(!this.peerId)throw Error(`E2E authentication failed: peerId is required for client authentication`);let t=this.waitForKeyExchangeResponse(),n=this.pendingKeyExchange,r=this.waitForAuthResult();t.catch(()=>void 0),r.catch(()=>void 0);try{let{ephemeralKeyPair:i,ephemeralPublicKey:a,signature:o}=await J(this.signingKeyPair.privateKey,this.identityId);this.assertClientOwner(n),this.clientEphemeralKeyPair=i,e({type:`e2e-key-exchange`,deviceId:this.identityId,ephemeralPublicKey:a,signature:o}),this.assertClientOwner(n);let s=await t;this.assertClientOwner(n);let c=await this.getPeerSigningKey(this.peerId);if(this.assertClientOwner(n),!c)throw new g(`WS_AUTHENTICATION_REJECTED`,`E2E authentication failed: Unknown server`);let l=await Y(c,s.ephemeralPublicKey,s.signature,this.peerId);if(this.assertClientOwner(n),!l)throw new g(`WS_AUTHENTICATION_REJECTED`,`E2E authentication failed: Invalid server signature`);let u=await X(i.privateKey,s.ephemeralPublicKey,s.salt,`makaio-e2e-session-v1`);this.assertClientOwner(n);let d=await r;if(this.assertClientOwner(n),!d.success)throw new g(`WS_AUTHENTICATION_REJECTED`,`E2E authentication failed: ${d.error??`Unknown error`}`);this.clientSession={sessionKey:u,peerId:this.peerId}}catch(e){throw this.pendingKeyExchange===n&&(this.clientSession=void 0,this.clientEphemeralKeyPair=void 0),e}finally{clearTimeout(n.timeoutHandle),this.pendingKeyExchange===n&&(this.pendingKeyExchange=void 0,this.pendingResult&&clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult=void 0)}}async authenticateServer(e,t){let n=this.waitForClientKeyExchange(e),r=this.serverPendingKeyExchange.get(e);try{let i=await n;this.assertServerOwner(e,r);let a=await this.getPeerSigningKey(i.deviceId);if(this.assertServerOwner(e,r),!a)throw new g(`WS_AUTHENTICATION_REJECTED`,`E2E authentication failed: Unknown device ${i.deviceId}`);let o=await Y(a,i.ephemeralPublicKey,i.signature,i.deviceId);if(this.assertServerOwner(e,r),!o)throw new g(`WS_AUTHENTICATION_REJECTED`,`E2E authentication failed: Invalid client signature`);let{ephemeralKeyPair:s,ephemeralPublicKey:c,signature:l}=await J(this.signingKeyPair.privateKey,this.identityId);this.assertServerOwner(e,r);let u=Dt();this.serverEphemeralKeyPairs.set(e,s),t({type:`e2e-key-exchange-response`,ephemeralPublicKey:c,signature:l,salt:u}),this.assertServerOwner(e,r);let d=await X(s.privateKey,i.ephemeralPublicKey,u,`makaio-e2e-session-v1`);this.assertServerOwner(e,r),this.serverSessions.set(e,{sessionKey:d,peerId:i.deviceId}),t({type:`e2e-auth-result`,success:!0}),this.assertServerOwner(e,r)}catch(n){if(this.serverPendingKeyExchange.get(e)===r){this.serverEphemeralKeyPairs.delete(e),this.serverSessions.delete(e);try{n instanceof g&&n.code===`WS_AUTHENTICATION_REJECTED`&&t({type:`e2e-auth-result`,success:!1,error:n.message})}catch{}}throw n}finally{clearTimeout(r.timeoutHandle),this.serverPendingKeyExchange.get(e)===r&&this.serverPendingKeyExchange.delete(e)}}assertClientOwner(e){if(this.pendingKeyExchange!==e)throw new g(`WS_CONNECTION_UNAVAILABLE`,`Connection closed during E2E authentication`)}assertServerOwner(e,t){if(this.serverPendingKeyExchange.get(e)!==t)throw new g(`WS_CONNECTION_UNAVAILABLE`,`Connection closed during E2E authentication`)}handleAuthMessage(e,t){if(typeof e!=`object`||!e||!(`type`in e)||typeof e.type!=`string`)return!1;let n=e;if(n.type===`e2e-key-exchange-response`){if(this.pendingKeyExchange){if(clearTimeout(this.pendingKeyExchange.timeoutHandle),!kt(n))return this.pendingKeyExchange.reject(new g(`WS_AUTHENTICATION_REJECTED`,`Malformed E2E key exchange response`)),!0;this.pendingKeyExchange.resolve({ephemeralPublicKey:n.ephemeralPublicKey,signature:n.signature,salt:n.salt})}return!0}if(n.type===`e2e-auth-result`){if(typeof n.success!=`boolean`)return!0;let e=typeof n.error==`string`?n.error:void 0;return!n.success&&this.pendingKeyExchange&&(clearTimeout(this.pendingKeyExchange.timeoutHandle),this.pendingKeyExchange.reject(new g(`WS_AUTHENTICATION_REJECTED`,`E2E authentication failed: ${e??`Unknown error`}`))),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.resolve({success:n.success,error:e}),void 0),!0}if(n.type===`e2e-key-exchange`&&t){let e=this.serverPendingKeyExchange.get(t);if(e){if(clearTimeout(e.timeoutHandle),typeof n.deviceId!=`string`||!Z(n.ephemeralPublicKey,n.signature))return e.reject(new g(`WS_AUTHENTICATION_REJECTED`,`Malformed E2E key exchange`)),!0;e.resolve({deviceId:n.deviceId,ephemeralPublicKey:n.ephemeralPublicKey,signature:n.signature})}return!0}return!1}async waitForKeyExchangeResponse(){return new Promise((e,t)=>{let n=setTimeout(()=>{t(new g(`WS_HANDSHAKE_TIMEOUT`,`E2E key exchange timeout`))},this.timeout);this.pendingKeyExchange={resolve:e,reject:t,timeoutHandle:n}})}async waitForAuthResult(){return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingResult=void 0,t(new g(`WS_HANDSHAKE_TIMEOUT`,`E2E authentication result timeout`))},this.timeout);this.pendingResult={resolve:e,reject:t,timeoutHandle:n}})}async waitForClientKeyExchange(e){return new Promise((t,n)=>{let r={resolve:t,reject:n,timeoutHandle:setTimeout(()=>{n(new g(`WS_HANDSHAKE_TIMEOUT`,`E2E key exchange timeout`))},this.timeout)};this.serverPendingKeyExchange.set(e,r)})}getSessionKey(e){return e?this.serverSessions.get(e)?.sessionKey??null:this.clientSession?.sessionKey??null}getPeerId(e){return e?this.serverSessions.get(e)?.peerId??null:this.clientSession?.peerId??null}getReceiveContext(e){let t=this.getPeerId(e);if(t!==null)return{transportName:``,peer:{kind:`e2e`,id:t,authenticated:!0,encrypted:!0}}}cleanupSocket(e){let t=this.serverPendingKeyExchange.get(e);t&&(clearTimeout(t.timeoutHandle),t.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Connection closed during E2E authentication`)),this.serverPendingKeyExchange.delete(e)),this.serverSessions.delete(e),this.serverEphemeralKeyPairs.delete(e)}cleanup(){this.pendingKeyExchange&&=(clearTimeout(this.pendingKeyExchange.timeoutHandle),this.pendingKeyExchange.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Connection closed during E2E authentication`)),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Connection closed during E2E authentication`)),void 0),this.clientSession=void 0,this.clientEphemeralKeyPair=void 0;for(let e of this.serverPendingKeyExchange.values())clearTimeout(e.timeoutHandle),e.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Connection closed during E2E authentication`));this.serverPendingKeyExchange.clear(),this.serverSessions.clear(),this.serverEphemeralKeyPairs.clear()}};const Q=`E2E relay auth session aborted by reconnect`;var jt=class{signingKeyPair;identityId;getPeerSigningKey;timeout;mode;blocking;pendingPeer;sessionKey;peerId;localEphemeral;localExchangeMessage;sentLocalExchange=!1;earlyPeer;sendAuthMessage;authGeneration=0;processingExchange=!1;constructor(e){this.signingKeyPair=e.signingKeyPair,this.identityId=e.identityId,this.getPeerSigningKey=e.getPeerSigningKey,this.timeout=e.timeout??1e4,this.mode=e.mode??`initiator`,this.blocking=e.blocking??!0}async authenticateClient(e){let t=this.sendAuthMessage===void 0?this.earlyPeer:void 0;this.cleanup();let n=this.authGeneration;if(this.earlyPeer=t,this.sendAuthMessage=e,this.mode===`initiator`){if(await this.ensureLocalExchangeMessage(),n!==this.authGeneration)throw Error(Q);this.sendLocalExchange()}if(!this.blocking){if(this.earlyPeer){let e=this.earlyPeer;this.earlyPeer=void 0,this.dispatchPeerExchange(e,n)}return}let r=await this.waitForPeerExchange();if(await this.processPeerExchange(r,n),n!==this.authGeneration||!this.sessionKey)throw Error(Q)}async authenticateServer(e,t){throw Error(`E2ERelayAuth does not support server authentication`)}handleAuthMessage(e){let t=e;return!t||t.type!==`e2e-relay-key-exchange`?!1:t.identityId===this.identityId?!0:this.pendingPeer?(this.pendingPeer.resolve(t),this.pendingPeer=void 0,!0):(this.earlyPeer=t,!this.blocking&&this.sendAuthMessage&&!this.sessionKey&&!this.processingExchange&&this.dispatchPeerExchange(t,this.authGeneration),!0)}cleanupSocket(e){}cleanup(){this.authGeneration++,this.pendingPeer&&=(this.pendingPeer.reject(Error(Q)),void 0),this.earlyPeer&&=void 0,this.sessionKey=void 0,this.peerId=void 0,this.localEphemeral=void 0,this.localExchangeMessage=void 0,this.sentLocalExchange=!1,this.processingExchange=!1,this.sendAuthMessage=void 0}dispatchPeerExchange(e,t){this.processingExchange=!0,this.processPeerExchange(e,t).catch(e=>{e instanceof Error&&e.message===Q||console.error(`[E2ERelayAuth] Peer exchange failed:`,e)}).finally(()=>{t===this.authGeneration&&(this.processingExchange=!1,this.retryQueuedPeerExchange(t))})}getSessionKey(){return this.sessionKey??null}getPeerId(){return this.peerId??null}getReceiveContext(){let e=this.getPeerId();if(e!==null)return{transportName:``,peer:{kind:`e2e`,id:e,authenticated:!0,encrypted:!0}}}async waitForPeerExchange(){if(this.earlyPeer){let e=this.earlyPeer;return this.earlyPeer=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingPeer=void 0,t(Error(`E2E relay key exchange timeout`))},this.timeout),r=()=>{clearTimeout(n),this.pendingPeer=void 0};this.pendingPeer={resolve:t=>{r(),e(t)},reject:e=>{r(),t(e)},timeoutHandle:n}})}async ensureLocalExchangeMessage(){if(this.localExchangeMessage&&this.localEphemeral)return this.localExchangeMessage;let{ephemeralKeyPair:e,ephemeralPublicKey:t,signature:n}=await J(this.signingKeyPair.privateKey,this.identityId);return this.localEphemeral=e,this.localExchangeMessage={type:`e2e-relay-key-exchange`,identityId:this.identityId,ephemeralPublicKey:t,signature:n},this.localExchangeMessage}sendLocalExchange(e=!1){!this.sendAuthMessage||!this.localExchangeMessage||!e&&this.sentLocalExchange||(this.sendAuthMessage(this.localExchangeMessage),this.sentLocalExchange=!0)}retryQueuedPeerExchange(e){if(this.blocking||!this.sendAuthMessage||this.sessionKey||this.processingExchange||e!==this.authGeneration)return;let t=this.earlyPeer;t&&(this.earlyPeer=void 0,this.dispatchPeerExchange(t,e))}async processPeerExchange(e,t){if(!this.sendAuthMessage){this.earlyPeer=e;return}let n=await this.ensureLocalExchangeMessage();if(t!==this.authGeneration)return;let r=await this.getPeerSigningKey(e.identityId);if(!r)throw Error(`E2E relay authentication failed: Unknown peer ${e.identityId}`);if(!await Y(r,e.ephemeralPublicKey,e.signature,e.identityId))throw Error(`E2E relay authentication failed: Invalid peer signature`);let i=await Ot(this.identityId,e.identityId,n.ephemeralPublicKey,e.ephemeralPublicKey);if(!this.localEphemeral)throw Error(`E2E relay authentication failed: Local ephemeral key missing`);let a=await X(this.localEphemeral.privateKey,e.ephemeralPublicKey,i,`makaio-e2e-relay-v1`);t===this.authGeneration&&(this.sessionKey=a,this.peerId=e.identityId,this.mode===`initiator`?this.sendLocalExchange(!0):this.sendLocalExchange())}},Mt=class{hmac;e2e;socketStrategy=new Map;pendingServerAuth=new Map;hmacCancelled=new Map;constructor(e){this.hmac=e.hmac,this.e2e=e.e2e}setE2EAuth(e){this.e2e=e}async authenticateClient(e){let t=this.hmac??this.e2e;if(!t)throw Error(`DispatchingAuth: no auth strategy configured`);return t.authenticateClient(e)}async authenticateServer(e,t){let n=this.resolveSingleStrategy();if(n)return n.authenticateServer(e,t);if(!this.hmac||!this.e2e)throw Error(`DispatchingAuth: no auth strategy configured`);let r={cancelled:!1};this.hmacCancelled.set(e,r);let i=this.hmac.authenticateServer(e,e=>{r.cancelled||t(e)});return new Promise((n,a)=>{this.pendingServerAuth.set(e,{resolve:n,reject:a,send:t}),i.then(n).catch(e=>{r.cancelled||a(e instanceof Error?e:Error(String(e)))})})}handleAuthMessage(e,t){if(!t)return(this.hmac??this.e2e)?.handleAuthMessage(e)??!1;let n=this.socketStrategy.get(t);if(n)return n.handleAuthMessage(e,t);let r=this.resolveStrategy(e),i=this.pendingServerAuth.get(t);return r?(this.socketStrategy.set(t,r),this.pendingServerAuth.delete(t),r===this.hmac?this.hmacCancelled.delete(t):(this.cancelHmac(t),i&&r.authenticateServer(t,i.send).then(i.resolve).catch(e=>{i.reject(e instanceof Error?e:Error(String(e)))})),r.handleAuthMessage(e,t)):(this.cancelHmac(t),i&&(this.pendingServerAuth.delete(t),i.reject(new g(`WS_POLICY_REJECTED`,`DispatchingAuth: unrecognised auth message type "${this.peekType(e)}" — no matching strategy`))),!1)}cleanupSocket(e){let t=this.socketStrategy.get(e);t&&(t.cleanupSocket(e),this.socketStrategy.delete(e)),this.cancelHmac(e);let n=this.pendingServerAuth.get(e);n&&(this.pendingServerAuth.delete(e),n.reject(Error(`DispatchingAuth: socket disconnected before auth type was determined`)))}cleanup(){this.hmac?.cleanup(),this.e2e?.cleanup(),this.socketStrategy.clear();for(let e of this.pendingServerAuth.values())e.reject(Error(`DispatchingAuth: cleanup called before authentication completed`));this.pendingServerAuth.clear(),this.hmacCancelled.clear()}peekType(e){if(typeof e!=`object`||!e||!(`type`in e))return;let{type:t}=e;return typeof t==`string`?t:void 0}resolveSingleStrategy(){if(this.hmac&&!this.e2e)return this.hmac;if(this.e2e&&!this.hmac)return this.e2e}resolveStrategy(e){let t=this.peekType(e);if(t){if(t===`e2e-key-exchange`&&this.e2e)return this.e2e;if(t===`auth-response`&&this.hmac)return this.hmac}}cancelHmac(e){let t=this.hmacCancelled.get(e);t&&(t.cancelled=!0,this.hmacCancelled.delete(e),this.hmac?.cleanupSocket(e))}};function Nt(e){return`payload`in e}async function Pt(e,t,n){if(e.type!==`response`||e.result===void 0||e.error!==void 0)return;let{ciphertext:r,nonce:i}=await W(n,j(JSON.stringify(e.result)));t.result=k(r),t.e2e={nonce:k(i),v:1}}async function Ft(e,t,n){if(e.type!==`broadcast-response`||e.results===void 0||e.error!==void 0)return;let{ciphertext:r,nonce:i}=await W(n,j(JSON.stringify(e.results)));t.results=k(r),t.e2e={nonce:k(i),v:1}}async function It(e,t,n){if(!Nt(e)||e.payload===void 0)return;let{ciphertext:r,nonce:i}=await W(n,j(JSON.stringify(e.payload)));t.payload=k(r),t.e2e={nonce:k(i),v:1}}async function Lt(e,t,n){if(e.type!==`response`&&e.type!==`broadcast-response`||e.error===void 0)return;let{ciphertext:r,nonce:i}=await W(n,j(JSON.stringify(e.error)));t.error=k(r),t.e2e={nonce:k(i),v:1}}async function Rt(e,t,n,r){if(!Nt(e)||typeof e.payload!=`string`)return;let i=M(await G(n,A(e.payload),r));t.payload=JSON.parse(i)}async function zt(e,t,n,r){if(e.type!==`response`||typeof e.result!=`string`)return;let i=M(await G(n,A(e.result),r));t.result=JSON.parse(i)}async function Bt(e,t,n,r){if(e.type!==`broadcast-response`||typeof e.results!=`string`)return;let i=M(await G(n,A(e.results),r));t.results=JSON.parse(i)}async function Vt(e,t,n,r){if(e.type!==`response`&&e.type!==`broadcast-response`||typeof e.error!=`string`)return;let i=M(await G(n,A(e.error),r));t.error=JSON.parse(i)}async function Ht(e,t){let n={...e};return await It(e,n,t),await Pt(e,n,t),await Ft(e,n,t),await Lt(e,n,t),n}async function Ut(e,t){if(!e.e2e)return e;let n={...e};delete n.e2e;let r=A(e.e2e.nonce);return await Rt(e,n,t,r),await zt(e,n,t,r),await Bt(e,n,t,r),await Vt(e,n,t,r),n}function Wt(e){return e.type===`subscription-ack`&&typeof e.ackId==`string`}function Gt(e){let{e2eAuth:t,websocket:n,...r}=e,i=new C({...r,url:`<pre-connected>`,createWebSocket:()=>n,auth:t,autoReconnect:!1,heartbeat:r.heartbeat??!1,messageTransform:async e=>{let n=t.getSessionKey();if(!n||Wt(e))return e;let r=e;if(!r.e2e)throw Error(`Received plaintext message on E2E-encrypted channel — possible injection`);return Ut(r,n)}});async function a(e,n){let r=t.getSessionKey();if(!r)throw Error(`E2E session key not available - authentication may have failed`);let a=await Ht(e,r);return i.send(a,n)}return{name:i.name,connect:i.connect.bind(i),disconnect:i.disconnect.bind(i),send:a,cancelRequest:i.cancelRequest.bind(i),onReceive:i.onReceive.bind(i),subscribe:i.subscribe.bind(i),unsubscribe:i.unsubscribe.bind(i),getSubscriptions:i.getSubscriptions.bind(i)}}function Kt(e){return Gt(e)}function qt(e){if(!e||typeof e!=`object`)return!1;let t=e;if(t.type!==`e2e-relay-envelope`||typeof t.payload!=`string`)return!1;let n=t.e2e;return!!n&&typeof n.nonce==`string`&&typeof n.v==`number`}async function Jt(e,t){let{ciphertext:n,nonce:r}=await W(t,j(JSON.stringify(e)));return{type:`e2e-relay-envelope`,payload:k(n),e2e:{nonce:k(r),v:1}}}async function Yt(e,t){let n=A(e.e2e.nonce),r=M(await G(t,A(e.payload),n));return JSON.parse(r)}function Xt(e){let t=()=>{if(!e.isFrozen())throw Error(`RelayControlRegistry must be frozen before processing relay control messages`)};function n(t){return typeof t.namespace!=`string`||typeof t.subject!=`string`||!e.isControlEvent(t.namespace,t.subject)||typeof t.messageId!=`string`?!1:t.payload!==void 0}function r(t){return typeof t.namespace!=`string`||typeof t.subject!=`string`||!e.isControlRequest(t.namespace,t.subject)||typeof t.messageId!=`string`||typeof t.correlationId!=`string`?!1:t.payload!==void 0}function i(e){if(t(),!e||typeof e!=`object`)return!1;let i=e;return i.type===`event`?n(i):i.type===`request`?r(i):!1}function a(e){if(t(),!e||typeof e!=`object`)return!1;let n=e;return n.type!==`relay-control`||n.v!==1||!n.payload||typeof n.payload!=`object`?!1:i(n.payload)}function o(e){if(t(),!i(e))throw Error(`Invalid relay control message`);return{type:`relay-control`,v:1,payload:e}}return{createRelayControlEnvelope:o,isRelayControlEnvelopeMessage:a,isRelayControlBusMessage:i}}function $(e){let t=Date.now()-3e5;for(let[n,r]of e)r>=t||e.delete(n);for(;e.size>2048;){let t=e.keys().next().value;if(!t)break;e.delete(t)}}const Zt=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`response`&&typeof t.correlationId==`string`},Qt=e=>e.type===`subscribe`||e.type===`unsubscribe`,$t=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`subscription-ack`&&typeof t.ackId==`string`};function en(e,t,n,r){if(!r.isFrozen())throw Error(`E2ERelay transport requires a frozen relay control registry`);let{createRelayControlEnvelope:i,isRelayControlEnvelopeMessage:a,isRelayControlBusMessage:o}=Xt(r),s=e=>{n.delete(e),n.set(e,Date.now()),$(n)};return{encode:async t=>{if(o(t))return t.type===`request`&&s(t.correlationId),JSON.stringify(i(t));if($(n),t.type===`response`&&n.has(t.correlationId))return n.delete(t.correlationId),JSON.stringify(t);let r=e.getSessionKey();if(!r&&Qt(t)||!r&&$t(t))return JSON.stringify(t);if(!r)throw Error(`E2E relay session not established`);let a=await Jt(t,r);return JSON.stringify(a)},decode:async r=>{let i=e.getSessionKey();if(a(r)){let e=r.payload;return t&&console.info(`[E2ERelayTransport] Decoded relay control envelope:`,e.type,e.namespace,e.subject),e.type===`request`&&s(e.correlationId),e}if($(n),Zt(r)&&n.has(r.correlationId))return n.delete(r.correlationId),r;if(!i&&$t(r))return r;if(!i)throw Error(`E2E relay session not established`);if(!qt(r))throw Error(`Received plaintext message on relay E2E channel — possible injection`);return Yt(r,i)}}}function tn(e,t,n=!1){let r=new Map;return{codec:en(e,n,r,t),reset:()=>r.clear()}}function nn(e){let{e2eAuth:t,registry:n,websocket:r,...i}=e,a=e.debug??!1,o=new Map,s=en(t,a,o,n);a&&console.info(`[E2ERelayTransport] Creating inner transport...`);let c=new C({...i,url:`<pre-connected>`,createWebSocket:()=>r,auth:t,codec:s,autoReconnect:!1,heartbeat:i.heartbeat??!1});return a&&console.info(`[E2ERelayTransport] Inner transport created`),{name:c.name,connect:async()=>{if(!n.isFrozen())throw Error(`E2ERelayClientTransport: registry must be frozen before connect()`);o.clear();try{await c.connect()}catch(e){throw o.clear(),e}},disconnect:async()=>{o.clear();try{await c.disconnect()}finally{o.clear()}},send:c.send.bind(c),cancelRequest:c.cancelRequest.bind(c),onReceive:(...e)=>(a&&console.info(`[E2ERelayTransport] onReceive called, delegating to inner transport`),c.onReceive(...e)),subscribe:c.subscribe.bind(c),unsubscribe:c.unsubscribe.bind(c),getSubscriptions:c.getSubscriptions.bind(c),isReady:()=>!!t.getSessionKey()&&c.isReady()}}function rn(){let e=!1,t=new Map,n=new Map,r=()=>{if(e)throw Error(`RelayControlRegistry is frozen and cannot be modified`)};return{registerEventSubjects(e,n){r();let i=t.get(e)??new Set;for(let e of n)i.add(e);t.set(e,i)},registerRequestNamespace(e,t){if(r(),t.length===0)throw Error(`RelayControlRegistry request namespace "${e}" requires at least one subject`);let i=n.get(e)??new Set;for(let e of t)i.add(e);n.set(e,i)},freeze(){e=!0},isFrozen(){return e},isControlEvent(e,n){return t.get(e)?.has(n)??!1},isControlRequest(e,t){return n.get(e)?.has(t)??!1}}}function an(e){if(ot(e),e.mode===`client`){if(e.connectionOptions!==void 0)throw Error(`createWebSocketTransport(client) does not support connectionOptions when wrapping a pre-created WebSocket. Use WebSocketClientTransport for reconnect or dial-time socket options.`);let t=e.websocket;return new C({url:`<pre-connected>`,createWebSocket:()=>t,auth:e.auth,debug:e.debug,autoReconnect:!1,heartbeat:!1})}else return new it({websocket:e.websocket,auth:e.auth,debug:e.debug})}export{Mt as DispatchingAuth,At as E2EAuth,jt as E2ERelayAuth,lt as HmacAuth,it as ServerTransport,C as WebSocketClientTransport,g as WebSocketConnectionError,Ie as captureHmacIdentitySecretCleanup,Ve as clearHmacIdentitySecretsForTesting,Kt as createE2EClientTransport,nn as createE2ERelayClientTransport,tn as createE2ERelayCodec,Xt as createRelayControlHelpers,rn as createRelayControlRegistry,at as createWebSocketCloseEvent,an as createWebSocketTransport,Tt as crypto,v as extractSocketErrorMessage,Pe as registerHmacIdentitySecret,ze as resolveHmacIdentityAllowedMessageSubjects,D as resolveHmacIdentityAllowedSubscriptionSubjects,Re as resolveHmacIdentityPeer,Le as resolveHmacIdentitySecret,Fe as rotateHmacIdentitySecret};
1
+ import{r as e}from"../../chunk-DTipWd-i.mjs";import{isRecord as t}from"@makaio/framework/utils";import{ConnectionLostError as n,CorrelationTracker as r,DEFAULT_REQUEST_TIMEOUT_MS as i,NoHandlerError as a,TimeoutError as o,buildSubscribeMessage as s,buildUnsubscribeMessage as c,deserializeTransportError as l,getSubjectFromBusMessage as u,handleCorrelationResponse as d,isNoHandlerErrorForSubject as f,matchesFilter as p,matchesSubscription as m,shouldReceiveMessage as ee,trackMessageCorrelation as h}from"@makaio/framework/bus";const te={baseMs:1e3,maxMs:1e4};function ne(e,t,n){let r=Math.max(t,100),i=Math.max(n,r);return Math.min(r*2**e,i)}function re(e,t){return new Promise(n=>{if(t.aborted){n();return}let r=()=>{clearTimeout(i),t.removeEventListener(`abort`,r),n()},i=setTimeout(()=>{t.removeEventListener(`abort`,r),n()},e);t.addEventListener(`abort`,r)})}const ie={intervalMs:3e4,timeoutMs:1e4},ae={encode:async e=>JSON.stringify(e),decode:async e=>e};function oe(e){return e===!1?!1:{baseMs:e?.baseMs??te.baseMs,maxMs:e?.maxMs??te.maxMs}}function se(e){if(e===!1)return!1;let t=e?.intervalMs??ie.intervalMs,n=e?.timeoutMs??ie.timeoutMs;if(!Number.isFinite(t)||t<=0)throw RangeError(`heartbeat.intervalMs must be a finite number > 0 (got ${String(t)})`);if(!Number.isFinite(n)||n<=0)throw RangeError(`heartbeat.timeoutMs must be a finite number > 0 (got ${String(n)})`);return{intervalMs:t,timeoutMs:n}}var g=class extends Error{code;constructor(e,t,n){super(t,n),this.code=e,this.name=`WebSocketConnectionError`}};function _(e){let t=typeof e==`object`&&!!e&&`code`in e&&e.code===1008;return new g(t?`WS_POLICY_REJECTED`:`WS_CONNECTION_UNAVAILABLE`,t?`WebSocket connection rejected by peer policy`:`WebSocket closed before connection completed`)}function v(e,t=`unknown error`){return`message`in e?String(e.message):t}async function y(e,t,n){let r=await t.encode(e);n.send(r)}function ce(e,t,n){return n?.aborted?Promise.reject(n.reason):e.readyState===1?Promise.resolve():e.readyState>=2?Promise.reject(_()):new Promise((r,i)=>{let a=()=>{u!==void 0&&clearTimeout(u),e.removeEventListener(`open`,o),e.removeEventListener(`error`,s),e.removeEventListener(`close`,c),n?.removeEventListener(`abort`,l)},o=()=>{a(),r()},s=e=>{a(),i(new g(`WS_CONNECTION_UNAVAILABLE`,`WebSocket connection failed — ${v(e)}`,{cause:e}))},c=e=>{a(),i(_(e))},l=()=>{a(),i(n?.reason)},u=t===void 0?void 0:setTimeout(()=>{a(),i(new g(`WS_CONNECTION_TIMEOUT`,`WebSocket open timed out after ${t}ms`))},t);e.addEventListener(`open`,o),e.addEventListener(`error`,s),e.addEventListener(`close`,c),n?.addEventListener(`abort`,l)})}function b(e){if(e.readyState!==0&&e.readyState!==1)return;let t=()=>{},n=()=>{e.removeEventListener(`error`,t),e.removeEventListener(`close`,n)};e.addEventListener(`error`,t),e.addEventListener(`close`,n);try{e.close()}catch(e){throw n(),e}}async function le(e,t,n){let r=await Promise.allSettled(Array.from(t).map(t=>t(e,n.receiveContext)));for(let e of r)e.status===`rejected`&&n.debug&&console.error(`[WebSocketClientTransport:${n.name}] Handler error:`,e.reason);return r.every(e=>e.status===`fulfilled`)}function ue(e,t){return{...t?.getReceiveContext?.(),transportName:e}}async function de(e,t){let{name:n,debug:r,auth:i,codec:a,messageTransform:o,correlations:s}=t,c=JSON.parse(e.toString());if(typeof c!=`object`||!c||typeof c.type!=`string`)return r&&console.error(`[WebSocketClientTransport:${n}] Invalid message structure:`,c),null;let l=c;if(i?.handleAuthMessage(l)||l.type===`heartbeat`)return null;let u=await a.decode(l);return!t.isCurrentSession()||o&&(u=await o(u),!t.isCurrentSession())||u.type===`heartbeat`?null:u.type===`subscribe-sync-complete`?(t.onSyncComplete(),null):u.type===`subscription-ack`?(typeof u.ackId==`string`&&t.onSubscriptionAck(u.ackId),null):d(u,s)?null:u}async function fe(e,t){let{name:n,debug:r,auth:i,handlers:a}=t,o=null;try{o=await de(e,t)}catch(e){r&&console.error(`[WebSocketClientTransport:${n}] Failed to parse message:`,e);return}if(o===null||!t.isCurrentSession())return;let s=ue(n,i),c=o;le(c,a,{debug:r,name:n,receiveContext:s}).then(async e=>{e&&(c.type===`subscribe`||c.type===`unsubscribe`)&&typeof c.ackId==`string`&&await t.sendSubscriptionAck(c.ackId)}).catch(e=>{r&&console.error(`[WebSocketClientTransport:${n}] Handler dispatch error:`,e)})}function pe(e){let t=e;return typeof t.ping==`function`&&typeof t.terminate==`function`&&typeof t.on==`function`&&typeof t.off==`function`}function me(e){e.unref?.()}function he(e,t,n){if(!pe(e))return()=>{};let r=!1,i=Date.now(),a=null,o=null,s=()=>{if(r)return;let e=Date.now()-i,n=Math.max(0,t.intervalMs-e);a=setTimeout(l,n),me(a)},c=()=>{o=null,f(),n.debug&&console.warn(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Heartbeat deadline expired (no message/pong within ${t.timeoutMs}ms) — terminating socket`),e.terminate()},l=()=>{if(a=null,!r&&o===null){if(Date.now()-i<t.intervalMs){s();return}e.readyState===1&&(e.ping(),o=setTimeout(c,t.timeoutMs),me(o))}},u=()=>{i=Date.now(),o!==null&&(clearTimeout(o),o=null),a===null&&s()},d=()=>{f()},f=()=>{r||(r=!0,a!==null&&(clearTimeout(a),a=null),o!==null&&(clearTimeout(o),o=null),e.removeEventListener(`message`,u),e.removeEventListener(`close`,d),e.off(`pong`,u))};return e.addEventListener(`message`,u),e.on(`pong`,u),e.addEventListener(`close`,d),s(),f}async function x(e,t){await Promise.allSettled(e.inFlightMessages),e.getSocket()===t&&e.correlations.rejectAll(e.getSessionFailure()??new n(e.name))}function ge(e,t){let n=n=>{if(t.getSocket()!==e)return;let r=fe(n.data,{isCurrentSession:()=>t.getSocket()===e,name:t.name,debug:t.debug,auth:t.auth,codec:t.codec,messageTransform:t.messageTransform,correlations:t.correlations,handlers:t.handlers,onSyncComplete:()=>{t.readiness===`peer-sync`&&t.resolveReady()},onSubscriptionAck:e=>{t.resolveSubscriptionAck(e)},sendSubscriptionAck:async n=>{t.getSocket()!==e||e.readyState!==1||await y({type:`subscription-ack`,ackId:n},t.codec,e)}}).finally(()=>{t.inFlightMessages.delete(r)});t.inFlightMessages.add(r)};t.setMessageListener(n),e.addEventListener(`message`,n)}function S(e,t){if(t.getSocket()!==e)return;let n=t.getMessageListener();n!==null&&(e.removeEventListener(`message`,n),t.setMessageListener(null));let r=t.getCloseListener();r!==null&&(e.removeEventListener(`close`,r),t.setCloseListener(null))}function _e(e,t,n){let r=[n];if(t.getSocket()===e){S(e,t),t.setSocket(null,n instanceof Error?n:Error(`WebSocket connection failed`,{cause:n})),t.setAuthComplete(!1);try{t.auth?.cleanup()}catch(e){r.push(e)}}try{b(e)}catch(e){r.push(e)}return r.length===1?n:AggregateError(r,`WebSocket connection failed and cleanup was incomplete`,{cause:n})}async function ve(e,t){t.throwIfAborted();let n=new AbortController,r=()=>n.abort(new g(`WS_CONNECTION_UNAVAILABLE`,`WebSocket connection cancelled`));t.addEventListener(`abort`,r);let i=setTimeout(()=>n.abort(new g(`WS_CONNECTION_TIMEOUT`,`WebSocket connection timed out after ${e.connectTimeoutMs}ms`)),e.connectTimeoutMs),a=null,o=()=>{},s=()=>{a?.removeEventListener(`close`,c),a?.removeEventListener(`error`,l)},c=e=>n.abort(_(e)),l=e=>n.abort(new g(`WS_CONNECTION_UNAVAILABLE`,`WebSocket connection failed — ${v(e)}`,{cause:e})),u=t=>{if(o(),a===null)return t;let n=a;return s(),a=null,_e(n,e,t)},d=()=>{},f=new Promise((e,t)=>{d=()=>{t(u(n.signal.reason))},n.signal.addEventListener(`abort`,d)});try{let t=ye(e,n.signal,()=>{o=e.resetReadyPromise()},t=>{a=t,e.setSocket(t),e.setAuthComplete(!1),t.addEventListener(`close`,c),t.addEventListener(`error`,l),ge(t,e)});await Promise.race([t,f])}catch(e){throw u(e)}finally{clearTimeout(i),t.removeEventListener(`abort`,r),n.signal.removeEventListener(`abort`,d),s()}}async function ye(e,t,r,i){e.inFlightMessages.size>0&&await Promise.allSettled(e.inFlightMessages),t.throwIfAborted();let a=e.getSocket();e.correlations.rejectAll(e.getSessionFailure()??new n(e.name)),e.inFlightMessages.clear(),e.resolveReady(),e.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: reconnecting before subscription ack`)),r(),t.throwIfAborted(),a!==null&&S(a,e);let o=await e.wsFactory(e.url);t.aborted&&(b(o),t.throwIfAborted()),i(o),await be(o,e,t)}async function be(e,t,n){if(await ce(e,void 0,n),n.throwIfAborted(),t.auth&&(await t.auth.authenticateClient(t=>{if(n.throwIfAborted(),e.readyState!==1)throw _();e.send(JSON.stringify(t))}),n.throwIfAborted()),t.setAuthComplete(!0),t.localSubscriptions.size>0){let r=await t.codec.encode(s(t.localSubscriptions));n.throwIfAborted(),e.send(r)}t.heartbeat!==!1&&he(e,t.heartbeat,t),t.readiness===`session-established`&&t.resolveReady(),t.debug&&console.info(`[WebSocketClientTransport:${t.name}] Connected to ${t.url}`),t.notifyConnected()}function xe(e,t){return new Promise(n=>{if(e.readyState===3||t.aborted){n();return}let r=()=>{t.removeEventListener(`abort`,i),n()},i=()=>{e.removeEventListener(`close`,r),n()};e.addEventListener(`close`,r),t.addEventListener(`abort`,i)})}async function Se(e,t,r,i,a){a(!0);try{for(;!e.aborted;){let a=r.getSocket(),o=a!==null;if(a!==null&&a.readyState!==3&&await xe(a,e),e.aborted)break;if(o&&a!==null){if(await x(r,a),e.aborted)break;r.debug&&console.info(`[WebSocketClientTransport:${r.name}] ${new Date().toISOString()} Connection lost, starting reconnect loop (maxMs=${t.maxMs})`),r.notifyDisconnected()}let s=0;for(;!e.aborted;){let a=ne(s,t.baseMs,t.maxMs);r.debug&&console.info(`[WebSocketClientTransport:${r.name}] ${new Date().toISOString()} Reconnecting in ${a}ms (attempt ${s+1})`);let o=new AbortController;if(i(o),await re(a,AbortSignal.any([e,o.signal])),i(null),e.aborted)break;try{if(await ve(r,e),e.aborted)break;s=0;let t=r.getSocket();if(t!==null){let i=async()=>{await Promise.allSettled(r.inFlightMessages),!(e.aborted||r.getSocket()!==t)&&(r.correlations.rejectAll(r.getSessionFailure()??new n(r.name)),r.auth?.cleanup(),r.setAuthComplete(!1),r.debug&&console.info(`[WebSocketClientTransport:${r.name}] ${new Date().toISOString()} Connection closed`),r.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`)))};r.setCloseListener(i),t.addEventListener(`close`,i),await xe(t,e)}break}catch(e){if(r.debug){let t=e instanceof Error?e.message:String(e);console.warn(`[WebSocketClientTransport:${r.name}] ${new Date().toISOString()} Connect attempt ${s+1} failed: ${t}`)}s++}}}}finally{a(!1)}}function Ce(e,t,n){let r=async()=>{t.getSocket()===e&&(S(e,t),t.auth?.cleanup(),t.setAuthComplete(!1),n(),t.resolveReady(),t.notifyDisconnected(),await x(t,e),t.getSocket()===e&&(t.setSocket(null),t.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`))))};t.setCloseListener(r),e.addEventListener(`close`,r)}async function we(e,t,n,r,i){let a=i.localSubscriptions.get(e),o=a?.filter,c=t??o,l=r??a?.deliveryClass??`relayable`;if(i.localSubscriptions.set(e,{filter:c,priorities:n,deliveryClass:l}),i.socket!==null&&i.socket.readyState===1){let t=i.beginSubscriptionAck?.(),r=s(new Map([[e,{filter:c,priorities:n,deliveryClass:l}]]),t?.ackId);try{await y(r,i.codec,i.socket),await t?.promise}catch(e){throw t?.reject(e),e}}i.debug&&console.info(`[WebSocketClientTransport:${i.name}] Subscribed to ${e}${c?` with filter`:``}`)}async function Te(e,t){let n=t.localSubscriptions.get(e);if(t.localSubscriptions.delete(e),t.socket!==null&&t.socket.readyState===1){let r=t.beginSubscriptionAck?.(),i=c({[e]:n?.priorities??[]},r?.ackId);try{await y(i,t.codec,t.socket),await r?.promise}catch(e){throw r?.reject(e),e}}t.debug&&console.info(`[WebSocketClientTransport:${t.name}] Unsubscribed from ${e}`)}var Ee=class{name;termination=new AbortController;ownedSocket;onClose;constructor(e,t){this.name=t,this.ownedSocket=e,this.onClose=e=>{let r=_(e);this.end(r.code===`WS_POLICY_REJECTED`?r:new n(t))},e.addEventListener(`close`,this.onClose)}get socket(){return this.ownedSocket}get signal(){return this.termination.signal}get failure(){return this.signal.reason instanceof Error?this.signal.reason:void 0}end(e){this.ownedSocket?.removeEventListener(`close`,this.onClose),this.termination.abort(e)}release(e=new n(this.name)){this.end(e),this.ownedSocket=null}writable(e,t){if(t?.throwIfAborted(),this.signal.throwIfAborted(),e!==this||this.ownedSocket===null)throw new n(this.name);let r=this.ownedSocket;if(r.readyState===2||r.readyState===3){if(t===void 0)throw Error(`WebSocket is closing; uncorrelated message was not sent`);return De(new Promise(()=>{}),AbortSignal.any([t,this.signal]))}if(r.readyState!==1)throw new n(this.name);return r}};async function De(e,t){let n=()=>{},r=new Promise((e,r)=>{n=()=>r(t.reason),t.addEventListener(`abort`,n,{once:!0}),t.aborted&&n()});try{return await Promise.race([e,r])}finally{t.removeEventListener(`abort`,n)}}async function Oe(e,t,r){let i=e.session;if(i===null)throw new n(e.name);if(i.signal.throwIfAborted(),t.type!==`request`&&t.type!==`broadcast`)return await ke(e,i,t),h(t,e.correlations,r);let a=new AbortController,o=h(t,e.correlations,r).then(e=>(a.abort(),e),e=>{throw a.abort(e),e});return ke(e,i,t,a.signal).catch(n=>{if(a.signal.aborted)return;let r=n instanceof Error?n:Error(`WebSocket send failed`,{cause:n});e.correlations.reject(t.correlationId,r)}),o}async function ke(e,t,n,r){let i=t.writable(e.currentSession(),r);i instanceof Promise&&await i;let a=r===void 0?t.signal:AbortSignal.any([r,t.signal]);a.throwIfAborted();let o=await De(e.codec.encode(n),a),s=t.writable(e.currentSession(),r);s instanceof Promise?await s:s.send(o)}var C=class{name;url;auth;codec;messageTransform;autoReconnectConfig;heartbeatConfig;connectTimeoutMs;readiness;wsFactory;debug;onConnectedCallback;onDisconnectedCallback;session=null;authComplete=!1;correlations=new r;handlers=new Set;localSubscriptions=new Map;pendingSubscriptionAcks=new Map;subscriptionAckSeq=0;messageListener=null;closeListener=null;reconnectAbort=null;inFlightMessages=new Set;backoffWakeAbort=null;reconnectLoopRunning=!1;readyResolve=null;ready;onNewReadySession=void 0;onConnected=void 0;onDisconnected=void 0;get socket(){return this.session?.socket??null}constructor(e){this.url=e.url,this.name=e.name??`ws-client`,this.auth=e.auth,this.codec=e.codec??ae,this.messageTransform=e.messageTransform,this.debug=e.debug??!1,this.autoReconnectConfig=oe(e.autoReconnect),this.heartbeatConfig=se(e.heartbeat),this.connectTimeoutMs=e.connectTimeoutMs??3e4,this.readiness=e.readiness??`peer-sync`,this.wsFactory=e.createWebSocket??this.defaultWsFactory,this.onConnectedCallback=e.onConnected,this.onDisconnectedCallback=e.onDisconnected,this.ready=new Promise(e=>{this.readyResolve=e})}async connect(){if(this.reconnectAbort!==null)throw Error(`WebSocketClientTransport: already connected`);let e=new AbortController;this.reconnectAbort=e;try{await ve(this.connectionDeps(),e.signal)}catch(t){throw this.reconnectAbort===e&&(this.reconnectAbort=null),t}if(e.signal.aborted||this.reconnectAbort!==e)throw new g(`WS_CONNECTION_UNAVAILABLE`,`WebSocket connection cancelled`);this.autoReconnectConfig===!1?this.socket!==null&&this.wireNoReconnectClose(this.socket):this.startReconnectLoop(e.signal)}async disconnect(){let e=this.reconnectAbort,t=this.socket;this.reconnectAbort=null,e?.abort(new g(`WS_CONNECTION_UNAVAILABLE`,`WebSocket connection cancelled`));let r=t===null||this.socket===t;if(this.reconnectLoopRunning=!1,this.backoffWakeAbort=null,this.readyResolve?.(),this.readyResolve=null,this.socket!==null){S(this.socket,this.connectionDeps());let e=this.socket;this.session?.release(),this.authComplete=!1,b(e)}this.correlations.rejectAll(this.session?.failure??new n(this.name)),this.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`)),r&&this.auth?.cleanup(),this.handlers.clear(),this.debug&&console.info(`[WebSocketClientTransport:${this.name}] Disconnected`)}async send(e,t){return Oe({session:this.session,currentSession:()=>this.session,name:this.name,codec:this.codec,correlations:this.correlations},e,t??i)}onReceive(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}async subscribe(e,t,n=[],r){await we(e,t,n,r,this.subscriptionDeps())}async unsubscribe(e){await Te(e,this.subscriptionDeps())}getSubscriptions(){return new Set(this.localSubscriptions.keys())}cancelRequest(e,t){this.correlations.cancel(e,t)}hasLiveWireSession(){return this.socket!==null&&this.socket.readyState===1&&this.authComplete}isReady(){return this.hasLiveWireSession()}canSend(e){return this.hasLiveWireSession()&&(this.codec.canEncode?.(e)??!0)}async reconnect(){if(!this.hasLiveWireSession()){if(this.backoffWakeAbort!==null){this.backoffWakeAbort.abort(),this.backoffWakeAbort=null;return}if(this.autoReconnectConfig!==!1){if(this.reconnectLoopRunning){let e=this.socket;e!==null&&e.readyState===0&&e.close();return}return}try{this.reconnectAbort===null&&await this.connect()}catch{}}}startReconnectLoop(e){return Se(e,this.autoReconnectConfig,this.connectionDeps(),t=>{e.aborted||(this.backoffWakeAbort=t)},t=>{this.reconnectAbort?.signal===e&&(this.reconnectLoopRunning=t)})}subscriptionDeps(){return{name:this.name,debug:this.debug,codec:this.codec,socket:this.socket,localSubscriptions:this.localSubscriptions,beginSubscriptionAck:()=>this.beginSubscriptionAck()}}beginSubscriptionAck(){let e=`${this.name}:sub:${++this.subscriptionAckSeq}`,t,n,r=new Promise((e,r)=>{t=e,n=r});r.catch(()=>void 0);let i=t=>{this.pendingSubscriptionAcks.has(e)&&(this.pendingSubscriptionAcks.delete(e),t())};return this.pendingSubscriptionAcks.set(e,{resolve:()=>i(t),reject:e=>i(()=>n(e))}),{ackId:e,promise:r,reject:t=>this.rejectSubscriptionAck(e,t)}}resolveSubscriptionAck(e){this.pendingSubscriptionAcks.get(e)?.resolve()}rejectSubscriptionAck(e,t){this.pendingSubscriptionAcks.get(e)?.reject(t)}rejectPendingSubscriptionAcks(e){for(let t of this.pendingSubscriptionAcks.keys())this.rejectSubscriptionAck(t,e)}connectionDeps(){return{name:this.name,debug:this.debug,auth:this.auth,codec:this.codec,messageTransform:this.messageTransform,correlations:this.correlations,handlers:this.handlers,localSubscriptions:this.localSubscriptions,wsFactory:this.wsFactory,url:this.url,connectTimeoutMs:this.connectTimeoutMs,readiness:this.readiness,heartbeat:this.heartbeatConfig,getSocket:()=>this.socket,setSocket:(e,t)=>{this.session?.release(t),e!==null&&(this.session=new Ee(e,this.name))},getSessionFailure:()=>this.session?.failure,setAuthComplete:e=>{this.authComplete=e},getMessageListener:()=>this.messageListener,setMessageListener:e=>{this.messageListener=e},getCloseListener:()=>this.closeListener,setCloseListener:e=>{this.closeListener=e},resolveReady:()=>{this.readyResolve?.(),this.readyResolve=null},resetReadyPromise:()=>{let e;this.ready=new Promise(t=>{this.readyResolve=t,e=t});let t=()=>{e(),this.readyResolve===e&&(this.readyResolve=null)};try{this.onNewReadySession?.(this.ready)}catch(e){throw t(),e}return t},resolveSubscriptionAck:e=>{this.resolveSubscriptionAck(e)},rejectPendingSubscriptionAcks:e=>{this.rejectPendingSubscriptionAcks(e)},notifyConnected:()=>{let e=this.socket;this.onConnectedCallback?.(),this.socket===e&&this.hasLiveWireSession()&&this.onConnected?.()},notifyDisconnected:()=>{this.onDisconnectedCallback?.(),this.onDisconnected?.()},inFlightMessages:this.inFlightMessages}}defaultWsFactory=async e=>new(await(import(`ws`))).WebSocket(e);wireNoReconnectClose(e){Ce(e,this.connectionDeps(),()=>{this.reconnectAbort=null})}};function w(e){e.timer!==void 0&&clearTimeout(e.timer)}var Ae=class{pendingBroadcasts=new Map;timeout;debug;constructor(e={}){this.timeout=e.timeout??5e3,this.debug=e.debug??!1}startClientBroadcast(e,t,n,r,i){let a=t.correlationId,o=i??this.timeout,s={kind:`client`,sender:e,results:[],pendingClients:new Set(n),nodeResultsReceived:!1,timer:o===0?void 0:setTimeout(()=>{this.debug&&console.warn(`[BroadcastAggregator] Broadcast ${a} timed out`),this.finalizeBroadcast(a)},o)};this.pendingBroadcasts.set(a,s);let c=JSON.stringify(t);for(let e of n)r(e,c);this.debug&&console.info(`[BroadcastAggregator] Broadcast ${a} forwarded to ${n.length} clients`)}startServerBroadcast(e,t,n,r){let i=e.correlationId,a=r??this.timeout;return t.length===0?(this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${i} - no target clients`),Promise.resolve([])):new Promise(r=>{let o={kind:`server`,results:[],pendingClients:new Set(t),timer:a===0?void 0:setTimeout(()=>{this.debug&&console.warn(`[BroadcastAggregator] Server broadcast ${i} timed out`),this.finalizeServerBroadcast(i)},a),resolve:r};this.pendingBroadcasts.set(i,o);let s=JSON.stringify(e);for(let e of t)n(e,s);this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${i} sent to ${t.length} clients`)})}handleResponse(e,t){let n=this.pendingBroadcasts.get(t.correlationId);return n?(t.results&&n.results.push(...t.results),n.pendingClients.delete(e),this.debug&&console.info(`[BroadcastAggregator] Broadcast ${t.correlationId} got response, ${n.pendingClients.size} pending`),this.checkBroadcastComplete(t.correlationId,n),!0):!1}handleNodeResults(e,t,n){let r=this.pendingBroadcasts.get(e);return!r||r.kind!==`client`?!1:(r.results.push(...t),r.nodeResultsReceived=!0,r.nodeError=n,this.debug&&console.info(`[BroadcastAggregator] Broadcast ${e} node results aggregated${n?` (with error)`:``}`),this.checkBroadcastComplete(e,r),!0)}handleClientDisconnect(e){for(let[t,n]of this.pendingBroadcasts)n.kind===`client`&&n.sender===e?(w(n),this.pendingBroadcasts.delete(t)):n.pendingClients.has(e)&&(n.pendingClients.delete(e),this.checkBroadcastComplete(t,n))}cleanup(){for(let e of this.pendingBroadcasts.values())w(e),e.kind===`server`&&e.resolve(e.results);this.pendingBroadcasts.clear()}checkBroadcastComplete(e,t){if(!(t.pendingClients.size>0))if(t.kind===`client`){if(!t.nodeResultsReceived)return;this.finalizeBroadcast(e)}else this.finalizeServerBroadcast(e)}finalizeBroadcast(e){let t=this.pendingBroadcasts.get(e);if(!t||t.kind!==`client`)return;w(t),this.pendingBroadcasts.delete(e);let n=t.nodeError?{type:`broadcast-response`,correlationId:e,error:t.nodeError}:{type:`broadcast-response`,correlationId:e,results:t.results};t.sender.readyState===1&&t.sender.send(JSON.stringify(n)),this.debug&&console.info(`[BroadcastAggregator] Broadcast ${e} finalized with ${t.results.length} results`)}finalizeServerBroadcast(e){let t=this.pendingBroadcasts.get(e);!t||t.kind!==`server`||(w(t),this.pendingBroadcasts.delete(e),t.resolve(t.results),this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${e} finalized with ${t.results.length} results`))}},je=class{clients=new Set;authenticatingClients=new Set;clientSubscriptions=new Map;clientSubscriptionState=new Map;clientFilters=new Map;requestOrigins=new Map;debug;subscriptionSubjectRestrictionResolver;requiredSubscriptionFilterResolver;socketAuthChecker;constructor(e={}){this.debug=e.debug??!1,this.subscriptionSubjectRestrictionResolver=e.subscriptionSubjectRestrictionResolver,this.requiredSubscriptionFilterResolver=e.requiredSubscriptionFilterResolver,this.socketAuthChecker=e.socketAuthChecker}addAuthenticating(e){this.authenticatingClients.add(e)}removeAuthenticating(e){this.authenticatingClients.delete(e)}isAuthenticating(e){return this.authenticatingClients.has(e)}addClient(e){this.clients.add(e)}removeClient(e){let t=new Set(this.clientSubscriptionState.get(e)?.keys()??[]);this.clients.delete(e),this.authenticatingClients.delete(e),this.clientSubscriptions.delete(e),this.clientSubscriptionState.delete(e),this.clientFilters.delete(e);for(let[t,n]of this.requestOrigins)n.socket===e&&this.clearRequestOrigin(t,n);return this.debug&&console.info(`[ClientRegistry] Client removed (${this.clients.size} remaining)`),this.buildAggregateUpdates(t)}get size(){return this.clients.size}getAllSockets(){return new Set([...this.clients,...this.authenticatingClients])}handleSubscribeMessage(e,t){let n=this.clientSubscriptions.get(e);n||(n=new Set,this.clientSubscriptions.set(e,n));let r=this.clientFilters.get(e),i=this.clientSubscriptionState.get(e);i||(i=new Map,this.clientSubscriptionState.set(e,i));for(let[a,o]of Object.entries(t.subjects)){n.add(a),i.set(a,{priorities:o,deliveryClass:t.deliveryClasses?.[a]===`relayable`?`relayable`:`first-hop-only`});let s=t.filters?.[a];s===void 0?r?.delete(a):(r||(r=new Map,this.clientFilters.set(e,r)),r.set(a,s))}if(this.debug){let e=Object.keys(t.subjects).length,n=t.filters?Object.keys(t.filters).length:0;console.info(`[ClientRegistry] Client subscribed to ${e} subjects, ${n} filters`)}return this.buildAggregateUpdates(new Set(Object.keys(t.subjects)))}handleUnsubscribeMessage(e,t){let n=this.clientSubscriptions.get(e),r=this.clientFilters.get(e);for(let i of Object.keys(t))n?.delete(i),this.clientSubscriptionState.get(e)?.delete(i),r?.delete(i);return this.debug&&console.info(`[ClientRegistry] Client unsubscribed from ${Object.keys(t).length} subjects`),this.buildAggregateUpdates(new Set(Object.keys(t)))}getReadyClients(){let e=[];for(let t of this.clients)t.readyState===1&&e.push(t);return e}trackRequestOrigin(e,t){let{correlationId:n}=t;if(this.requestOrigins.has(n))return;let r=this.getRequestRemainingLifetime(t);if(r!==void 0&&r<=0)return;let i={socket:e,expiration:void 0};r!==void 0&&(i.expiration=setTimeout(()=>{this.requestOrigins.get(n)===i&&this.requestOrigins.delete(n)},r)),this.requestOrigins.set(n,i)}getRequestOrigin(e){return this.requestOrigins.get(e)?.socket}consumeResponseClient(e){let t=this.requestOrigins.get(e);if(t)return this.clearRequestOrigin(e,t),this.isReadyAndAuthenticated(t.socket)?t.socket:void 0}cancelRequestOrigin(e){let t=this.requestOrigins.get(e);t&&this.clearRequestOrigin(e,t)}getInterestedClients(e,t,n){let r=[];for(let i of this.clients)i===n||!this.isReadyAndAuthenticated(i)||this.clientWantsMessage(i,e,t)&&this.isSubjectAllowedForClient(i,e)&&this.isPayloadAllowedForClient(i,e,t)&&r.push(i);return r}getInterestedRequestClients(e,t,n){return this.getInterestedClients(e,t,n).filter(t=>{let n=this.clientSubscriptionState.get(t);return n?[...n].some(([t,n])=>n.priorities.length>0&&m(e,t)):!1})}forwardEventToClients(e,t,n){let r=u(t)??void 0,i=`payload`in t?t.payload:void 0,a=JSON.stringify(t),o=this.getInterestedClients(r,i,e);for(let e of o)n(e,a)}clientWantsMessage(e,t,n){return ee(t,n,this.clientSubscriptions.get(e)??new Set,this.clientFilters.get(e)??new Map)}isReadyAndAuthenticated(e){return e.readyState===1?!this.socketAuthChecker||this.socketAuthChecker(e)?!0:(e.close(1008,`Authentication expired`),!1):!1}getRequestRemainingLifetime(e){let t=e.timeout??i;return t>0?t:void 0}clearRequestOrigin(e,t){t.expiration!==void 0&&clearTimeout(t.expiration),this.requestOrigins.delete(e)}isSubjectAllowedForClient(e,t){if(!this.subscriptionSubjectRestrictionResolver||t===void 0)return!0;let n=this.subscriptionSubjectRestrictionResolver(e);return n===null?!0:[...n].some(e=>m(t,e))}isPayloadAllowedForClient(e,t,n){if(!this.requiredSubscriptionFilterResolver||t===void 0)return!0;let r=this.requiredSubscriptionFilterResolver(e)?.[t];return r===void 0||p(n,r)}buildAggregateUpdates(e){let t={},n={},r={};for(let i of e){let e=new Set,a=!1,o=`relayable`;for(let t of this.clientSubscriptionState.values()){let n=t.get(i);if(n){a=!0;for(let t of n.priorities)e.add(t);n.deliveryClass===`first-hop-only`&&(o=`first-hop-only`)}}a?(t[i]=[...e].sort((e,t)=>t-e),n[i]=o):r[i]=[]}let i=[];return Object.keys(t).length>0&&i.push({type:`subscribe`,subjects:t,deliveryClasses:n}),Object.keys(r).length>0&&i.push({type:`unsubscribe`,subjects:r}),i}};const T=new Map;function Me(e){if(typeof e==`object`&&e){for(let t of Object.values(e))Me(t);Object.freeze(e)}return e}function Ne(e){let t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Me(structuredClone(t))]));return Object.freeze(t)}function E(e,t){let n=!0;return()=>{n&&(n=!1,T.get(e)===t&&T.delete(e))}}function Pe(e,t,n){if(e.trim().length===0)throw Error(`registerHmacIdentitySecret requires a non-empty identityId`);if(t.length===0)throw Error(`registerHmacIdentitySecret requires a non-empty secret`);if(`allowedSubjects`in n)throw Error(`registerHmacIdentitySecret no longer accepts allowedSubjects; use allowedMessageSubjects and/or allowedSubscriptionSubjects`);let r=n.peerKind.trim();if(r.length===0)throw Error(`registerHmacIdentitySecret requires a non-empty peerKind`);let i=n.allowedMessageSubjects!==void 0||n.allowedSubscriptionSubjects!==void 0;if(n.requiredSubscriptionFilters!==void 0){for(let e of Object.keys(n.requiredSubscriptionFilters))if(e.includes(`*`))throw Error(`registerHmacIdentitySecret requires exact full subjects for requiredSubscriptionFilters`)}let a={secret:t,peerKind:r,...n.claims===void 0?{}:{claims:n.claims},...i?{allowedMessageSubjects:new Set(n.allowedMessageSubjects??[]),allowedSubscriptionSubjects:new Set(n.allowedSubscriptionSubjects??[])}:{},...n.requiredSubscriptionFilters===void 0?{}:{requiredSubscriptionFilters:Ne(n.requiredSubscriptionFilters)}};return T.set(e,a),E(e,a)}function Fe(e,t,n={}){if(t.length===0)throw Error(`rotateHmacIdentitySecret requires a non-empty secret`);let r=T.get(e);if(!r)throw Error(`Cannot rotate HMAC identity secret: no registration exists for '${e}'`);let i={secret:t,peerKind:r.peerKind,...n.claims===void 0?r.claims===void 0?{}:{claims:r.claims}:{claims:n.claims},...r.allowedMessageSubjects===void 0?{}:{allowedMessageSubjects:r.allowedMessageSubjects},...r.allowedSubscriptionSubjects===void 0?{}:{allowedSubscriptionSubjects:r.allowedSubscriptionSubjects},...r.requiredSubscriptionFilters===void 0?{}:{requiredSubscriptionFilters:r.requiredSubscriptionFilters}};return T.set(e,i),E(e,i)}function Ie(e){let t=T.get(e);return t===void 0?void 0:E(e,t)}function Le(e){return T.get(e)?.secret??null}function Re(e){let t=T.get(e);return t?{kind:t.peerKind,id:e,authenticated:!0,...t.claims===void 0?{}:{claims:t.claims}}:null}function ze(e){return T.get(e)?.allowedMessageSubjects??null}function D(e){return T.get(e)?.allowedSubscriptionSubjects??null}function Be(e){return T.get(e)?.requiredSubscriptionFilters??null}function Ve(){T.clear()}function He(e){return e.type===`request`||e.type===`event`||e.type===`broadcast`}function Ue(e){return t(e)&&Object.values(e).every(e=>Array.isArray(e)&&e.every(e=>typeof e==`number`&&Number.isFinite(e)))}function We(e){return e.endsWith(`*`)}function Ge(e,t,n,r){let i={};for(let[a,o]of Object.entries(e))We(a)?t===null||t.has(a)?i[a]=o:n&&console.debug(`[ServerTransport] Dropping wildcard subscription '${a}': not in allowedSubscriptionSubjects for peer '${r}'`):t===null||[...t].some(e=>m(a,e))?i[a]=o:n&&console.debug(`[ServerTransport] Dropping subscription subject '${a}': not allowed for peer '${r}'`);return Object.keys(i).length>0?i:null}async function O(e,t,n){let r=await Promise.allSettled(Array.from(t).map(t=>t(e,n.receiveContext)));for(let e of r)if(e.status===`rejected`&&n.debug){let t=n.logContext?` ${n.logContext}`:``;console.error(`[ServerTransport] Handler error${t}:`,e.reason)}return r.every(e=>e.status===`fulfilled`)}async function Ke(e,t,n){let r=!0;for(let i of e)await O(i,t,n)||(r=!1);return r}function qe(e,t,n){let{correlations:r,broadcastAggregator:i,debug:a}=t;if(e.type===`heartbeat`)return!0;if(e.type===`response`){let t=e;return typeof t.correlationId==`string`?(t.error?r.reject(t.correlationId,l(t.error)):r.resolve(t.correlationId,t.result),!0):(a&&console.warn(`[ServerTransport] Malformed response message: missing correlationId`),!0)}if(e.type===`broadcast-response`){let t=e;return typeof t.correlationId==`string`?(i.handleResponse(n,t),!0):(a&&console.warn(`[ServerTransport] Malformed broadcast-response: missing correlationId`),!0)}return!1}function Je(e){let t=e?.peer?.id;if(t===void 0)return null;let n=ze(t),r=D(t);return n===null&&r===null?null:{peerId:t,allowedMessageSubjects:n,allowedSubscriptionSubjects:r}}function Ye(e,t,n,r){if(r===null||!He(e))return!1;let i=`${e.namespace}.${e.subject}`;return r.allowedMessageSubjects===null||r.allowedMessageSubjects.has(i)?!1:(e.type===`request`&&n.sendSafely(t,JSON.stringify({type:`response`,correlationId:e.correlationId,error:{message:`Subject '${i}' is not allowed for peer '${r.peerId}'`}})),n.debug&&console.warn(`[ServerTransport] Dropping ${e.type} to '${i}': not allowed for peer '${r.peerId}'`),!0)}function Xe(e,t,n){if(!Ue(e.subjects))return n&&console.warn(`[ServerTransport] Malformed ${e.type} message: missing subjects record`),null;if(t===null)return e.subjects;let r=Ge(e.subjects,t.allowedSubscriptionSubjects,n,t.peerId);return r===null&&n&&console.debug(`[ServerTransport] Dropping ${e.type} message: all subjects filtered for peer '${t.peerId}'`),r}async function Ze(e,t,n,r,i){if(e.type!==`subscribe`&&e.type!==`unsubscribe`)return!1;let a=e,o=Xe(a,i,n.debug);return o===null||await Ke(a.type===`subscribe`?n.registry.handleSubscribeMessage(t,{...a,subjects:o}):n.registry.handleUnsubscribeMessage(t,o),n.handlers,{debug:n.debug,receiveContext:r,logContext:`dispatching ${a.type}`})&&typeof a.ackId==`string`&&n.sendSafely(t,JSON.stringify({type:`subscription-ack`,ackId:a.ackId})),!0}async function Qe(e,t,n,r){if(e.type!==`broadcast`)return!1;let i=e;if(typeof i.correlationId!=`string`||typeof i.subject!=`string`)return n.debug&&console.warn(`[ServerTransport] Malformed broadcast message: missing correlationId or subject`),!0;let a=u(i)??void 0,o=n.registry.getInterestedClients(a,i.payload,t),s=n.normalizeBroadcastTimeout(i.timeout);return n.broadcastAggregator.startClientBroadcast(t,i,o,n.sendSafely,s),await O(e,n.handlers,{debug:n.debug,receiveContext:r}),!0}async function $e(e,t,n){if(qe(e,n,t))return;let r=n.auth?.getReceiveContext?.(t),i=Je(r);if(!Ye(e,t,n,i)){if(e.type===`subscribe`||e.type===`unsubscribe`){await Ze(e,t,n,r,i);return}if(e.type===`broadcast`){await Qe(e,t,n,r);return}e.type===`event`&&n.registry.forwardEventToClients(t,e,n.sendSafely),e.type===`request`&&n.registry.trackRequestOrigin(t,e),await O(e,n.handlers,{debug:n.debug,receiveContext:r})}}function et(e,t){let{auth:n,registry:r,debug:i}=t;return async a=>{let o;try{o=JSON.parse(a.toString())}catch(e){i&&console.error(`[ServerTransport] Failed to parse message:`,e);return}let s=o&&typeof o==`object`?o:void 0;if(!s||typeof s.type!=`string`){i&&console.error(`[ServerTransport] Invalid message structure:`,o);return}let c=o;try{if(n?.handleAuthMessage(c,e))return;if(n&&r.isAuthenticating(e)){i&&console.warn(`[ServerTransport] Ignoring message from unauthenticated client`);return}if(n?.isSocketAuthenticated?.(e)===!1){i&&console.warn(`[ServerTransport] Closing socket with expired authentication`),n.cleanupSocket(e),e.close(1008,`Authentication expired`);return}await $e(c,e,t)}catch(e){i&&console.error(`[ServerTransport] Failed to process message:`,e)}}}function tt(e){return typeof e!=`number`||!Number.isFinite(e)||e<=0?5e3:Math.min(e,6e4)}async function nt(e,t){let{registry:n,correlations:r,broadcastAggregator:i,handlers:a,auth:o,serverSubscriptions:c,sendSafely:l,debug:u}=t;o&&n.addAuthenticating(e);let d=et(e,{registry:n,correlations:r,broadcastAggregator:i,handlers:a,auth:o,normalizeBroadcastTimeout:tt,sendSafely:l,debug:u}),f=e=>{d(e.data)},p=()=>{o?.cleanupSocket(e);let t=n.removeClient(e);e.removeEventListener(`message`,f),e.removeEventListener(`close`,p),e.removeEventListener(`error`,m),i.handleClientDisconnect(e),Ke(t,a,{debug:u,logContext:`dispatching disconnected client subscriptions`}),u&&console.info(`[ServerTransport] Client disconnected (${n.size} remaining)`)},m=e=>{u&&console.error(`[ServerTransport] Client socket error:`,e)};e.addEventListener(`message`,f),e.addEventListener(`close`,p),e.addEventListener(`error`,m);try{if(o&&(await o.authenticateServer(e,t=>{if(e.readyState!==1)throw Error(`Cannot send auth message: socket not ready (state: ${e.readyState})`);e.send(JSON.stringify(t))}),n.removeAuthenticating(e)),e.readyState!==1)return;if(n.addClient(e),c.size>0){let t=s(c);l(e,JSON.stringify(t))}l(e,JSON.stringify({type:`subscribe-sync-complete`})),u&&console.info(`[ServerTransport] Client connected (${n.size} total)`)}catch(t){if(u&&console.error(`[ServerTransport] Client connection setup failed:`,t),e.readyState>=2)return;let n=t instanceof g&&(t.code===`WS_AUTHENTICATION_REJECTED`||t.code===`WS_POLICY_REJECTED`);e.close(n?1008:1011,n?`Authentication failed`:`Connection setup failed`)}}async function rt(e,t,n){let{registry:r,correlations:i}=n,s=`${e.namespace}.${e.subject}`,c=r.getRequestOrigin(e.correlationId),l=r.getInterestedRequestClients(s,e.payload,c);if(l.length===0)throw new a(s);for(let[n,r]of l.entries()){let a=`${e.correlationId}:attempt-${n+1}`,c={...e,correlationId:a};try{r.send(JSON.stringify(c))}catch{continue}try{return await i.track(a,t)}catch(e){if(f(e,s)||e instanceof o)continue;throw e}}throw new a(s)}var it=class{name;wss;auth;debug;handlers=new Set;registry;serverSubscriptions=new Map;broadcastAggregator;correlations=new r;connectionListener=null;constructor(e){let{websocket:t,name:n=`websocket`,auth:r,debug:i=!1}=e;this.wss=t,this.name=n,this.auth=r,this.debug=i,this.registry=new je({debug:i,subscriptionSubjectRestrictionResolver:r?e=>{let t=(r.getReceiveContext?.(e))?.peer?.id;return t===void 0?null:D(t)}:void 0,requiredSubscriptionFilterResolver:r?e=>{let t=(r.getReceiveContext?.(e))?.peer?.id;return t===void 0?null:Be(t)}:void 0,socketAuthChecker:r?e=>r.isSocketAuthenticated?.(e)??!0:void 0}),this.broadcastAggregator=new Ae({debug:i})}sendToClientSafely(e,t){try{e.send(t)}catch(e){this.debug&&console.warn(`[ServerTransport] Failed to send message to client:`,e)}}async connect(){if(this.connectionListener!==null)throw Error(`ServerTransport.connect() called while already connected`);this.connectionListener=e=>{nt(e,{registry:this.registry,correlations:this.correlations,broadcastAggregator:this.broadcastAggregator,handlers:this.handlers,auth:this.auth,serverSubscriptions:this.serverSubscriptions,sendSafely:(e,t)=>this.sendToClientSafely(e,t),debug:this.debug})},this.wss.on(`connection`,this.connectionListener),this.debug&&console.info(`[ServerTransport] Listening for connections`)}async disconnect(){this.connectionListener&&=(this.wss.off(`connection`,this.connectionListener),null);let e=this.registry.getAllSockets();for(let t of e)t.close();await new Promise((e,t)=>{this.wss.close(n=>n?t(n):e())}),this.correlations.cleanup(),this.broadcastAggregator.cleanup(),this.auth?.cleanup(),this.handlers.clear(),this.serverSubscriptions.clear(),this.debug&&console.info(`[ServerTransport] Disconnected`)}async send(e,t){if(e.type===`response`){let t=this.registry.consumeResponseClient(e.correlationId);return t?(this.sendToClientSafely(t,JSON.stringify(e)),!0):!1}if(e.type===`broadcast`){let n=u(e)??void 0,r=`payload`in e?e.payload:void 0,i=this.registry.getInterestedClients(n,r);return this.broadcastAggregator.startServerBroadcast(e,i,(e,t)=>{this.sendToClientSafely(e,t)},t)}if(e.type===`request`)return rt(e,t??i,{registry:this.registry,correlations:this.correlations});if(this.registry.size===0){if(this.debug){let t=u(e);console.debug(`[ServerTransport] No clients to receive ${e.type}${t?`: ${t}`:``}`)}return!1}let n=u(e)??void 0,r=`payload`in e?e.payload:void 0,a=JSON.stringify(e),o=this.registry.getInterestedClients(n,r);for(let e of o)this.sendToClientSafely(e,a);let s=o.length>0;if(!s&&(n&&this.debug&&console.warn(`[ServerTransport] No interested clients for subject: ${n}`),!n))throw Error(`No connected clients available to receive message`);return s}onReceive(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}cancelRequest(e,t){this.correlations.cancel(e,t),this.registry.cancelRequestOrigin(e)}onBroadcastResults(e,t,n){this.broadcastAggregator.handleNodeResults(e,t,n)}async subscribe(e,t,n=[],r){let i=this.serverSubscriptions.get(e),a=i?.filter,o=t??a,c=r??i?.deliveryClass??`relayable`;if(this.serverSubscriptions.set(e,{filter:o,priorities:n,deliveryClass:c}),this.registry.size>0){let t=s(new Map([[e,{filter:o,priorities:n,deliveryClass:c}]])),r=JSON.stringify(t);for(let e of this.registry.getReadyClients())this.sendToClientSafely(e,r)}}getConnectionCount(){return this.registry.getReadyClients().length}async unsubscribe(e){if(this.serverSubscriptions.delete(e),this.registry.size>0){let t=c({[e]:[]}),n=JSON.stringify(t);for(let e of this.registry.getReadyClients())this.sendToClientSafely(e,n)}}};function at(e,t){let n=new Event(`close`);return Object.defineProperties(n,{code:{value:e??1e3,enumerable:!0},reason:{value:t??``,enumerable:!0}}),n}function ot(e){if(typeof e!=`object`||!e)throw TypeError(`WebSocket transport options must be an object`);let t=e;if(t.mode!==`client`&&t.mode!==`server`)throw TypeError(`WebSocket transport mode must be "client" or "server"`);if(t.mode===`client`){if(!st(t.websocket))throw TypeError(`WebSocket transport client mode requires a websocket with addEventListener/removeEventListener`);return}if(!ct(t.websocket))throw TypeError(`WebSocket transport server mode requires a websocket with on/off listener methods`)}function st(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.send==`function`&&typeof t.close==`function`&&typeof t.addEventListener==`function`&&typeof t.removeEventListener==`function`}function ct(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.on==`function`&&typeof t.off==`function`&&typeof t.close==`function`}var lt=class{secret;algorithm;challengeTimeout;identityId;resolveSecret;resolvePeer;pendingChallenge;pendingResult;queuedChallengeNonce;queuedResult;clientAuthComplete=!1;serverPendingResponses=new Map;serverAuthenticatedSockets=new Set;serverAuthenticatedPeers=new Map;serverAuthenticatedSecrets=new Map;constructor(e){this.secret=e.secret,this.algorithm=e.algorithm??`sha256`,this.challengeTimeout=e.challengeTimeout??5e3,this.identityId=e.identityId,this.resolveSecret=e.resolveSecret,this.resolvePeer=e.resolvePeer}async authenticateServer(e,t){let n=crypto.getRandomValues(new Uint8Array(32)),r=Array.from(n).map(e=>e.toString(16).padStart(2,`0`)).join(``),i=this.waitForAuthResponseWithIdentity(e),a=this.serverPendingResponses.get(e);i.catch(()=>void 0);try{t({type:`auth-challenge`,nonce:r});let{signature:n,identityId:o}=await i;this.assertServerOwner(e,a);let s;if(this.resolveSecret&&o!==void 0){let i=this.resolveSecret(o);if(i===null)throw this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:`Unknown identity`}),new g(`WS_AUTHENTICATION_REJECTED`,`HMAC authentication failed: Unknown identity '${o}'`);s=await this.computeHmacWithSecret(r,i),this.assertServerOwner(e,a),this.constantTimeEqual(n,s)&&(this.serverAuthenticatedPeers.set(e,o),this.serverAuthenticatedSecrets.set(e,i))}else s=await this.computeHmac(r),this.assertServerOwner(e,a);if(!this.constantTimeEqual(n,s))throw this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:`Invalid signature`}),new g(`WS_AUTHENTICATION_REJECTED`,`HMAC authentication failed: Invalid signature`);try{t({type:`auth-result`,success:!0}),this.assertServerOwner(e,a)}catch(t){throw this.serverPendingResponses.get(e)===a&&this.cleanupSocket(e),t}this.serverAuthenticatedSockets.add(e)}finally{clearTimeout(a.timeoutHandle),this.serverPendingResponses.get(e)===a&&this.serverPendingResponses.delete(e)}}async authenticateClient(e){this.clientAuthComplete=!1;let t=this.waitForAuthChallenge(),n=this.pendingChallenge;try{let r=await t;this.assertClientOwner(n);let i=await this.computeHmac(r);this.assertClientOwner(n),e({type:`auth-response`,signature:i,...this.identityId!==void 0&&{identityId:this.identityId}}),this.assertClientOwner(n);let a=await this.waitForAuthResult();if(this.assertClientOwner(n),!a.success)throw new g(`WS_AUTHENTICATION_REJECTED`,`HMAC authentication failed: ${a.error??`Unknown error`}`);this.clientAuthComplete=!0}finally{clearTimeout(n.timeoutHandle),this.pendingChallenge===n&&(this.pendingChallenge=void 0)}}assertClientOwner(e){if(this.pendingChallenge!==e)throw new g(`WS_CONNECTION_UNAVAILABLE`,`Socket disconnected during HMAC authentication`)}assertServerOwner(e,t){if(this.serverPendingResponses.get(e)!==t)throw new g(`WS_CONNECTION_UNAVAILABLE`,`Socket disconnected during HMAC authentication`)}handleAuthMessage(e,t){if(typeof e!=`object`||!e||!(`type`in e)||typeof e.type!=`string`)return!1;let n=e;if(n.type===`auth-challenge`)return typeof n.nonce!=`string`||this.clientAuthComplete||(this.pendingChallenge?(clearTimeout(this.pendingChallenge.timeoutHandle),this.pendingChallenge.resolve(n.nonce)):this.queuedChallengeNonce=n.nonce),!0;if(n.type===`auth-result`){if(typeof n.success!=`boolean`||this.clientAuthComplete)return!0;let e={success:n.success,error:typeof n.error==`string`?n.error:void 0};return this.pendingResult?(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.resolve(e),this.pendingResult=void 0):this.queuedResult=e,!0}if(n.type===`auth-response`){if(t){let e=this.serverPendingResponses.get(t);if(e){if(clearTimeout(e.timeoutHandle),n.identityId!==void 0&&typeof n.identityId!=`string`)return e.reject(new g(`WS_AUTHENTICATION_REJECTED`,`Malformed HMAC identity`)),!0;e.resolve({signature:n.signature,identityId:n.identityId})}}return!0}return!1}async waitForAuthChallenge(){return new Promise((e,t)=>{let n=setTimeout(()=>{t(new g(`WS_HANDSHAKE_TIMEOUT`,`Authentication challenge timeout`))},this.challengeTimeout);this.pendingChallenge={resolve:e,reject:t,timeoutHandle:n},this.queuedChallengeNonce!==void 0&&(clearTimeout(n),e(this.queuedChallengeNonce),this.queuedChallengeNonce=void 0)})}async waitForAuthResponseWithIdentity(e){return new Promise((t,n)=>{let r={resolve:t,reject:n,timeoutHandle:setTimeout(()=>{n(new g(`WS_HANDSHAKE_TIMEOUT`,`Authentication response timeout`))},this.challengeTimeout)};this.serverPendingResponses.set(e,r)})}async waitForAuthResult(){if(this.queuedResult!==void 0){let e=this.queuedResult;return this.queuedResult=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingResult=void 0,t(new g(`WS_HANDSHAKE_TIMEOUT`,`Authentication result timeout`))},this.challengeTimeout);this.pendingResult={resolve:e,reject:t,timeoutHandle:n}})}async computeHmac(e){return this.computeHmacWithSecret(e,this.secret)}async computeHmacWithSecret(e,t){let n=new TextEncoder,r=n.encode(t),i=this.algorithm.replace(/^sha/,`SHA-`),a=await crypto.subtle.importKey(`raw`,r,{name:`HMAC`,hash:i},!1,[`sign`]),o=await crypto.subtle.sign(`HMAC`,a,n.encode(e));return Array.from(new Uint8Array(o)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}getReceiveContext(e){if(!e)return;let t=this.serverAuthenticatedPeers.get(e);if(t===void 0)return;let n=this.resolvePeer?.(t);if(n!=null)return{transportName:``,peer:{...n,id:n.id??t,authenticated:!0}}}isSocketAuthenticated(e){if(!this.serverAuthenticatedSockets.has(e))return!1;if(!this.resolveSecret)return!0;let t=this.serverAuthenticatedPeers.get(e);if(t===void 0)return!0;let n=this.resolveSecret(t);if(n===null)return this.cleanupSocket(e),!1;let r=this.serverAuthenticatedSecrets.get(e);return r!==void 0&&n!==r?(this.cleanupSocket(e),!1):!0}constantTimeEqual(e,t){if(typeof e!=`string`||e.length!==t.length||!/^[0-9a-f]+$/i.test(e))return!1;let n=new Uint8Array(e.length/2),r=new Uint8Array(t.length/2);for(let i=0;i<n.length;i++)n[i]=parseInt(e.slice(i*2,i*2+2),16),r[i]=parseInt(t.slice(i*2,i*2+2),16);let i=0;for(let e=0;e<n.length;e++)i|=n[e]^r[e];return i===0}sendAuthResultBestEffort(e,t){try{e(t)}catch{}}cleanupSocket(e){let t=this.serverPendingResponses.get(e);t&&(clearTimeout(t.timeoutHandle),this.serverPendingResponses.delete(e),t.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Socket disconnected during HMAC authentication`))),this.serverAuthenticatedPeers.delete(e),this.serverAuthenticatedSecrets.delete(e),this.serverAuthenticatedSockets.delete(e)}cleanup(){this.pendingChallenge&&=(clearTimeout(this.pendingChallenge.timeoutHandle),this.pendingChallenge.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Socket disconnected during HMAC authentication`)),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Socket disconnected during HMAC authentication`)),void 0),this.queuedChallengeNonce=void 0,this.queuedResult=void 0,this.clientAuthComplete=!1;for(let e of this.serverPendingResponses.values())clearTimeout(e.timeoutHandle),e.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Socket disconnected during HMAC authentication`));this.serverPendingResponses.clear(),this.serverAuthenticatedPeers.clear(),this.serverAuthenticatedSecrets.clear(),this.serverAuthenticatedSockets.clear()}};function k(e){let t=Array.from(e,e=>String.fromCharCode(e)).join(``);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=/g,``)}function A(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=(4-t.length%4)%4;t+=`=`.repeat(n);let r=atob(t),i=new Uint8Array(r.length);for(let e=0;e<r.length;e++)i[e]=r.charCodeAt(e);return i}function j(e){return new TextEncoder().encode(e)}function M(e){return new TextDecoder().decode(e)}async function ut(e){let t=await crypto.subtle.exportKey(`spki`,e);return k(new Uint8Array(t))}async function N(e){let t=await crypto.subtle.exportKey(`raw`,e);return k(new Uint8Array(t))}async function P(e,t,n=[]){let r=A(e);return crypto.subtle.importKey(`spki`,r,t,!0,n)}async function F(e,t,n=[]){let r=A(e);return crypto.subtle.importKey(`raw`,r,t,!0,n)}async function I(e){let t=await crypto.subtle.exportKey(`pkcs8`,e),n=k(new Uint8Array(t)).replace(/-/g,`+`).replace(/_/g,`/`),r=(4-n.length%4)%4;return n+=`=`.repeat(r),`-----BEGIN PRIVATE KEY-----\n${n.match(/.{1,64}/g)?.join(`
2
+ `)??n}\n-----END PRIVATE KEY-----`}async function L(e,t,n){let r=A(e.replace(/-----BEGIN PRIVATE KEY-----/,``).replace(/-----END PRIVATE KEY-----/,``).replace(/\s/g,``).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=/g,``));return crypto.subtle.importKey(`pkcs8`,r,t,!0,n)}const R={name:`ECDH`,namedCurve:`P-256`};async function z(e=!0){return crypto.subtle.generateKey(R,e,[`deriveKey`,`deriveBits`])}async function B(e){return ut(e)}async function dt(e){return N(e)}async function ft(e){return F(e,R)}async function V(e,t=[]){return P(e,R,t)}async function pt(e){return I(e)}async function mt(e){return L(e,R,[`deriveKey`,`deriveBits`])}async function H(e,t){return crypto.subtle.deriveBits({name:`ECDH`,public:t},e,256)}async function U(e,t){let n=crypto.getRandomValues(new Uint8Array(12)),r=await crypto.subtle.encrypt({name:`AES-GCM`,iv:n},e,t);return{ciphertext:new Uint8Array(r),nonce:n}}async function W(e,t,n){let r=await crypto.subtle.decrypt({name:`AES-GCM`,iv:n},e,t);return new Uint8Array(r)}async function ht(e){return crypto.subtle.importKey(`raw`,e,{name:`AES-GCM`},!1,[`encrypt`,`decrypt`])}async function gt(e,t,n){let r=await crypto.subtle.importKey(`raw`,e,{name:`HKDF`},!1,[`deriveKey`]);return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:t,info:j(n)},r,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`])}const G={name:`ECDSA`,namedCurve:`P-256`};async function _t(e=!0){return crypto.subtle.generateKey(G,e,[`sign`,`verify`])}async function vt(e,t){let n=await crypto.subtle.sign({name:`ECDSA`,hash:{name:`SHA-256`}},e,t);return new Uint8Array(n)}async function yt(e,t,n){return crypto.subtle.verify({name:`ECDSA`,hash:{name:`SHA-256`}},e,t,n)}async function bt(e){return ut(e)}async function xt(e){return P(e,G,[`verify`])}async function St(e){return N(e)}async function Ct(e){return F(e,G,[`verify`])}async function wt(e){return I(e)}async function Tt(e){return L(e,G,[`sign`])}var Et=e({decodeText:()=>M,decrypt:()=>W,deriveSessionKey:()=>gt,deriveSharedSecret:()=>H,encodeText:()=>j,encrypt:()=>U,exportPrivateKeyPEM:()=>pt,exportPublicKey:()=>B,exportPublicKeyRaw:()=>dt,exportSigningPrivateKeyPEM:()=>wt,exportSigningPublicKey:()=>bt,exportSigningPublicKeyRaw:()=>St,fromBase64Url:()=>A,generateECDHKeyPair:()=>z,generateSigningKeyPair:()=>_t,importAESKey:()=>ht,importPrivateKeyPEM:()=>mt,importPublicKey:()=>V,importPublicKeyRaw:()=>ft,importSigningPrivateKeyPEM:()=>Tt,importSigningPublicKey:()=>xt,importSigningPublicKeyRaw:()=>Ct,sign:()=>vt,toBase64Url:()=>k,verify:()=>yt});function Dt(e){let t=e.match(/.{1,2}/g);return new Uint8Array(t?.map(e=>parseInt(e,16))??[])}function K(e){return Array.from(e).map(e=>e.toString(16).padStart(2,`0`)).join(``)}async function q(e,t){let n=await z(!0),r=await B(n.publicKey);return{ephemeralKeyPair:n,ephemeralPublicKey:r,signature:K(await vt(e,j(r+t)))}}function Ot(){return K(crypto.getRandomValues(new Uint8Array(16)))}async function J(e,t,n,r){let i=j(t+r);return yt(e,Dt(n),i)}async function Y(e,t,n,r){let i;try{i=await V(t)}catch(e){throw e instanceof DOMException&&e.name===`DataError`?new g(`WS_AUTHENTICATION_REJECTED`,`Invalid E2E peer public key`,{cause:e}):e}return gt(await H(e,i),Dt(n),r)}async function kt(e,t,n,r){if(e===t)throw Error(`deriveRelaySaltHex: identityId must differ from peerId`);let[i,a]=e<t?[e,t]:[t,e],[o,s]=e<t?[n,r]:[r,n],c=j(`${i}${a}${o}${s}`),l=new Uint8Array(c).buffer,u=await crypto.subtle.digest(`SHA-256`,l);return K(new Uint8Array(u))}function X(e,t){return typeof e==`string`&&/^[A-Za-z0-9_-]+$/.test(e)&&e.length%4!=1&&typeof t==`string`&&/^[0-9a-f]{128}$/i.test(t)}function At(e){return X(e.ephemeralPublicKey,e.signature)&&typeof e.salt==`string`&&/^[0-9a-f]{32}$/i.test(e.salt)}var jt=class{signingKeyPair;identityId;peerId;getPeerSigningKey;timeout;pendingKeyExchange;pendingResult;clientSession;clientEphemeralKeyPair;serverPendingKeyExchange=new Map;serverSessions=new Map;serverEphemeralKeyPairs=new Map;constructor(e){this.signingKeyPair=e.signingKeyPair,this.identityId=e.identityId,this.peerId=e.peerId,this.getPeerSigningKey=e.getPeerSigningKey,this.timeout=e.timeout??1e4}async authenticateClient(e){if(!this.peerId)throw Error(`E2E authentication failed: peerId is required for client authentication`);let t=this.waitForKeyExchangeResponse(),n=this.pendingKeyExchange,r=this.waitForAuthResult();t.catch(()=>void 0),r.catch(()=>void 0);try{let{ephemeralKeyPair:i,ephemeralPublicKey:a,signature:o}=await q(this.signingKeyPair.privateKey,this.identityId);this.assertClientOwner(n),this.clientEphemeralKeyPair=i,e({type:`e2e-key-exchange`,deviceId:this.identityId,ephemeralPublicKey:a,signature:o}),this.assertClientOwner(n);let s=await t;this.assertClientOwner(n);let c=await this.getPeerSigningKey(this.peerId);if(this.assertClientOwner(n),!c)throw new g(`WS_AUTHENTICATION_REJECTED`,`E2E authentication failed: Unknown server`);let l=await J(c,s.ephemeralPublicKey,s.signature,this.peerId);if(this.assertClientOwner(n),!l)throw new g(`WS_AUTHENTICATION_REJECTED`,`E2E authentication failed: Invalid server signature`);let u=await Y(i.privateKey,s.ephemeralPublicKey,s.salt,`makaio-e2e-session-v1`);this.assertClientOwner(n);let d=await r;if(this.assertClientOwner(n),!d.success)throw new g(`WS_AUTHENTICATION_REJECTED`,`E2E authentication failed: ${d.error??`Unknown error`}`);this.clientSession={sessionKey:u,peerId:this.peerId}}catch(e){throw this.pendingKeyExchange===n&&(this.clientSession=void 0,this.clientEphemeralKeyPair=void 0),e}finally{clearTimeout(n.timeoutHandle),this.pendingKeyExchange===n&&(this.pendingKeyExchange=void 0,this.pendingResult&&clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult=void 0)}}async authenticateServer(e,t){let n=this.waitForClientKeyExchange(e),r=this.serverPendingKeyExchange.get(e);try{let i=await n;this.assertServerOwner(e,r);let a=await this.getPeerSigningKey(i.deviceId);if(this.assertServerOwner(e,r),!a)throw new g(`WS_AUTHENTICATION_REJECTED`,`E2E authentication failed: Unknown device ${i.deviceId}`);let o=await J(a,i.ephemeralPublicKey,i.signature,i.deviceId);if(this.assertServerOwner(e,r),!o)throw new g(`WS_AUTHENTICATION_REJECTED`,`E2E authentication failed: Invalid client signature`);let{ephemeralKeyPair:s,ephemeralPublicKey:c,signature:l}=await q(this.signingKeyPair.privateKey,this.identityId);this.assertServerOwner(e,r);let u=Ot();this.serverEphemeralKeyPairs.set(e,s),t({type:`e2e-key-exchange-response`,ephemeralPublicKey:c,signature:l,salt:u}),this.assertServerOwner(e,r);let d=await Y(s.privateKey,i.ephemeralPublicKey,u,`makaio-e2e-session-v1`);this.assertServerOwner(e,r),this.serverSessions.set(e,{sessionKey:d,peerId:i.deviceId}),t({type:`e2e-auth-result`,success:!0}),this.assertServerOwner(e,r)}catch(n){if(this.serverPendingKeyExchange.get(e)===r){this.serverEphemeralKeyPairs.delete(e),this.serverSessions.delete(e);try{n instanceof g&&n.code===`WS_AUTHENTICATION_REJECTED`&&t({type:`e2e-auth-result`,success:!1,error:n.message})}catch{}}throw n}finally{clearTimeout(r.timeoutHandle),this.serverPendingKeyExchange.get(e)===r&&this.serverPendingKeyExchange.delete(e)}}assertClientOwner(e){if(this.pendingKeyExchange!==e)throw new g(`WS_CONNECTION_UNAVAILABLE`,`Connection closed during E2E authentication`)}assertServerOwner(e,t){if(this.serverPendingKeyExchange.get(e)!==t)throw new g(`WS_CONNECTION_UNAVAILABLE`,`Connection closed during E2E authentication`)}handleAuthMessage(e,t){if(typeof e!=`object`||!e||!(`type`in e)||typeof e.type!=`string`)return!1;let n=e;if(n.type===`e2e-key-exchange-response`){if(this.pendingKeyExchange){if(clearTimeout(this.pendingKeyExchange.timeoutHandle),!At(n))return this.pendingKeyExchange.reject(new g(`WS_AUTHENTICATION_REJECTED`,`Malformed E2E key exchange response`)),!0;this.pendingKeyExchange.resolve({ephemeralPublicKey:n.ephemeralPublicKey,signature:n.signature,salt:n.salt})}return!0}if(n.type===`e2e-auth-result`){if(typeof n.success!=`boolean`)return!0;let e=typeof n.error==`string`?n.error:void 0;return!n.success&&this.pendingKeyExchange&&(clearTimeout(this.pendingKeyExchange.timeoutHandle),this.pendingKeyExchange.reject(new g(`WS_AUTHENTICATION_REJECTED`,`E2E authentication failed: ${e??`Unknown error`}`))),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.resolve({success:n.success,error:e}),void 0),!0}if(n.type===`e2e-key-exchange`&&t){let e=this.serverPendingKeyExchange.get(t);if(e){if(clearTimeout(e.timeoutHandle),typeof n.deviceId!=`string`||!X(n.ephemeralPublicKey,n.signature))return e.reject(new g(`WS_AUTHENTICATION_REJECTED`,`Malformed E2E key exchange`)),!0;e.resolve({deviceId:n.deviceId,ephemeralPublicKey:n.ephemeralPublicKey,signature:n.signature})}return!0}return!1}async waitForKeyExchangeResponse(){return new Promise((e,t)=>{let n=setTimeout(()=>{t(new g(`WS_HANDSHAKE_TIMEOUT`,`E2E key exchange timeout`))},this.timeout);this.pendingKeyExchange={resolve:e,reject:t,timeoutHandle:n}})}async waitForAuthResult(){return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingResult=void 0,t(new g(`WS_HANDSHAKE_TIMEOUT`,`E2E authentication result timeout`))},this.timeout);this.pendingResult={resolve:e,reject:t,timeoutHandle:n}})}async waitForClientKeyExchange(e){return new Promise((t,n)=>{let r={resolve:t,reject:n,timeoutHandle:setTimeout(()=>{n(new g(`WS_HANDSHAKE_TIMEOUT`,`E2E key exchange timeout`))},this.timeout)};this.serverPendingKeyExchange.set(e,r)})}getSessionKey(e){return e?this.serverSessions.get(e)?.sessionKey??null:this.clientSession?.sessionKey??null}getPeerId(e){return e?this.serverSessions.get(e)?.peerId??null:this.clientSession?.peerId??null}getReceiveContext(e){let t=this.getPeerId(e);if(t!==null)return{transportName:``,peer:{kind:`e2e`,id:t,authenticated:!0,encrypted:!0}}}cleanupSocket(e){let t=this.serverPendingKeyExchange.get(e);t&&(clearTimeout(t.timeoutHandle),t.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Connection closed during E2E authentication`)),this.serverPendingKeyExchange.delete(e)),this.serverSessions.delete(e),this.serverEphemeralKeyPairs.delete(e)}cleanup(){this.pendingKeyExchange&&=(clearTimeout(this.pendingKeyExchange.timeoutHandle),this.pendingKeyExchange.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Connection closed during E2E authentication`)),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Connection closed during E2E authentication`)),void 0),this.clientSession=void 0,this.clientEphemeralKeyPair=void 0;for(let e of this.serverPendingKeyExchange.values())clearTimeout(e.timeoutHandle),e.reject(new g(`WS_CONNECTION_UNAVAILABLE`,`Connection closed during E2E authentication`));this.serverPendingKeyExchange.clear(),this.serverSessions.clear(),this.serverEphemeralKeyPairs.clear()}};const Z=`E2E relay auth session aborted by reconnect`;var Mt=class{signingKeyPair;identityId;getPeerSigningKey;timeout;mode;blocking;pendingPeer;sessionKey;peerId;localEphemeral;localExchangeMessage;sentLocalExchange=!1;earlyPeer;sendAuthMessage;authGeneration=0;processingExchange=!1;constructor(e){this.signingKeyPair=e.signingKeyPair,this.identityId=e.identityId,this.getPeerSigningKey=e.getPeerSigningKey,this.timeout=e.timeout??1e4,this.mode=e.mode??`initiator`,this.blocking=e.blocking??!0}async authenticateClient(e){let t=this.sendAuthMessage===void 0?this.earlyPeer:void 0;this.cleanup();let n=this.authGeneration;if(this.earlyPeer=t,this.sendAuthMessage=e,this.mode===`initiator`){if(await this.ensureLocalExchangeMessage(),n!==this.authGeneration)throw Error(Z);this.sendLocalExchange()}if(!this.blocking){if(this.earlyPeer){let e=this.earlyPeer;this.earlyPeer=void 0,this.dispatchPeerExchange(e,n)}return}let r=await this.waitForPeerExchange();if(await this.processPeerExchange(r,n),n!==this.authGeneration||!this.sessionKey)throw Error(Z)}async authenticateServer(e,t){throw Error(`E2ERelayAuth does not support server authentication`)}handleAuthMessage(e){let t=e;return!t||t.type!==`e2e-relay-key-exchange`?!1:t.identityId===this.identityId?!0:this.pendingPeer?(this.pendingPeer.resolve(t),this.pendingPeer=void 0,!0):(this.earlyPeer=t,!this.blocking&&this.sendAuthMessage&&!this.sessionKey&&!this.processingExchange&&this.dispatchPeerExchange(t,this.authGeneration),!0)}cleanupSocket(e){}cleanup(){this.authGeneration++,this.pendingPeer&&=(this.pendingPeer.reject(Error(Z)),void 0),this.earlyPeer&&=void 0,this.sessionKey=void 0,this.peerId=void 0,this.localEphemeral=void 0,this.localExchangeMessage=void 0,this.sentLocalExchange=!1,this.processingExchange=!1,this.sendAuthMessage=void 0}dispatchPeerExchange(e,t){this.processingExchange=!0,this.processPeerExchange(e,t).catch(e=>{e instanceof Error&&e.message===Z||console.error(`[E2ERelayAuth] Peer exchange failed:`,e)}).finally(()=>{t===this.authGeneration&&(this.processingExchange=!1,this.retryQueuedPeerExchange(t))})}getSessionKey(){return this.sessionKey??null}getPeerId(){return this.peerId??null}getReceiveContext(){let e=this.getPeerId();if(e!==null)return{transportName:``,peer:{kind:`e2e`,id:e,authenticated:!0,encrypted:!0}}}async waitForPeerExchange(){if(this.earlyPeer){let e=this.earlyPeer;return this.earlyPeer=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingPeer=void 0,t(Error(`E2E relay key exchange timeout`))},this.timeout),r=()=>{clearTimeout(n),this.pendingPeer=void 0};this.pendingPeer={resolve:t=>{r(),e(t)},reject:e=>{r(),t(e)},timeoutHandle:n}})}async ensureLocalExchangeMessage(){if(this.localExchangeMessage&&this.localEphemeral)return this.localExchangeMessage;let{ephemeralKeyPair:e,ephemeralPublicKey:t,signature:n}=await q(this.signingKeyPair.privateKey,this.identityId);return this.localEphemeral=e,this.localExchangeMessage={type:`e2e-relay-key-exchange`,identityId:this.identityId,ephemeralPublicKey:t,signature:n},this.localExchangeMessage}sendLocalExchange(e=!1){!this.sendAuthMessage||!this.localExchangeMessage||!e&&this.sentLocalExchange||(this.sendAuthMessage(this.localExchangeMessage),this.sentLocalExchange=!0)}retryQueuedPeerExchange(e){if(this.blocking||!this.sendAuthMessage||this.sessionKey||this.processingExchange||e!==this.authGeneration)return;let t=this.earlyPeer;t&&(this.earlyPeer=void 0,this.dispatchPeerExchange(t,e))}async processPeerExchange(e,t){if(!this.sendAuthMessage){this.earlyPeer=e;return}let n=await this.ensureLocalExchangeMessage();if(t!==this.authGeneration)return;let r=await this.getPeerSigningKey(e.identityId);if(!r)throw Error(`E2E relay authentication failed: Unknown peer ${e.identityId}`);if(!await J(r,e.ephemeralPublicKey,e.signature,e.identityId))throw Error(`E2E relay authentication failed: Invalid peer signature`);let i=await kt(this.identityId,e.identityId,n.ephemeralPublicKey,e.ephemeralPublicKey);if(!this.localEphemeral)throw Error(`E2E relay authentication failed: Local ephemeral key missing`);let a=await Y(this.localEphemeral.privateKey,e.ephemeralPublicKey,i,`makaio-e2e-relay-v1`);t===this.authGeneration&&(this.sessionKey=a,this.peerId=e.identityId,this.mode===`initiator`?this.sendLocalExchange(!0):this.sendLocalExchange())}},Nt=class{hmac;e2e;socketStrategy=new Map;pendingServerAuth=new Map;hmacCancelled=new Map;constructor(e){this.hmac=e.hmac,this.e2e=e.e2e}setE2EAuth(e){this.e2e=e}async authenticateClient(e){let t=this.hmac??this.e2e;if(!t)throw Error(`DispatchingAuth: no auth strategy configured`);return t.authenticateClient(e)}async authenticateServer(e,t){let n=this.resolveSingleStrategy();if(n)return n.authenticateServer(e,t);if(!this.hmac||!this.e2e)throw Error(`DispatchingAuth: no auth strategy configured`);let r={cancelled:!1};this.hmacCancelled.set(e,r);let i=this.hmac.authenticateServer(e,e=>{r.cancelled||t(e)});return new Promise((n,a)=>{this.pendingServerAuth.set(e,{resolve:n,reject:a,send:t}),i.then(n).catch(e=>{r.cancelled||a(e instanceof Error?e:Error(String(e)))})})}handleAuthMessage(e,t){if(!t)return(this.hmac??this.e2e)?.handleAuthMessage(e)??!1;let n=this.socketStrategy.get(t);if(n)return n.handleAuthMessage(e,t);let r=this.resolveStrategy(e),i=this.pendingServerAuth.get(t);return r?(this.socketStrategy.set(t,r),this.pendingServerAuth.delete(t),r===this.hmac?this.hmacCancelled.delete(t):(this.cancelHmac(t),i&&r.authenticateServer(t,i.send).then(i.resolve).catch(e=>{i.reject(e instanceof Error?e:Error(String(e)))})),r.handleAuthMessage(e,t)):(this.cancelHmac(t),i&&(this.pendingServerAuth.delete(t),i.reject(new g(`WS_POLICY_REJECTED`,`DispatchingAuth: unrecognised auth message type "${this.peekType(e)}" — no matching strategy`))),!1)}cleanupSocket(e){let t=this.socketStrategy.get(e);t&&(t.cleanupSocket(e),this.socketStrategy.delete(e)),this.cancelHmac(e);let n=this.pendingServerAuth.get(e);n&&(this.pendingServerAuth.delete(e),n.reject(Error(`DispatchingAuth: socket disconnected before auth type was determined`)))}cleanup(){this.hmac?.cleanup(),this.e2e?.cleanup(),this.socketStrategy.clear();for(let e of this.pendingServerAuth.values())e.reject(Error(`DispatchingAuth: cleanup called before authentication completed`));this.pendingServerAuth.clear(),this.hmacCancelled.clear()}peekType(e){if(typeof e!=`object`||!e||!(`type`in e))return;let{type:t}=e;return typeof t==`string`?t:void 0}resolveSingleStrategy(){if(this.hmac&&!this.e2e)return this.hmac;if(this.e2e&&!this.hmac)return this.e2e}resolveStrategy(e){let t=this.peekType(e);if(t){if(t===`e2e-key-exchange`&&this.e2e)return this.e2e;if(t===`auth-response`&&this.hmac)return this.hmac}}cancelHmac(e){let t=this.hmacCancelled.get(e);t&&(t.cancelled=!0,this.hmacCancelled.delete(e),this.hmac?.cleanupSocket(e))}};function Pt(e){return`payload`in e}async function Ft(e,t,n){if(e.type!==`response`||e.result===void 0||e.error!==void 0)return;let{ciphertext:r,nonce:i}=await U(n,j(JSON.stringify(e.result)));t.result=k(r),t.e2e={nonce:k(i),v:1}}async function It(e,t,n){if(e.type!==`broadcast-response`||e.results===void 0||e.error!==void 0)return;let{ciphertext:r,nonce:i}=await U(n,j(JSON.stringify(e.results)));t.results=k(r),t.e2e={nonce:k(i),v:1}}async function Lt(e,t,n){if(!Pt(e)||e.payload===void 0)return;let{ciphertext:r,nonce:i}=await U(n,j(JSON.stringify(e.payload)));t.payload=k(r),t.e2e={nonce:k(i),v:1}}async function Rt(e,t,n){if(e.type!==`response`&&e.type!==`broadcast-response`||e.error===void 0)return;let{ciphertext:r,nonce:i}=await U(n,j(JSON.stringify(e.error)));t.error=k(r),t.e2e={nonce:k(i),v:1}}async function zt(e,t,n,r){if(!Pt(e)||typeof e.payload!=`string`)return;let i=M(await W(n,A(e.payload),r));t.payload=JSON.parse(i)}async function Bt(e,t,n,r){if(e.type!==`response`||typeof e.result!=`string`)return;let i=M(await W(n,A(e.result),r));t.result=JSON.parse(i)}async function Vt(e,t,n,r){if(e.type!==`broadcast-response`||typeof e.results!=`string`)return;let i=M(await W(n,A(e.results),r));t.results=JSON.parse(i)}async function Ht(e,t,n,r){if(e.type!==`response`&&e.type!==`broadcast-response`||typeof e.error!=`string`)return;let i=M(await W(n,A(e.error),r));t.error=JSON.parse(i)}async function Ut(e,t){let n={...e};return await Lt(e,n,t),await Ft(e,n,t),await It(e,n,t),await Rt(e,n,t),n}async function Wt(e,t){if(!e.e2e)return e;let n={...e};delete n.e2e;let r=A(e.e2e.nonce);return await zt(e,n,t,r),await Bt(e,n,t,r),await Vt(e,n,t,r),await Ht(e,n,t,r),n}function Gt(e){return e.type===`subscription-ack`&&typeof e.ackId==`string`}function Kt(e){let{e2eAuth:t,websocket:n,...r}=e,i=new C({...r,url:`<pre-connected>`,createWebSocket:()=>n,auth:t,autoReconnect:!1,heartbeat:r.heartbeat??!1,messageTransform:async e=>{let n=t.getSessionKey();if(!n||Gt(e))return e;let r=e;if(!r.e2e)throw Error(`Received plaintext message on E2E-encrypted channel — possible injection`);return Wt(r,n)}});async function a(e,n){let r=t.getSessionKey();if(!r)throw Error(`E2E session key not available - authentication may have failed`);let a=await Ut(e,r);return i.send(a,n)}return{name:i.name,connect:i.connect.bind(i),disconnect:i.disconnect.bind(i),send:a,cancelRequest:i.cancelRequest.bind(i),onReceive:i.onReceive.bind(i),subscribe:i.subscribe.bind(i),unsubscribe:i.unsubscribe.bind(i),getSubscriptions:i.getSubscriptions.bind(i)}}function qt(e){return Kt(e)}function Jt(e){if(!e||typeof e!=`object`)return!1;let t=e;if(t.type!==`e2e-relay-envelope`||typeof t.payload!=`string`)return!1;let n=t.e2e;return!!n&&typeof n.nonce==`string`&&typeof n.v==`number`}async function Yt(e,t){let{ciphertext:n,nonce:r}=await U(t,j(JSON.stringify(e)));return{type:`e2e-relay-envelope`,payload:k(n),e2e:{nonce:k(r),v:1}}}async function Xt(e,t){let n=A(e.e2e.nonce),r=M(await W(t,A(e.payload),n));return JSON.parse(r)}function Zt(e){let t=()=>{if(!e.isFrozen())throw Error(`RelayControlRegistry must be frozen before processing relay control messages`)};function n(t){return typeof t.namespace!=`string`||typeof t.subject!=`string`||!e.isControlEvent(t.namespace,t.subject)||typeof t.messageId!=`string`?!1:t.payload!==void 0}function r(t){return typeof t.namespace!=`string`||typeof t.subject!=`string`||!e.isControlRequest(t.namespace,t.subject)||typeof t.messageId!=`string`||typeof t.correlationId!=`string`?!1:t.payload!==void 0}function i(e){if(t(),!e||typeof e!=`object`)return!1;let i=e;return i.type===`event`?n(i):i.type===`request`?r(i):!1}function a(e){if(t(),!e||typeof e!=`object`)return!1;let n=e;return n.type!==`relay-control`||n.v!==1||!n.payload||typeof n.payload!=`object`?!1:i(n.payload)}function o(e){if(t(),!i(e))throw Error(`Invalid relay control message`);return{type:`relay-control`,v:1,payload:e}}return{createRelayControlEnvelope:o,isRelayControlEnvelopeMessage:a,isRelayControlBusMessage:i}}function Q(e){let t=Date.now()-3e5;for(let[n,r]of e)r>=t||e.delete(n);for(;e.size>2048;){let t=e.keys().next().value;if(!t)break;e.delete(t)}}const Qt=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`response`&&typeof t.correlationId==`string`},$t=e=>e.type===`subscribe`||e.type===`unsubscribe`,$=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`subscription-ack`&&typeof t.ackId==`string`};function en(e,t,n,r){if(t(e)||e.type===`response`&&n.has(e.correlationId))return!0;let i=r.getSessionKey();return!i&&($t(e)||$(e))?!0:!!i}function tn(e,t,n,r){if(!r.isFrozen())throw Error(`E2ERelay transport requires a frozen relay control registry`);let{createRelayControlEnvelope:i,isRelayControlEnvelopeMessage:a,isRelayControlBusMessage:o}=Zt(r),s=e=>{n.delete(e),n.set(e,Date.now()),Q(n)};return{canEncode:t=>en(t,o,n,e),encode:async t=>{if(o(t))return t.type===`request`&&s(t.correlationId),JSON.stringify(i(t));if(Q(n),t.type===`response`&&n.has(t.correlationId))return n.delete(t.correlationId),JSON.stringify(t);let r=e.getSessionKey();if(!r&&$t(t)||!r&&$(t))return JSON.stringify(t);if(!r)throw Error(`E2E relay session not established`);let a=await Yt(t,r);return JSON.stringify(a)},decode:async r=>{let i=e.getSessionKey();if(a(r)){let e=r.payload;return t&&console.info(`[E2ERelayTransport] Decoded relay control envelope:`,e.type,e.namespace,e.subject),e.type===`request`&&s(e.correlationId),e}if(Q(n),Qt(r)&&n.has(r.correlationId))return n.delete(r.correlationId),r;if(!i&&$(r))return r;if(!i)throw Error(`E2E relay session not established`);if(!Jt(r))throw Error(`Received plaintext message on relay E2E channel — possible injection`);return Xt(r,i)}}}function nn(e,t,n=!1){let r=new Map;return{codec:tn(e,n,r,t),reset:()=>r.clear()}}function rn(e){let{e2eAuth:t,registry:n,websocket:r,...i}=e,a=e.debug??!1,o=new Map,s=tn(t,a,o,n);a&&console.info(`[E2ERelayTransport] Creating inner transport...`);let c=new C({...i,url:`<pre-connected>`,createWebSocket:()=>r,auth:t,codec:s,autoReconnect:!1,heartbeat:i.heartbeat??!1});return a&&console.info(`[E2ERelayTransport] Inner transport created`),{name:c.name,connect:async()=>{if(!n.isFrozen())throw Error(`E2ERelayClientTransport: registry must be frozen before connect()`);o.clear();try{await c.connect()}catch(e){throw o.clear(),e}},disconnect:async()=>{o.clear();try{await c.disconnect()}finally{o.clear()}},send:c.send.bind(c),cancelRequest:c.cancelRequest.bind(c),onReceive:(...e)=>(a&&console.info(`[E2ERelayTransport] onReceive called, delegating to inner transport`),c.onReceive(...e)),subscribe:c.subscribe.bind(c),unsubscribe:c.unsubscribe.bind(c),getSubscriptions:c.getSubscriptions.bind(c),isReady:c.isReady.bind(c),canSend:c.canSend.bind(c)}}function an(){let e=!1,t=new Map,n=new Map,r=()=>{if(e)throw Error(`RelayControlRegistry is frozen and cannot be modified`)};return{registerEventSubjects(e,n){r();let i=t.get(e)??new Set;for(let e of n)i.add(e);t.set(e,i)},registerRequestNamespace(e,t){if(r(),t.length===0)throw Error(`RelayControlRegistry request namespace "${e}" requires at least one subject`);let i=n.get(e)??new Set;for(let e of t)i.add(e);n.set(e,i)},freeze(){e=!0},isFrozen(){return e},isControlEvent(e,n){return t.get(e)?.has(n)??!1},isControlRequest(e,t){return n.get(e)?.has(t)??!1}}}function on(e){if(ot(e),e.mode===`client`){if(e.connectionOptions!==void 0)throw Error(`createWebSocketTransport(client) does not support connectionOptions when wrapping a pre-created WebSocket. Use WebSocketClientTransport for reconnect or dial-time socket options.`);let t=e.websocket;return new C({url:`<pre-connected>`,createWebSocket:()=>t,auth:e.auth,debug:e.debug,autoReconnect:!1,heartbeat:!1})}else return new it({websocket:e.websocket,auth:e.auth,debug:e.debug})}export{Nt as DispatchingAuth,jt as E2EAuth,Mt as E2ERelayAuth,lt as HmacAuth,it as ServerTransport,C as WebSocketClientTransport,g as WebSocketConnectionError,Ie as captureHmacIdentitySecretCleanup,Ve as clearHmacIdentitySecretsForTesting,qt as createE2EClientTransport,rn as createE2ERelayClientTransport,nn as createE2ERelayCodec,Zt as createRelayControlHelpers,an as createRelayControlRegistry,at as createWebSocketCloseEvent,on as createWebSocketTransport,Et as crypto,v as extractSocketErrorMessage,Pe as registerHmacIdentitySecret,ze as resolveHmacIdentityAllowedMessageSubjects,D as resolveHmacIdentityAllowedSubscriptionSubjects,Re as resolveHmacIdentityPeer,Le as resolveHmacIdentitySecret,Fe as rotateHmacIdentitySecret};
@@ -1 +1 @@
1
- import{n as e}from"./namespace-CMntzAPI.mjs";import"./ownership-memory-handler-xex7sLiX.mjs";import{t}from"./caller-owned-adapter-stub-D8RZEdRn.mjs";import{AdapterSubjects as n,AgentSubjects as r,SessionSubjects as i}from"@makaio/framework/contracts";import{MakaioBus as a}from"@makaio/framework/bus";function o(){a.__resetHandlers?.()}function s(e=10){return new Promise(t=>setTimeout(t,e))}function c(e,t){let n=Date.now();return{agentId:e,adapterId:`adapter-${e}`,adapterName:`test-adapter`,sessionId:t?.sessionId??`test-session`,role:`member`,status:`idle`,createdAt:n,lastActivityAt:n,...t}}async function l(e,t=e,r=`test-machine`){await a.emit(n.initialized,{adapterName:e,adapterId:t,machineId:r,ownerInstanceId:`owner-${t}`,capabilities:[]})}async function u(t){return(await a.request(e.getEvents,{sessionId:t})).events}function d(e,t,n){let r=[];return n.push(a.on(e,(e=>{let n=e.payload;r.push(t(n))}))),{received:r,clear:()=>{r.length=0}}}function f(e){return d(i.turn.started,e=>({sessionId:e.sessionId,turnId:e.turnId,turnNumber:e.turnNumber,messageId:e.messageId,agentIds:[...e.agentIds],initiator:e.initiator,ingestionMarker:e.ingestionMarker}),e)}function p(e){return d(i.turn.completed,e=>({sessionId:e.sessionId,turnId:e.turnId,turnNumber:e.turnNumber,success:e.success,error:e.error,initiator:e.initiator,ingestionMarker:e.ingestionMarker}),e)}function m(e){return d(i.user_message.sent,e=>({sessionId:e.sessionId,turnId:e.turnId,messageId:e.messageId,content:e.content,agentIds:[...e.agentIds],origin:e.origin}),e)}function h(e){return d(i.user_message.acknowledged,e=>({sessionId:e.sessionId,turnId:e.turnId,messageId:e.messageId,agentId:e.agentId}),e)}function g(e){return d(i.user_message.completed,e=>({sessionId:e.sessionId,turnId:e.turnId,messageId:e.messageId,agentId:e.agentId,outcome:e.outcome,error:e.error}),e)}function _(e,t){return c(e,{runtimeOwner:{machineId:`test-machine`,instanceId:`test-runtime-owner`},...t})}function v(e){let t=Date.now();return{sessionId:e.sessionId,createdAt:t,lastActivityAt:t,status:e.status??`active`,agents:e.agents??[],leadAgentId:e.leadAgentId,targetWorkingDirectory:e.targetWorkingDirectory}}function y(e){return a.on(i.create,t=>{let n=t.payload.sessionId??`session-${crypto.randomUUID().slice(0,8)}`;e.set(n,v({sessionId:n,agents:[]})),t.setResult({sessionId:n})})}function b(e){return a.on(i.agent.added,t=>{let n=e.get(t.payload.sessionId);if(!n)return;let r=n.agents.length===0,i=t.payload.role??(r?`lead`:`member`);r&&(n.adapterSessionId=t.payload.adapterSessionId,n.adapterName=t.payload.adapterName,n.adapterId=t.payload.adapterId);let a=Date.now();n.agents.push({agentId:t.payload.agentId,adapterId:t.payload.adapterId,adapterName:t.payload.adapterName,sessionId:t.payload.sessionId,role:i,status:`idle`,createdAt:a,lastActivityAt:a}),i===`lead`&&(n.leadAgentId=t.payload.agentId),n.lastActivityAt=Date.now()})}function x(e){return a.on(i.get,t=>{t.setResult({session:e.get(t.payload.sessionId)??null})})}function S(e){return a.on(n.getAgent,t=>{for(let n of e.values()){let e=n.agents.find(e=>e.agentId===t.payload.agentId);if(e){t.setResult({agent:{agentId:e.agentId,sessionId:n.sessionId,adapterSessionId:``}});return}}t.setResult({agent:null})})}function C(){return a.on(n.rehydrateAgent,e=>{e.setResult({success:!0,...t(e.payload)})})}function w(e=`/previous/cwd`){return a.on(r.cwd.change,t=>{t.setResult({success:!0,previousCwd:e})})}function T(){return a.on(r.model.change,e=>{e.setResult({success:!0,swapped:!1})})}function E(e){return a.on(n.startAgent,n=>{let{adapterId:r,initialMessage:i}=n.payload,a=n.payload.sessionId??`session-${crypto.randomUUID().slice(0,8)}`,o=n.payload.agentId??`agent-${crypto.randomUUID().slice(0,8)}`,s=i?`msg-${crypto.randomUUID().slice(0,8)}`:void 0,c=`adapter-session-${a}`;e?.({adapterId:r,sessionId:a,initialMessage:i}),n.setResult({success:!0,agentId:o,adapterId:r,adapterSessionId:c,sessionId:a,...t(n.payload),...s&&{messageId:s}}),M({sessionId:a,agentId:o,adapterId:r,adapterSessionId:c})})}function D(e){return a.on(n.startAgent,t=>{t.setResult({success:!1,dispatch:`not-dispatched`,message:e})})}function O(e){return a.on(r.sendMessage,t=>{let{agentId:n,adapterId:r,message:i,messageId:a,sessionContext:o,responseSchema:s}=t.payload,c=a??`msg-${crypto.randomUUID().slice(0,8)}`;e?.({agentId:n,adapterId:r,message:i,messageId:c,sessionContext:o,responseSchema:s}),t.setResult({messageId:c})})}function k(e,t){return a.on(r.sendMessage,n=>{if(e.has(n.payload.agentId))throw Error(t);n.setResult({messageId:n.payload.messageId??`generated-id`})})}async function A(e){await a.emit(r.complete,{agentId:e.agentId,adapterId:`adapter-${e.agentId}`,adapterName:`test-adapter`,adapterSessionId:`adapter-session-${e.agentId}`,messageId:e.messageId,turnId:e.turnId})}async function j(e){await a.emit(r.complete,{agentId:e.agentId,adapterId:`adapter-${e.agentId}`,adapterName:`test-adapter`,adapterSessionId:`adapter-session-${e.agentId}`,messageId:e.messageId,turnId:e.turnId,outcome:`error`,error:e.error})}function M(e){setImmediate(()=>{a.emit(i.agent.added,{sessionId:e.sessionId,agentId:e.agentId,adapterId:e.adapterId,adapterName:e.adapterId,adapterSessionId:e.adapterSessionId,role:e.role})})}function N(e,r){let i=new Map,o=a.on(n.startAgent,n=>{r.payload=n.payload;let a=n.payload.agentId??`agent-${crypto.randomUUID().slice(0,8)}`,o=n.payload.initialMessage?`msg-${crypto.randomUUID().slice(0,8)}`:void 0,s=`adapter-session-${e}`;i.set(a,{agentId:a,sessionId:e,adapterSessionId:s,adapterId:n.payload.adapterId}),n.setResult({success:!0,agentId:a,adapterId:n.payload.adapterId,adapterSessionId:s,sessionId:e,...t(n.payload),...o&&{messageId:o}}),M({sessionId:e,agentId:a,adapterId:n.payload.adapterId,adapterSessionId:s})}),s=a.on(n.getAgent,e=>{let t=i.get(e.payload.agentId);e.setResult({agent:t?{agentId:t.agentId,sessionId:t.sessionId,adapterSessionId:t.adapterSessionId}:null})});return()=>{o(),s()}}export{l as C,s as E,m as S,o as T,E as _,j as a,h as b,y as c,D as d,S as f,O as g,C as h,A as i,w as l,T as m,v as n,b as o,x as p,M as r,N as s,_ as t,k as u,p as v,u as w,g as x,f as y};
1
+ import{n as e}from"./namespace-CMntzAPI.mjs";import"./ownership-memory-handler-C-y9zQf8.mjs";import{t}from"./caller-owned-adapter-stub-D8RZEdRn.mjs";import{AdapterSubjects as n,AgentSubjects as r,SessionSubjects as i}from"@makaio/framework/contracts";import{MakaioBus as a}from"@makaio/framework/bus";function o(){a.__resetHandlers?.()}function s(e=10){return new Promise(t=>setTimeout(t,e))}function c(e,t){let n=Date.now();return{agentId:e,adapterId:`adapter-${e}`,adapterName:`test-adapter`,sessionId:t?.sessionId??`test-session`,role:`member`,status:`idle`,createdAt:n,lastActivityAt:n,...t}}async function l(e,t=e,r=`test-machine`){await a.emit(n.initialized,{adapterName:e,adapterId:t,machineId:r,ownerInstanceId:`owner-${t}`,capabilities:[]})}async function u(t){return(await a.request(e.getEvents,{sessionId:t})).events}function d(e,t,n){let r=[];return n.push(a.on(e,(e=>{let n=e.payload;r.push(t(n))}))),{received:r,clear:()=>{r.length=0}}}function f(e){return d(i.turn.started,e=>({sessionId:e.sessionId,turnId:e.turnId,turnNumber:e.turnNumber,messageId:e.messageId,agentIds:[...e.agentIds],initiator:e.initiator,ingestionMarker:e.ingestionMarker}),e)}function p(e){return d(i.turn.completed,e=>({sessionId:e.sessionId,turnId:e.turnId,turnNumber:e.turnNumber,success:e.success,error:e.error,initiator:e.initiator,ingestionMarker:e.ingestionMarker}),e)}function m(e){return d(i.user_message.sent,e=>({sessionId:e.sessionId,turnId:e.turnId,messageId:e.messageId,content:e.content,agentIds:[...e.agentIds],origin:e.origin}),e)}function h(e){return d(i.user_message.acknowledged,e=>({sessionId:e.sessionId,turnId:e.turnId,messageId:e.messageId,agentId:e.agentId}),e)}function g(e){return d(i.user_message.completed,e=>({sessionId:e.sessionId,turnId:e.turnId,messageId:e.messageId,agentId:e.agentId,outcome:e.outcome,error:e.error}),e)}function _(e,t){return c(e,{runtimeOwner:{machineId:`test-machine`,instanceId:`test-runtime-owner`},...t})}function v(e){let t=Date.now();return{sessionId:e.sessionId,createdAt:t,lastActivityAt:t,status:e.status??`active`,agents:e.agents??[],leadAgentId:e.leadAgentId,targetWorkingDirectory:e.targetWorkingDirectory}}function y(e){return a.on(i.create,t=>{let n=t.payload.sessionId??`session-${crypto.randomUUID().slice(0,8)}`;e.set(n,v({sessionId:n,agents:[]})),t.setResult({sessionId:n})})}function b(e){return a.on(i.agent.added,t=>{let n=e.get(t.payload.sessionId);if(!n)return;let r=n.agents.length===0,i=t.payload.role??(r?`lead`:`member`);r&&(n.adapterSessionId=t.payload.adapterSessionId,n.adapterName=t.payload.adapterName,n.adapterId=t.payload.adapterId);let a=Date.now();n.agents.push({agentId:t.payload.agentId,adapterId:t.payload.adapterId,adapterName:t.payload.adapterName,sessionId:t.payload.sessionId,role:i,status:`idle`,createdAt:a,lastActivityAt:a}),i===`lead`&&(n.leadAgentId=t.payload.agentId),n.lastActivityAt=Date.now()})}function x(e){return a.on(i.get,t=>{t.setResult({session:e.get(t.payload.sessionId)??null})})}function S(e){return a.on(n.getAgent,t=>{for(let n of e.values()){let e=n.agents.find(e=>e.agentId===t.payload.agentId);if(e){t.setResult({agent:{agentId:e.agentId,sessionId:n.sessionId,adapterSessionId:``}});return}}t.setResult({agent:null})})}function C(){return a.on(n.rehydrateAgent,e=>{e.setResult({success:!0,...t(e.payload)})})}function w(e=`/previous/cwd`){return a.on(r.cwd.change,t=>{t.setResult({success:!0,previousCwd:e})})}function T(){return a.on(r.model.change,e=>{e.setResult({success:!0,swapped:!1})})}function E(e){return a.on(n.startAgent,n=>{let{adapterId:r,initialMessage:i}=n.payload,a=n.payload.sessionId??`session-${crypto.randomUUID().slice(0,8)}`,o=n.payload.agentId??`agent-${crypto.randomUUID().slice(0,8)}`,s=i?`msg-${crypto.randomUUID().slice(0,8)}`:void 0,c=`adapter-session-${a}`;e?.({adapterId:r,sessionId:a,initialMessage:i}),n.setResult({success:!0,agentId:o,adapterId:r,adapterSessionId:c,sessionId:a,...t(n.payload),...s&&{messageId:s}}),M({sessionId:a,agentId:o,adapterId:r,adapterSessionId:c})})}function D(e){return a.on(n.startAgent,t=>{t.setResult({success:!1,dispatch:`not-dispatched`,message:e})})}function O(e){return a.on(r.sendMessage,t=>{let{agentId:n,adapterId:r,message:i,messageId:a,sessionContext:o,responseSchema:s}=t.payload,c=a??`msg-${crypto.randomUUID().slice(0,8)}`;e?.({agentId:n,adapterId:r,message:i,messageId:c,sessionContext:o,responseSchema:s}),t.setResult({messageId:c})})}function k(e,t){return a.on(r.sendMessage,n=>{if(e.has(n.payload.agentId))throw Error(t);n.setResult({messageId:n.payload.messageId??`generated-id`})})}async function A(e){await a.emit(r.complete,{agentId:e.agentId,adapterId:`adapter-${e.agentId}`,adapterName:`test-adapter`,adapterSessionId:`adapter-session-${e.agentId}`,messageId:e.messageId,turnId:e.turnId})}async function j(e){await a.emit(r.complete,{agentId:e.agentId,adapterId:`adapter-${e.agentId}`,adapterName:`test-adapter`,adapterSessionId:`adapter-session-${e.agentId}`,messageId:e.messageId,turnId:e.turnId,outcome:`error`,error:e.error})}function M(e){setImmediate(()=>{a.emit(i.agent.added,{sessionId:e.sessionId,agentId:e.agentId,adapterId:e.adapterId,adapterName:e.adapterId,adapterSessionId:e.adapterSessionId,role:e.role})})}function N(e,r){let i=new Map,o=a.on(n.startAgent,n=>{r.payload=n.payload;let a=n.payload.agentId??`agent-${crypto.randomUUID().slice(0,8)}`,o=n.payload.initialMessage?`msg-${crypto.randomUUID().slice(0,8)}`:void 0,s=`adapter-session-${e}`;i.set(a,{agentId:a,sessionId:e,adapterSessionId:s,adapterId:n.payload.adapterId}),n.setResult({success:!0,agentId:a,adapterId:n.payload.adapterId,adapterSessionId:s,sessionId:e,...t(n.payload),...o&&{messageId:o}}),M({sessionId:e,agentId:a,adapterId:n.payload.adapterId,adapterSessionId:s})}),s=a.on(n.getAgent,e=>{let t=i.get(e.payload.agentId);e.setResult({agent:t?{agentId:t.agentId,sessionId:t.sessionId,adapterSessionId:t.adapterSessionId}:null})});return()=>{o(),s()}}export{l as C,s as E,m as S,o as T,E as _,j as a,h as b,y as c,D as d,S as f,O as g,C as h,A as i,w as l,T as m,v as n,b as o,x as p,M as r,N as s,_ as t,k as u,p as v,u as w,g as x,f as y};