@swal/edge-mesh 0.0.0-stage → 0.1.0

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 (464) hide show
  1. package/LICENSE +128 -0
  2. package/NOTICE +37 -0
  3. package/README.md +470 -2
  4. package/dist/adapters/gpu-agent/index.d.ts +61 -0
  5. package/dist/adapters/gpu-agent/index.d.ts.map +1 -0
  6. package/dist/adapters/gpu-agent/index.js +364 -0
  7. package/dist/adapters/gpu-agent/index.js.map +1 -0
  8. package/dist/adapters/maloca-salud/citas-distribuidas.d.ts +19 -0
  9. package/dist/adapters/maloca-salud/citas-distribuidas.d.ts.map +1 -0
  10. package/dist/adapters/maloca-salud/citas-distribuidas.js +51 -0
  11. package/dist/adapters/maloca-salud/citas-distribuidas.js.map +1 -0
  12. package/dist/adapters/maloca-salud/eps-bridge.d.ts +15 -0
  13. package/dist/adapters/maloca-salud/eps-bridge.d.ts.map +1 -0
  14. package/dist/adapters/maloca-salud/eps-bridge.js +27 -0
  15. package/dist/adapters/maloca-salud/eps-bridge.js.map +1 -0
  16. package/dist/adapters/maloca-salud/patient-profile.d.ts +20 -0
  17. package/dist/adapters/maloca-salud/patient-profile.d.ts.map +1 -0
  18. package/dist/adapters/maloca-salud/patient-profile.js +36 -0
  19. package/dist/adapters/maloca-salud/patient-profile.js.map +1 -0
  20. package/dist/adapters/maloca-salud/types.d.ts +40 -0
  21. package/dist/adapters/maloca-salud/types.d.ts.map +1 -0
  22. package/dist/adapters/maloca-salud/types.js +2 -0
  23. package/dist/adapters/maloca-salud/types.js.map +1 -0
  24. package/dist/adapters/maloca-veeduria/contract-bridge.d.ts +31 -0
  25. package/dist/adapters/maloca-veeduria/contract-bridge.d.ts.map +1 -0
  26. package/dist/adapters/maloca-veeduria/contract-bridge.js +103 -0
  27. package/dist/adapters/maloca-veeduria/contract-bridge.js.map +1 -0
  28. package/dist/adapters/maloca-veeduria/evidentia-veeduria.d.ts +14 -0
  29. package/dist/adapters/maloca-veeduria/evidentia-veeduria.d.ts.map +1 -0
  30. package/dist/adapters/maloca-veeduria/evidentia-veeduria.js +40 -0
  31. package/dist/adapters/maloca-veeduria/evidentia-veeduria.js.map +1 -0
  32. package/dist/adapters/maloca-veeduria/licitante-profile.d.ts +21 -0
  33. package/dist/adapters/maloca-veeduria/licitante-profile.d.ts.map +1 -0
  34. package/dist/adapters/maloca-veeduria/licitante-profile.js +58 -0
  35. package/dist/adapters/maloca-veeduria/licitante-profile.js.map +1 -0
  36. package/dist/adapters/maloca-veeduria/types.d.ts +30 -0
  37. package/dist/adapters/maloca-veeduria/types.d.ts.map +1 -0
  38. package/dist/adapters/maloca-veeduria/types.js +2 -0
  39. package/dist/adapters/maloca-veeduria/types.js.map +1 -0
  40. package/dist/adapters/maloca-xavier/agent-profile.d.ts +32 -0
  41. package/dist/adapters/maloca-xavier/agent-profile.d.ts.map +1 -0
  42. package/dist/adapters/maloca-xavier/agent-profile.js +56 -0
  43. package/dist/adapters/maloca-xavier/agent-profile.js.map +1 -0
  44. package/dist/adapters/maloca-xavier/codegraph-bridge.d.ts +27 -0
  45. package/dist/adapters/maloca-xavier/codegraph-bridge.d.ts.map +1 -0
  46. package/dist/adapters/maloca-xavier/codegraph-bridge.js +58 -0
  47. package/dist/adapters/maloca-xavier/codegraph-bridge.js.map +1 -0
  48. package/dist/adapters/maloca-xavier/llm-router.d.ts +25 -0
  49. package/dist/adapters/maloca-xavier/llm-router.d.ts.map +1 -0
  50. package/dist/adapters/maloca-xavier/llm-router.js +58 -0
  51. package/dist/adapters/maloca-xavier/llm-router.js.map +1 -0
  52. package/dist/authz/index.d.ts +81 -0
  53. package/dist/authz/index.d.ts.map +1 -0
  54. package/dist/authz/index.js +271 -0
  55. package/dist/authz/index.js.map +1 -0
  56. package/dist/chat/index.d.ts +138 -0
  57. package/dist/chat/index.d.ts.map +1 -0
  58. package/dist/chat/index.js +394 -0
  59. package/dist/chat/index.js.map +1 -0
  60. package/dist/chat/offline-queue.d.ts +32 -0
  61. package/dist/chat/offline-queue.d.ts.map +1 -0
  62. package/dist/chat/offline-queue.js +93 -0
  63. package/dist/chat/offline-queue.js.map +1 -0
  64. package/dist/core/DefaultEdgeMeshNode.d.ts +17 -0
  65. package/dist/core/DefaultEdgeMeshNode.d.ts.map +1 -0
  66. package/dist/core/DefaultEdgeMeshNode.js +57 -0
  67. package/dist/core/DefaultEdgeMeshNode.js.map +1 -0
  68. package/dist/core/node.d.ts +26 -0
  69. package/dist/core/node.d.ts.map +1 -0
  70. package/dist/core/node.js +16 -0
  71. package/dist/core/node.js.map +1 -0
  72. package/dist/edge-mesh.d.ts +139 -0
  73. package/dist/edge-mesh.d.ts.map +1 -0
  74. package/dist/edge-mesh.js +1146 -0
  75. package/dist/edge-mesh.js.map +1 -0
  76. package/dist/gos/GosBridge.d.ts +49 -0
  77. package/dist/gos/GosBridge.d.ts.map +1 -0
  78. package/dist/gos/GosBridge.js +133 -0
  79. package/dist/gos/GosBridge.js.map +1 -0
  80. package/dist/governance/authority.d.ts +44 -0
  81. package/dist/governance/authority.d.ts.map +1 -0
  82. package/dist/governance/authority.js +123 -0
  83. package/dist/governance/authority.js.map +1 -0
  84. package/dist/governance/index.d.ts +66 -0
  85. package/dist/governance/index.d.ts.map +1 -0
  86. package/dist/governance/index.js +210 -0
  87. package/dist/governance/index.js.map +1 -0
  88. package/dist/governance/merge.d.ts +31 -0
  89. package/dist/governance/merge.d.ts.map +1 -0
  90. package/dist/governance/merge.js +167 -0
  91. package/dist/governance/merge.js.map +1 -0
  92. package/dist/identity/index.d.ts +199 -0
  93. package/dist/identity/index.d.ts.map +1 -0
  94. package/dist/identity/index.js +415 -0
  95. package/dist/identity/index.js.map +1 -0
  96. package/dist/index.d.ts +71 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +56 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/maloca/backoffice.d.ts +31 -0
  101. package/dist/maloca/backoffice.d.ts.map +1 -0
  102. package/dist/maloca/backoffice.js +40 -0
  103. package/dist/maloca/backoffice.js.map +1 -0
  104. package/dist/maloca/event-bus.d.ts +60 -0
  105. package/dist/maloca/event-bus.d.ts.map +1 -0
  106. package/dist/maloca/event-bus.js +175 -0
  107. package/dist/maloca/event-bus.js.map +1 -0
  108. package/dist/maloca/evidentia.d.ts +136 -0
  109. package/dist/maloca/evidentia.d.ts.map +1 -0
  110. package/dist/maloca/evidentia.js +447 -0
  111. package/dist/maloca/evidentia.js.map +1 -0
  112. package/dist/maloca/gateway/api.d.ts +146 -0
  113. package/dist/maloca/gateway/api.d.ts.map +1 -0
  114. package/dist/maloca/gateway/api.js +228 -0
  115. package/dist/maloca/gateway/api.js.map +1 -0
  116. package/dist/maloca/gateway/auth.d.ts +20 -0
  117. package/dist/maloca/gateway/auth.d.ts.map +1 -0
  118. package/dist/maloca/gateway/auth.js +115 -0
  119. package/dist/maloca/gateway/auth.js.map +1 -0
  120. package/dist/maloca/gateway/dashboard.d.ts +42 -0
  121. package/dist/maloca/gateway/dashboard.d.ts.map +1 -0
  122. package/dist/maloca/gateway/dashboard.js +67 -0
  123. package/dist/maloca/gateway/dashboard.js.map +1 -0
  124. package/dist/maloca/gateway/websocket.d.ts +34 -0
  125. package/dist/maloca/gateway/websocket.d.ts.map +1 -0
  126. package/dist/maloca/gateway/websocket.js +71 -0
  127. package/dist/maloca/gateway/websocket.js.map +1 -0
  128. package/dist/maloca/karma.d.ts +165 -0
  129. package/dist/maloca/karma.d.ts.map +1 -0
  130. package/dist/maloca/karma.js +307 -0
  131. package/dist/maloca/karma.js.map +1 -0
  132. package/dist/maloca/kernel.d.ts +20 -0
  133. package/dist/maloca/kernel.d.ts.map +1 -0
  134. package/dist/maloca/kernel.js +76 -0
  135. package/dist/maloca/kernel.js.map +1 -0
  136. package/dist/maloca/metadata.d.ts +30 -0
  137. package/dist/maloca/metadata.d.ts.map +1 -0
  138. package/dist/maloca/metadata.js +80 -0
  139. package/dist/maloca/metadata.js.map +1 -0
  140. package/dist/maloca/perfil.d.ts +57 -0
  141. package/dist/maloca/perfil.d.ts.map +1 -0
  142. package/dist/maloca/perfil.js +113 -0
  143. package/dist/maloca/perfil.js.map +1 -0
  144. package/dist/maloca/plugin-registry.d.ts +27 -0
  145. package/dist/maloca/plugin-registry.d.ts.map +1 -0
  146. package/dist/maloca/plugin-registry.js +76 -0
  147. package/dist/maloca/plugin-registry.js.map +1 -0
  148. package/dist/maloca/polygon-bridge.d.ts +63 -0
  149. package/dist/maloca/polygon-bridge.d.ts.map +1 -0
  150. package/dist/maloca/polygon-bridge.js +198 -0
  151. package/dist/maloca/polygon-bridge.js.map +1 -0
  152. package/dist/maloca/types.d.ts +44 -0
  153. package/dist/maloca/types.d.ts.map +1 -0
  154. package/dist/maloca/types.js +2 -0
  155. package/dist/maloca/types.js.map +1 -0
  156. package/dist/medico/aval.d.ts +149 -0
  157. package/dist/medico/aval.d.ts.map +1 -0
  158. package/dist/medico/aval.js +281 -0
  159. package/dist/medico/aval.js.map +1 -0
  160. package/dist/medico/canonica.d.ts +96 -0
  161. package/dist/medico/canonica.d.ts.map +1 -0
  162. package/dist/medico/canonica.js +148 -0
  163. package/dist/medico/canonica.js.map +1 -0
  164. package/dist/medico/credencial.d.ts +160 -0
  165. package/dist/medico/credencial.d.ts.map +1 -0
  166. package/dist/medico/credencial.js +240 -0
  167. package/dist/medico/credencial.js.map +1 -0
  168. package/dist/medico/index.d.ts +36 -0
  169. package/dist/medico/index.d.ts.map +1 -0
  170. package/dist/medico/index.js +39 -0
  171. package/dist/medico/index.js.map +1 -0
  172. package/dist/medico/malla.d.ts +218 -0
  173. package/dist/medico/malla.d.ts.map +1 -0
  174. package/dist/medico/malla.js +347 -0
  175. package/dist/medico/malla.js.map +1 -0
  176. package/dist/medico/registro-profesional.d.ts +84 -0
  177. package/dist/medico/registro-profesional.d.ts.map +1 -0
  178. package/dist/medico/registro-profesional.js +135 -0
  179. package/dist/medico/registro-profesional.js.map +1 -0
  180. package/dist/medico/registro.d.ts +149 -0
  181. package/dist/medico/registro.d.ts.map +1 -0
  182. package/dist/medico/registro.js +173 -0
  183. package/dist/medico/registro.js.map +1 -0
  184. package/dist/medico/types.d.ts +287 -0
  185. package/dist/medico/types.d.ts.map +1 -0
  186. package/dist/medico/types.js +135 -0
  187. package/dist/medico/types.js.map +1 -0
  188. package/dist/medico/verificacion-registro.d.ts +300 -0
  189. package/dist/medico/verificacion-registro.d.ts.map +1 -0
  190. package/dist/medico/verificacion-registro.js +319 -0
  191. package/dist/medico/verificacion-registro.js.map +1 -0
  192. package/dist/mesh/index.d.ts +457 -0
  193. package/dist/mesh/index.d.ts.map +1 -0
  194. package/dist/mesh/index.js +929 -0
  195. package/dist/mesh/index.js.map +1 -0
  196. package/dist/namespaces/encrypted-plugin.d.ts +56 -0
  197. package/dist/namespaces/encrypted-plugin.d.ts.map +1 -0
  198. package/dist/namespaces/encrypted-plugin.js +173 -0
  199. package/dist/namespaces/encrypted-plugin.js.map +1 -0
  200. package/dist/namespaces/index.d.ts +52 -0
  201. package/dist/namespaces/index.d.ts.map +1 -0
  202. package/dist/namespaces/index.js +134 -0
  203. package/dist/namespaces/index.js.map +1 -0
  204. package/dist/namespaces/ivn-proofs.d.ts +54 -0
  205. package/dist/namespaces/ivn-proofs.d.ts.map +1 -0
  206. package/dist/namespaces/ivn-proofs.js +162 -0
  207. package/dist/namespaces/ivn-proofs.js.map +1 -0
  208. package/dist/namespaces/offers-gossip.d.ts +95 -0
  209. package/dist/namespaces/offers-gossip.d.ts.map +1 -0
  210. package/dist/namespaces/offers-gossip.js +213 -0
  211. package/dist/namespaces/offers-gossip.js.map +1 -0
  212. package/dist/node-memory/idb-store.d.ts +22 -0
  213. package/dist/node-memory/idb-store.d.ts.map +1 -0
  214. package/dist/node-memory/idb-store.js +154 -0
  215. package/dist/node-memory/idb-store.js.map +1 -0
  216. package/dist/node-memory/index.d.ts +14 -0
  217. package/dist/node-memory/index.d.ts.map +1 -0
  218. package/dist/node-memory/index.js +159 -0
  219. package/dist/node-memory/index.js.map +1 -0
  220. package/dist/node-memory/sync-flush.d.ts +11 -0
  221. package/dist/node-memory/sync-flush.d.ts.map +1 -0
  222. package/dist/node-memory/sync-flush.js +37 -0
  223. package/dist/node-memory/sync-flush.js.map +1 -0
  224. package/dist/node-memory/types.d.ts +34 -0
  225. package/dist/node-memory/types.d.ts.map +1 -0
  226. package/dist/node-memory/types.js +2 -0
  227. package/dist/node-memory/types.js.map +1 -0
  228. package/dist/node-memory/xavier-store.d.ts +12 -0
  229. package/dist/node-memory/xavier-store.d.ts.map +1 -0
  230. package/dist/node-memory/xavier-store.js +75 -0
  231. package/dist/node-memory/xavier-store.js.map +1 -0
  232. package/dist/op-log/index.d.ts +49 -0
  233. package/dist/op-log/index.d.ts.map +1 -0
  234. package/dist/op-log/index.js +190 -0
  235. package/dist/op-log/index.js.map +1 -0
  236. package/dist/presence/health.d.ts +54 -0
  237. package/dist/presence/health.d.ts.map +1 -0
  238. package/dist/presence/health.js +139 -0
  239. package/dist/presence/health.js.map +1 -0
  240. package/dist/presence/index.d.ts +85 -0
  241. package/dist/presence/index.d.ts.map +1 -0
  242. package/dist/presence/index.js +255 -0
  243. package/dist/presence/index.js.map +1 -0
  244. package/dist/presence/peer-health.d.ts +40 -0
  245. package/dist/presence/peer-health.d.ts.map +1 -0
  246. package/dist/presence/peer-health.js +118 -0
  247. package/dist/presence/peer-health.js.map +1 -0
  248. package/dist/protocol/canonical.d.ts +10 -0
  249. package/dist/protocol/canonical.d.ts.map +1 -0
  250. package/dist/protocol/canonical.js +32 -0
  251. package/dist/protocol/canonical.js.map +1 -0
  252. package/dist/protocol/crypto.d.ts +299 -0
  253. package/dist/protocol/crypto.d.ts.map +1 -0
  254. package/dist/protocol/crypto.js +739 -0
  255. package/dist/protocol/crypto.js.map +1 -0
  256. package/dist/protocol/index.d.ts +30 -0
  257. package/dist/protocol/index.d.ts.map +1 -0
  258. package/dist/protocol/index.js +116 -0
  259. package/dist/protocol/index.js.map +1 -0
  260. package/dist/protocol/utils.d.ts +5 -0
  261. package/dist/protocol/utils.d.ts.map +1 -0
  262. package/dist/protocol/utils.js +27 -0
  263. package/dist/protocol/utils.js.map +1 -0
  264. package/dist/salones/manager.d.ts +100 -0
  265. package/dist/salones/manager.d.ts.map +1 -0
  266. package/dist/salones/manager.js +240 -0
  267. package/dist/salones/manager.js.map +1 -0
  268. package/dist/security/rate-limiter.d.ts +13 -0
  269. package/dist/security/rate-limiter.d.ts.map +1 -0
  270. package/dist/security/rate-limiter.js +32 -0
  271. package/dist/security/rate-limiter.js.map +1 -0
  272. package/dist/snapshot/index.d.ts +90 -0
  273. package/dist/snapshot/index.d.ts.map +1 -0
  274. package/dist/snapshot/index.js +189 -0
  275. package/dist/snapshot/index.js.map +1 -0
  276. package/dist/storage/index.d.ts +49 -0
  277. package/dist/storage/index.d.ts.map +1 -0
  278. package/dist/storage/index.js +176 -0
  279. package/dist/storage/index.js.map +1 -0
  280. package/dist/storage/optimizer.d.ts +28 -0
  281. package/dist/storage/optimizer.d.ts.map +1 -0
  282. package/dist/storage/optimizer.js +50 -0
  283. package/dist/storage/optimizer.js.map +1 -0
  284. package/dist/storage/ydoc-persistence.d.ts +27 -0
  285. package/dist/storage/ydoc-persistence.d.ts.map +1 -0
  286. package/dist/storage/ydoc-persistence.js +128 -0
  287. package/dist/storage/ydoc-persistence.js.map +1 -0
  288. package/dist/sync/ChunkSyncManager.d.ts +41 -0
  289. package/dist/sync/ChunkSyncManager.d.ts.map +1 -0
  290. package/dist/sync/ChunkSyncManager.js +115 -0
  291. package/dist/sync/ChunkSyncManager.js.map +1 -0
  292. package/dist/sync/conflict-resolver.d.ts +33 -0
  293. package/dist/sync/conflict-resolver.d.ts.map +1 -0
  294. package/dist/sync/conflict-resolver.js +54 -0
  295. package/dist/sync/conflict-resolver.js.map +1 -0
  296. package/dist/sync/engine.d.ts +168 -0
  297. package/dist/sync/engine.d.ts.map +1 -0
  298. package/dist/sync/engine.js +315 -0
  299. package/dist/sync/engine.js.map +1 -0
  300. package/dist/sync/index.d.ts +3 -0
  301. package/dist/sync/index.d.ts.map +1 -0
  302. package/dist/sync/index.js +3 -0
  303. package/dist/sync/index.js.map +1 -0
  304. package/dist/transport/TorTransportAdapter.d.ts +70 -0
  305. package/dist/transport/TorTransportAdapter.d.ts.map +1 -0
  306. package/dist/transport/TorTransportAdapter.js +192 -0
  307. package/dist/transport/TorTransportAdapter.js.map +1 -0
  308. package/dist/transport/memory.d.ts +31 -0
  309. package/dist/transport/memory.d.ts.map +1 -0
  310. package/dist/transport/memory.js +114 -0
  311. package/dist/transport/memory.js.map +1 -0
  312. package/dist/transport/peerjs.d.ts +45 -0
  313. package/dist/transport/peerjs.d.ts.map +1 -0
  314. package/dist/transport/peerjs.js +301 -0
  315. package/dist/transport/peerjs.js.map +1 -0
  316. package/dist/transport/pqc-handshake.d.ts +72 -0
  317. package/dist/transport/pqc-handshake.d.ts.map +1 -0
  318. package/dist/transport/pqc-handshake.js +129 -0
  319. package/dist/transport/pqc-handshake.js.map +1 -0
  320. package/dist/transport/relay-config.d.ts +11 -0
  321. package/dist/transport/relay-config.d.ts.map +1 -0
  322. package/dist/transport/relay-config.js +48 -0
  323. package/dist/transport/relay-config.js.map +1 -0
  324. package/dist/transport/relay-server.d.ts +37 -0
  325. package/dist/transport/relay-server.d.ts.map +1 -0
  326. package/dist/transport/relay-server.js +230 -0
  327. package/dist/transport/relay-server.js.map +1 -0
  328. package/dist/transport/tor.d.ts +47 -0
  329. package/dist/transport/tor.d.ts.map +1 -0
  330. package/dist/transport/tor.js +158 -0
  331. package/dist/transport/tor.js.map +1 -0
  332. package/dist/transport/types.d.ts +34 -0
  333. package/dist/transport/types.d.ts.map +1 -0
  334. package/dist/transport/types.js +2 -0
  335. package/dist/transport/types.js.map +1 -0
  336. package/dist/types/index.d.ts +293 -0
  337. package/dist/types/index.d.ts.map +1 -0
  338. package/dist/types/index.js +73 -0
  339. package/dist/types/index.js.map +1 -0
  340. package/dist/web/admission.d.ts +24 -0
  341. package/dist/web/admission.d.ts.map +1 -0
  342. package/dist/web/admission.js +41 -0
  343. package/dist/web/admission.js.map +1 -0
  344. package/dist/web/crypto.d.ts +18 -0
  345. package/dist/web/crypto.d.ts.map +1 -0
  346. package/dist/web/crypto.js +78 -0
  347. package/dist/web/crypto.js.map +1 -0
  348. package/dist/web/exchange.d.ts +23 -0
  349. package/dist/web/exchange.d.ts.map +1 -0
  350. package/dist/web/exchange.js +54 -0
  351. package/dist/web/exchange.js.map +1 -0
  352. package/dist/web/fragment.d.ts +58 -0
  353. package/dist/web/fragment.d.ts.map +1 -0
  354. package/dist/web/fragment.js +198 -0
  355. package/dist/web/fragment.js.map +1 -0
  356. package/dist/web/index.d.ts +25 -0
  357. package/dist/web/index.d.ts.map +1 -0
  358. package/dist/web/index.js +14 -0
  359. package/dist/web/index.js.map +1 -0
  360. package/dist/web/merge/index.d.ts +104 -0
  361. package/dist/web/merge/index.d.ts.map +1 -0
  362. package/dist/web/merge/index.js +236 -0
  363. package/dist/web/merge/index.js.map +1 -0
  364. package/dist/web/oplog/hlc.d.ts +19 -0
  365. package/dist/web/oplog/hlc.d.ts.map +1 -0
  366. package/dist/web/oplog/hlc.js +39 -0
  367. package/dist/web/oplog/hlc.js.map +1 -0
  368. package/dist/web/oplog/index.d.ts +10 -0
  369. package/dist/web/oplog/index.d.ts.map +1 -0
  370. package/dist/web/oplog/index.js +6 -0
  371. package/dist/web/oplog/index.js.map +1 -0
  372. package/dist/web/oplog/log.d.ts +182 -0
  373. package/dist/web/oplog/log.d.ts.map +1 -0
  374. package/dist/web/oplog/log.js +693 -0
  375. package/dist/web/oplog/log.js.map +1 -0
  376. package/dist/web/oplog/store.d.ts +40 -0
  377. package/dist/web/oplog/store.d.ts.map +1 -0
  378. package/dist/web/oplog/store.js +85 -0
  379. package/dist/web/oplog/store.js.map +1 -0
  380. package/dist/web/oplog/sync.d.ts +54 -0
  381. package/dist/web/oplog/sync.d.ts.map +1 -0
  382. package/dist/web/oplog/sync.js +162 -0
  383. package/dist/web/oplog/sync.js.map +1 -0
  384. package/dist/web/oplog/types.d.ts +119 -0
  385. package/dist/web/oplog/types.d.ts.map +1 -0
  386. package/dist/web/oplog/types.js +2 -0
  387. package/dist/web/oplog/types.js.map +1 -0
  388. package/dist/web/pairing.d.ts +186 -0
  389. package/dist/web/pairing.d.ts.map +1 -0
  390. package/dist/web/pairing.js +395 -0
  391. package/dist/web/pairing.js.map +1 -0
  392. package/dist/web/pq.d.ts +36 -0
  393. package/dist/web/pq.d.ts.map +1 -0
  394. package/dist/web/pq.js +59 -0
  395. package/dist/web/pq.js.map +1 -0
  396. package/dist/web/provider.d.ts +188 -0
  397. package/dist/web/provider.d.ts.map +1 -0
  398. package/dist/web/provider.js +2042 -0
  399. package/dist/web/provider.js.map +1 -0
  400. package/dist/web/rooms.d.ts +20 -0
  401. package/dist/web/rooms.d.ts.map +1 -0
  402. package/dist/web/rooms.js +51 -0
  403. package/dist/web/rooms.js.map +1 -0
  404. package/dist/web/rotation.d.ts +73 -0
  405. package/dist/web/rotation.d.ts.map +1 -0
  406. package/dist/web/rotation.js +130 -0
  407. package/dist/web/rotation.js.map +1 -0
  408. package/dist/web/secstate.d.ts +213 -0
  409. package/dist/web/secstate.d.ts.map +1 -0
  410. package/dist/web/secstate.js +789 -0
  411. package/dist/web/secstate.js.map +1 -0
  412. package/dist/web/store.d.ts +9 -0
  413. package/dist/web/store.d.ts.map +1 -0
  414. package/dist/web/store.js +32 -0
  415. package/dist/web/store.js.map +1 -0
  416. package/dist/web/transports/loopback.d.ts +11 -0
  417. package/dist/web/transports/loopback.d.ts.map +1 -0
  418. package/dist/web/transports/loopback.js +97 -0
  419. package/dist/web/transports/loopback.js.map +1 -0
  420. package/dist/web/transports/qr-sdp.d.ts +27 -0
  421. package/dist/web/transports/qr-sdp.d.ts.map +1 -0
  422. package/dist/web/transports/qr-sdp.js +131 -0
  423. package/dist/web/transports/qr-sdp.js.map +1 -0
  424. package/dist/web/transports/ws.d.ts +12 -0
  425. package/dist/web/transports/ws.d.ts.map +1 -0
  426. package/dist/web/transports/ws.js +139 -0
  427. package/dist/web/transports/ws.js.map +1 -0
  428. package/dist/web/trust/canonical.d.ts +8 -0
  429. package/dist/web/trust/canonical.d.ts.map +1 -0
  430. package/dist/web/trust/canonical.js +27 -0
  431. package/dist/web/trust/canonical.js.map +1 -0
  432. package/dist/web/trust/docs.d.ts +51 -0
  433. package/dist/web/trust/docs.d.ts.map +1 -0
  434. package/dist/web/trust/docs.js +170 -0
  435. package/dist/web/trust/docs.js.map +1 -0
  436. package/dist/web/trust/index.d.ts +10 -0
  437. package/dist/web/trust/index.d.ts.map +1 -0
  438. package/dist/web/trust/index.js +7 -0
  439. package/dist/web/trust/index.js.map +1 -0
  440. package/dist/web/trust/keys.d.ts +37 -0
  441. package/dist/web/trust/keys.d.ts.map +1 -0
  442. package/dist/web/trust/keys.js +75 -0
  443. package/dist/web/trust/keys.js.map +1 -0
  444. package/dist/web/trust/store.d.ts +150 -0
  445. package/dist/web/trust/store.d.ts.map +1 -0
  446. package/dist/web/trust/store.js +587 -0
  447. package/dist/web/trust/store.js.map +1 -0
  448. package/dist/web/trust/types.d.ts +134 -0
  449. package/dist/web/trust/types.d.ts.map +1 -0
  450. package/dist/web/trust/types.js +4 -0
  451. package/dist/web/trust/types.js.map +1 -0
  452. package/dist/web/types.d.ts +115 -0
  453. package/dist/web/types.d.ts.map +1 -0
  454. package/dist/web/types.js +2 -0
  455. package/dist/web/types.js.map +1 -0
  456. package/dist/web/util.d.ts +12 -0
  457. package/dist/web/util.d.ts.map +1 -0
  458. package/dist/web/util.js +54 -0
  459. package/dist/web/util.js.map +1 -0
  460. package/dist/web/webrtc.d.ts +35 -0
  461. package/dist/web/webrtc.d.ts.map +1 -0
  462. package/dist/web/webrtc.js +304 -0
  463. package/dist/web/webrtc.js.map +1 -0
  464. package/package.json +138 -4
@@ -0,0 +1,51 @@
1
+ import { type Signer } from "./keys.js";
2
+ import { type Grant, type Permissions, type Revocation, type TrustSchema } from "./types.js";
3
+ export interface GrantInput {
4
+ /** base64url ML-DSA-65 public key of the device (and optionally its ECDH / ML-KEM keys for key wraps) */
5
+ subject: {
6
+ pub: string;
7
+ ecdh?: string;
8
+ kem?: string;
9
+ };
10
+ role: string;
11
+ permissions: Permissions;
12
+ delegate?: number;
13
+ name?: string;
14
+ notBefore?: number;
15
+ expiresAt?: number;
16
+ seqCutoff?: number;
17
+ issuedAt?: number;
18
+ /** mesh key epoch handed over with the grant (web/provider pairing) */
19
+ epoch?: number;
20
+ }
21
+ export interface IssueContext {
22
+ inst: string;
23
+ /** the issuer's own grant (or its id); omit when signing with the root key */
24
+ parent?: Grant | string;
25
+ /** ms; default Date.now() */
26
+ now?: number;
27
+ }
28
+ /** Resolve a role preset of the schema into GrantInput fields. Throws on unknown role. */
29
+ export declare function rolePreset(schema: TrustSchema, role: string): Pick<GrantInput, "role" | "permissions" | "delegate">;
30
+ export declare function issueGrant(issuer: Signer, input: GrantInput, ctx: IssueContext): Promise<Grant>;
31
+ export interface RevocationInput {
32
+ target: string;
33
+ lastSeq: number;
34
+ lastId?: string;
35
+ upTo?: Record<string, number>;
36
+ upToIds?: Record<string, string>;
37
+ reason?: string;
38
+ issuedAt?: number;
39
+ }
40
+ export declare function issueRevocation(issuer: Signer, input: RevocationInput, ctx: IssueContext): Promise<Revocation>;
41
+ export declare function bodyOf<T extends {
42
+ id: string;
43
+ sig: string;
44
+ }>(doc: T): Omit<T, "id" | "sig">;
45
+ /** Shape check of an untrusted grant. Returns a reason string when malformed. */
46
+ export declare function checkGrantShape(x: unknown, schema: TrustSchema): string | null;
47
+ export declare function checkRevocationShape(x: unknown): string | null;
48
+ /** id == hash(body) and (for grants) subject.fp == fingerprint(subject.pub). */
49
+ export declare function checkIntegrity(doc: Grant | Revocation): Promise<string | null>;
50
+ export declare const verifyDocSignature: (doc: Grant | Revocation, issuerPub: string) => Promise<boolean>;
51
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../../src/web/trust/docs.ts"],"names":[],"mappings":"AAEA,OAAO,EAKN,KAAK,MAAM,EAGX,MAAM,WAAW,CAAC;AACnB,OAAO,EAEN,KAAK,KAAK,EAGV,KAAK,WAAW,EAChB,KAAK,UAAU,EAEf,KAAK,WAAW,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,UAAU;IAC1B,yGAAyG;IACzG,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAKD,0FAA0F;AAC1F,wBAAgB,UAAU,CACzB,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,GACV,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,UAAU,CAAC,CAQvD;AAED,wBAAsB,UAAU,CAC/B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,YAAY,GACf,OAAO,CAAC,KAAK,CAAC,CAkChB;AAED,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,eAAe,CACpC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,YAAY,GACf,OAAO,CAAC,UAAU,CAAC,CA2BrB;AAaD,wBAAgB,MAAM,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAC3D,GAAG,EAAE,CAAC,GACJ,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,CAGvB;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAC9B,CAAC,EAAE,OAAO,EACV,MAAM,EAAE,WAAW,GACjB,MAAM,GAAG,IAAI,CAgCf;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CA4B9D;AAED,gFAAgF;AAChF,wBAAsB,cAAc,CACnC,GAAG,EAAE,KAAK,GAAG,UAAU,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQxB;AAED,eAAO,MAAM,kBAAkB,QACzB,KAAK,GAAG,UAAU,aACZ,MAAM,KACf,OAAO,CAAC,OAAO,CAAqD,CAAC"}
@@ -0,0 +1,170 @@
1
+ // Signed trust documents: create, parse (shape), id and signature checks. No policy here (see store.ts).
2
+ import { contentId } from "./canonical.js";
3
+ import { isPublicKey, isSignature, keyFingerprint, SIG_ALG, signCanonical, verifyCanonical, } from "./keys.js";
4
+ import { isLevel, } from "./types.js";
5
+ const parentId = (p) => typeof p === "string" ? p : p?.id;
6
+ /** Resolve a role preset of the schema into GrantInput fields. Throws on unknown role. */
7
+ export function rolePreset(schema, role) {
8
+ const preset = schema.roles?.[role];
9
+ if (!preset)
10
+ throw new Error(`unknown role "${role}"`);
11
+ return {
12
+ role,
13
+ permissions: { ...preset.permissions },
14
+ delegate: preset.delegate ?? 0,
15
+ };
16
+ }
17
+ export async function issueGrant(issuer, input, ctx) {
18
+ const now = ctx.now ?? Date.now();
19
+ if (!isPublicKey(input.subject.pub))
20
+ throw new Error("subject is not an ML-DSA-65 public key");
21
+ const subject = {
22
+ fp: await keyFingerprint(input.subject.pub),
23
+ pub: input.subject.pub,
24
+ ecdh: input.subject.ecdh,
25
+ kem: input.subject.kem,
26
+ };
27
+ const body = {
28
+ t: "grant",
29
+ v: 1,
30
+ alg: SIG_ALG,
31
+ inst: ctx.inst,
32
+ subject,
33
+ name: input.name,
34
+ role: input.role,
35
+ permissions: { ...input.permissions },
36
+ delegate: input.delegate ?? 0,
37
+ notBefore: input.notBefore ?? now,
38
+ expiresAt: input.expiresAt,
39
+ seqCutoff: input.seqCutoff,
40
+ issuer: issuer.fp,
41
+ parent: parentId(ctx.parent),
42
+ issuedAt: input.issuedAt ?? now,
43
+ epoch: input.epoch,
44
+ };
45
+ const clean = JSON.parse(JSON.stringify(body)); // drop undefined members for a stable wire shape
46
+ return {
47
+ ...clean,
48
+ id: await contentId(clean),
49
+ sig: await signCanonical(issuer, clean),
50
+ };
51
+ }
52
+ export async function issueRevocation(issuer, input, ctx) {
53
+ // R4-N6: history kept up to lastSeq is anchored on the revoker's head op; without it the S3 fork protection is off
54
+ if (input.lastSeq > 0 && !input.lastId)
55
+ throw new Error("a revocation that keeps history (lastSeq > 0) needs lastId: pass {seq, id} heads to prepareRevocation");
56
+ const body = {
57
+ t: "revoke",
58
+ v: 1,
59
+ alg: SIG_ALG,
60
+ inst: ctx.inst,
61
+ target: input.target,
62
+ lastSeq: input.lastSeq,
63
+ lastId: input.lastId,
64
+ upTo: input.upTo ? { ...input.upTo } : undefined,
65
+ upToIds: input.upToIds ? { ...input.upToIds } : undefined,
66
+ reason: input.reason,
67
+ issuer: issuer.fp,
68
+ parent: parentId(ctx.parent),
69
+ issuedAt: input.issuedAt ?? ctx.now ?? Date.now(),
70
+ };
71
+ const clean = JSON.parse(JSON.stringify(body));
72
+ return {
73
+ ...clean,
74
+ id: await contentId(clean),
75
+ sig: await signCanonical(issuer, clean),
76
+ };
77
+ }
78
+ // ─── parsing ────────────────────────────────────────────────────────────────
79
+ const isStr = (x, max = 512) => typeof x === "string" && x.length > 0 && x.length <= max;
80
+ const isOptStr = (x, max = 512) => x === undefined || isStr(x, max);
81
+ const isNat = (x) => typeof x === "number" && Number.isSafeInteger(x) && x >= 0;
82
+ const isOptNat = (x) => x === undefined || isNat(x);
83
+ const isObj = (x) => !!x && typeof x === "object" && !Array.isArray(x);
84
+ export function bodyOf(doc) {
85
+ const { id: _id, sig: _sig, ...body } = doc;
86
+ return body;
87
+ }
88
+ /** Shape check of an untrusted grant. Returns a reason string when malformed. */
89
+ export function checkGrantShape(x, schema) {
90
+ if (!isObj(x) || x.t !== "grant")
91
+ return "not a grant";
92
+ if (x.v !== 1 || x.alg !== SIG_ALG)
93
+ return "unsupported version/alg";
94
+ if (!isStr(x.id) ||
95
+ !isSignature(x.sig) ||
96
+ !isStr(x.inst) ||
97
+ !isStr(x.issuer) ||
98
+ !isStr(x.role, 128)) {
99
+ return "missing fields";
100
+ }
101
+ if (!isOptStr(x.parent) || !isOptStr(x.name, 256))
102
+ return "bad parent/name";
103
+ const s = x.subject;
104
+ if (!isObj(s) ||
105
+ !isStr(s.fp) ||
106
+ !isPublicKey(s.pub) ||
107
+ !isOptStr(s.ecdh) ||
108
+ !isOptStr(s.kem, 2048))
109
+ return "bad subject";
110
+ if (!isNat(x.delegate) || !isNat(x.notBefore) || !isNat(x.issuedAt))
111
+ return "bad numbers";
112
+ if (!isOptNat(x.expiresAt) || !isOptNat(x.seqCutoff) || !isOptNat(x.epoch))
113
+ return "bad numbers";
114
+ if (!isObj(x.permissions))
115
+ return "bad permissions";
116
+ for (const [mod, lvl] of Object.entries(x.permissions)) {
117
+ if (!schema.modules.includes(mod))
118
+ return `unknown module "${mod}"`;
119
+ if (!isLevel(lvl))
120
+ return `bad level for "${mod}"`;
121
+ }
122
+ return null;
123
+ }
124
+ export function checkRevocationShape(x) {
125
+ if (!isObj(x) || x.t !== "revoke")
126
+ return "not a revocation";
127
+ if (x.v !== 1 || x.alg !== SIG_ALG)
128
+ return "unsupported version/alg";
129
+ if (!isStr(x.id) ||
130
+ !isSignature(x.sig) ||
131
+ !isStr(x.inst) ||
132
+ !isStr(x.issuer) ||
133
+ !isStr(x.target)) {
134
+ return "missing fields";
135
+ }
136
+ if (!isOptStr(x.parent) || !isOptStr(x.reason, 1024))
137
+ return "bad parent/reason";
138
+ if (!isNat(x.lastSeq) || !isNat(x.issuedAt))
139
+ return "bad numbers";
140
+ if (!isOptStr(x.lastId, 128))
141
+ return "bad lastId";
142
+ if (x.lastSeq > 0 && x.lastId === undefined)
143
+ return "missing lastId (lastSeq > 0)";
144
+ if (x.upTo !== undefined) {
145
+ if (!isObj(x.upTo))
146
+ return "bad upTo";
147
+ for (const v of Object.values(x.upTo))
148
+ if (!isNat(v))
149
+ return "bad upTo";
150
+ }
151
+ if (x.upToIds !== undefined) {
152
+ if (!isObj(x.upToIds))
153
+ return "bad upToIds";
154
+ for (const v of Object.values(x.upToIds))
155
+ if (!isStr(v, 128))
156
+ return "bad upToIds";
157
+ }
158
+ return null;
159
+ }
160
+ /** id == hash(body) and (for grants) subject.fp == fingerprint(subject.pub). */
161
+ export async function checkIntegrity(doc) {
162
+ if ((await contentId(bodyOf(doc))) !== doc.id)
163
+ return "id mismatch";
164
+ if (doc.t === "grant" &&
165
+ (await keyFingerprint(doc.subject.pub)) !== doc.subject.fp)
166
+ return "subject fp mismatch";
167
+ return null;
168
+ }
169
+ export const verifyDocSignature = (doc, issuerPub) => verifyCanonical(issuerPub, bodyOf(doc), doc.sig);
170
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/web/trust/docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { canonicalBytes, canonicalJson, contentId, sha256B64u, } from "./canonical.js";
2
+ export type { GrantInput, IssueContext, RevocationInput } from "./docs.js";
3
+ export { bodyOf, checkGrantShape, checkIntegrity, checkRevocationShape, issueGrant, issueRevocation, rolePreset, verifyDocSignature, } from "./docs.js";
4
+ export type { SigAlg, Signer } from "./keys.js";
5
+ export { createSigner, generateSigner, isPublicKey, isSignature, keyFingerprint, PUBLIC_KEY_BYTES, SIG_ALG, SIGNATURE_BYTES, signBytes, signCanonical, verifyBytes, verifyCanonical, } from "./keys.js";
6
+ export type { Anchor, TrustStoreOptions } from "./store.js";
7
+ export { createTrustStore, TrustStore } from "./store.js";
8
+ export type { AddResult, AddStatus, At, Decision, DenyReason, DeviceRef, Grant, GrantBody, Level, Permissions, Revocation, RevocationBody, RolePreset, TrustDoc, TrustSchema, } from "./types.js";
9
+ export { isLevel, LEVELS, levelRank } from "./types.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/web/trust/index.ts"],"names":[],"mappings":"AACA,OAAO,EACN,cAAc,EACd,aAAa,EACb,SAAS,EACT,UAAU,GACV,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EACN,MAAM,EACN,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,UAAU,EACV,kBAAkB,GAClB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EACN,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,eAAe,EACf,SAAS,EACT,aAAa,EACb,WAAW,EACX,eAAe,GACf,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1D,YAAY,EACX,SAAS,EACT,SAAS,EACT,EAAE,EACF,QAAQ,EACR,UAAU,EACV,SAAS,EACT,KAAK,EACL,SAAS,EACT,KAAK,EACL,WAAW,EACX,UAAU,EACV,cAAc,EACd,UAAU,EACV,QAAQ,EACR,WAAW,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ // @iberi22/edge-mesh/web/trust — signed capabilities (grants/revocations) chained to a root key.
2
+ export { canonicalBytes, canonicalJson, contentId, sha256B64u, } from "./canonical.js";
3
+ export { bodyOf, checkGrantShape, checkIntegrity, checkRevocationShape, issueGrant, issueRevocation, rolePreset, verifyDocSignature, } from "./docs.js";
4
+ export { createSigner, generateSigner, isPublicKey, isSignature, keyFingerprint, PUBLIC_KEY_BYTES, SIG_ALG, SIGNATURE_BYTES, signBytes, signCanonical, verifyBytes, verifyCanonical, } from "./keys.js";
5
+ export { createTrustStore, TrustStore } from "./store.js";
6
+ export { isLevel, LEVELS, levelRank } from "./types.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/trust/index.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,OAAO,EACN,cAAc,EACd,aAAa,EACb,SAAS,EACT,UAAU,GACV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACN,MAAM,EACN,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,UAAU,EACV,kBAAkB,GAClB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACN,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,eAAe,EACf,SAAS,EACT,aAAa,EACb,WAAW,EACX,eAAe,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkB1D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,37 @@
1
+ export declare const SIG_ALG: "ML-DSA-65";
2
+ export type SigAlg = typeof SIG_ALG;
3
+ export declare const PUBLIC_KEY_BYTES = 1952;
4
+ export declare const SECRET_KEY_BYTES = 4032;
5
+ export declare const SIGNATURE_BYTES = 3309;
6
+ /** A base64url ML-DSA-65 public key (exactly 1952 bytes). */
7
+ export declare function isPublicKey(pub: unknown): pub is string;
8
+ /** R5-B3: a base64url ML-DSA-65 signature in its one canonical encoding (exactly 3309 bytes). */
9
+ export declare function isSignature(sig: unknown): sig is string;
10
+ /** Stable key id: base64url(SHA-256(canonicalJson({ alg: "ML-DSA-65", pub }))). */
11
+ export declare function keyFingerprint(pub: string): Promise<string>;
12
+ /** Something that signs with a device (or root) key. */
13
+ export interface Signer {
14
+ readonly alg: SigAlg;
15
+ /** fingerprint of `pub` */
16
+ readonly fp: string;
17
+ /** base64url ML-DSA-65 public key */
18
+ readonly pub: string;
19
+ sign(data: Uint8Array): Promise<Uint8Array>;
20
+ }
21
+ /** Wrap an ML-DSA-65 key pair. The secret key stays with the caller (keep it in the device's vault). */
22
+ export declare function createSigner(keys: {
23
+ secretKey: Uint8Array;
24
+ publicKey: Uint8Array;
25
+ }): Promise<Signer>;
26
+ /** New ML-DSA-65 device key (keep `secretKey` in the device's vault). */
27
+ export declare function generateSigner(): Promise<Signer & {
28
+ secretKey: Uint8Array;
29
+ publicKey: Uint8Array;
30
+ }>;
31
+ export declare function signBytes(signer: Signer, data: Uint8Array): Promise<string>;
32
+ /** Never throws: malformed key / signature or another algorithm's key => false. */
33
+ export declare function verifyBytes(pub: string, data: Uint8Array, sigB64u: string): Promise<boolean>;
34
+ /** Sign canonicalJson(value) with ML-DSA-65 (shared contract with apps such as Fize). */
35
+ export declare const signCanonical: (signer: Signer, value: unknown) => Promise<string>;
36
+ export declare const verifyCanonical: (pub: string, value: unknown, sig: string) => Promise<boolean>;
37
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/web/trust/keys.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,OAAO,EAAG,WAAoB,CAAC;AAC5C,MAAM,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC;AACpC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,eAAe,OAAO,CAAC;AAcpC,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAEvD;AAED,iGAAiG;AACjG,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAEvD;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3D;AAED,wDAAwD;AACxD,MAAM,WAAW,MAAM;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5C;AAED,wGAAwG;AACxG,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACxC,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CAclB;AAED,yEAAyE;AACzE,wBAAsB,cAAc,IAAI,OAAO,CAC9C,MAAM,GAAG;IAAE,SAAS,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAE,CACzD,CAGA;AAED,wBAAsB,SAAS,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,GACd,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,mFAAmF;AACnF,wBAAsB,WAAW,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CASlB;AAED,yFAAyF;AACzF,eAAO,MAAM,aAAa,WACjB,MAAM,SACP,OAAO,KACZ,OAAO,CAAC,MAAM,CAA6C,CAAC;AAE/D,eAAO,MAAM,eAAe,QACtB,MAAM,SACJ,OAAO,OACT,MAAM,KACT,OAAO,CAAC,OAAO,CAAiD,CAAC"}
@@ -0,0 +1,75 @@
1
+ // Device / root signing keys: ML-DSA-65 (FIPS 204, `@noble/post-quantum`), as required by AGENTS.md (post-quantum
2
+ // identity signatures; no ECDSA fallback for security payloads). Public keys travel as base64url of the raw 1952-byte
3
+ // key; signatures as base64url of the raw 3309-byte signature; the fingerprint is
4
+ // base64url(SHA-256(canonicalJson({ alg: "ML-DSA-65", pub }))) so a future algorithm can never collide with this one.
5
+ // `canonicalJson` itself is unchanged (Fize shares it).
6
+ import { ml_dsa65 } from "@noble/post-quantum/ml-dsa.js";
7
+ import { b64uDecode, b64uEncode, isCanonicalB64u } from "../util.js";
8
+ import { canonicalBytes, sha256B64u } from "./canonical.js";
9
+ export const SIG_ALG = "ML-DSA-65";
10
+ export const PUBLIC_KEY_BYTES = 1952;
11
+ export const SECRET_KEY_BYTES = 4032;
12
+ export const SIGNATURE_BYTES = 3309;
13
+ const decodeLen = (s, n) => {
14
+ // R4-N3: only the canonical encoding, so one key has one fingerprint (keyFingerprint hashes the string)
15
+ if (typeof s !== "string" || s.length > 2 * n || !isCanonicalB64u(s))
16
+ return null;
17
+ try {
18
+ const b = b64uDecode(s);
19
+ return b.length === n ? b : null;
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ };
25
+ /** A base64url ML-DSA-65 public key (exactly 1952 bytes). */
26
+ export function isPublicKey(pub) {
27
+ return decodeLen(pub, PUBLIC_KEY_BYTES) !== null;
28
+ }
29
+ /** R5-B3: a base64url ML-DSA-65 signature in its one canonical encoding (exactly 3309 bytes). */
30
+ export function isSignature(sig) {
31
+ return decodeLen(sig, SIGNATURE_BYTES) !== null;
32
+ }
33
+ /** Stable key id: base64url(SHA-256(canonicalJson({ alg: "ML-DSA-65", pub }))). */
34
+ export function keyFingerprint(pub) {
35
+ return sha256B64u(canonicalBytes({ alg: SIG_ALG, pub }));
36
+ }
37
+ /** Wrap an ML-DSA-65 key pair. The secret key stays with the caller (keep it in the device's vault). */
38
+ export async function createSigner(keys) {
39
+ if (keys.publicKey.length !== PUBLIC_KEY_BYTES ||
40
+ keys.secretKey.length !== SECRET_KEY_BYTES)
41
+ throw new Error("not an ML-DSA-65 key pair");
42
+ const pub = b64uEncode(keys.publicKey);
43
+ const sk = keys.secretKey;
44
+ return {
45
+ alg: SIG_ALG,
46
+ fp: await keyFingerprint(pub),
47
+ pub,
48
+ sign: async (data) => ml_dsa65.sign(data, sk),
49
+ };
50
+ }
51
+ /** New ML-DSA-65 device key (keep `secretKey` in the device's vault). */
52
+ export async function generateSigner() {
53
+ const kp = ml_dsa65.keygen();
54
+ return Object.assign(await createSigner(kp), kp);
55
+ }
56
+ export async function signBytes(signer, data) {
57
+ return b64uEncode(await signer.sign(data));
58
+ }
59
+ /** Never throws: malformed key / signature or another algorithm's key => false. */
60
+ export async function verifyBytes(pub, data, sigB64u) {
61
+ const pk = decodeLen(pub, PUBLIC_KEY_BYTES);
62
+ const sig = decodeLen(sigB64u, SIGNATURE_BYTES);
63
+ if (!pk || !sig)
64
+ return false;
65
+ try {
66
+ return ml_dsa65.verify(sig, data, pk);
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ }
72
+ /** Sign canonicalJson(value) with ML-DSA-65 (shared contract with apps such as Fize). */
73
+ export const signCanonical = (signer, value) => signBytes(signer, canonicalBytes(value));
74
+ export const verifyCanonical = (pub, value, sig) => verifyBytes(pub, canonicalBytes(value), sig);
75
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/web/trust/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ import type { RevocationInput } from "./docs.js";
2
+ import { type AddResult, type At, type Decision, type Grant, type Level, type Permissions, type Revocation, type TrustDoc, type TrustSchema } from "./types.js";
3
+ export interface TrustStoreOptions {
4
+ inst: string;
5
+ /** Root public key (restaurant / tenant key). Only grants chaining to it are trusted. */
6
+ root: string;
7
+ /** Optional cross-check: must equal keyFingerprint(root). */
8
+ rootFingerprint?: string;
9
+ schema: TrustSchema;
10
+ /** clock used only when `At.time` is omitted (UI checks) and to expire parked documents. Default Date.now */
11
+ now?: () => number;
12
+ /** max documents waiting for a parent, every issuer together. Default 1000 */
13
+ maxPending?: number;
14
+ /**
15
+ * R6-S2: max documents waiting for a parent that ONE issuer may hold at once (the peer that sent them), so a single
16
+ * member cannot take the whole waiting set and turn away documents that are waiting for a parent of their own.
17
+ * Default 32.
18
+ */
19
+ maxPendingPerIssuer?: number;
20
+ /**
21
+ * R6-S2b: max documents waiting for a parent that ONE SENDING PEER may hold at once. The per-issuer cap counts
22
+ * issuers, so it is worn off by signing with fresh random keys: one member then parks an unlimited number of
23
+ * documents, each under an issuer of its own, and fills the waiting set again. Counting senders closes that.
24
+ * `from` is the transport-level id of the peer that sent the documents (undefined for local/own documents, which
25
+ * are not charged to anybody). Default 32.
26
+ */
27
+ maxPendingPerSender?: number;
28
+ /**
29
+ * R6-S2: how long a parked document waits for its parent before it is dropped (its slots are then reclaimed). It
30
+ * bounds what a document that arrives before its parent can hold: without it, orphans waiting for a parent that
31
+ * never comes keep their slots for good. Default 10 minutes.
32
+ */
33
+ pendingTtlMs?: number;
34
+ }
35
+ export declare function createTrustStore(opts: TrustStoreOptions): Promise<TrustStore>;
36
+ /** Who is offering these documents: R6-S2b charges the waiting slots they take to the peer that sent them. */
37
+ export interface IngestOpts {
38
+ /** transport-level id of the sending peer; undefined for local/own documents (no per-sender quota). */
39
+ from?: string;
40
+ }
41
+ /** "The op of this subject at `seq` is `id`" (from an effective revocation): its earlier ops must chain to it. */
42
+ export interface Anchor {
43
+ seq: number;
44
+ id: string;
45
+ }
46
+ export declare class TrustStore {
47
+ readonly inst: string;
48
+ readonly rootFp: string;
49
+ readonly schema: TrustSchema;
50
+ readonly maxDepth: number;
51
+ private readonly root;
52
+ private readonly now;
53
+ private readonly maxPending;
54
+ private readonly maxPendingPerIssuer;
55
+ private readonly maxPendingPerSender;
56
+ private readonly pendingTtlMs;
57
+ private readonly grants;
58
+ private readonly depth;
59
+ private readonly revs;
60
+ private readonly pending;
61
+ private pendingCount;
62
+ /** R6-S2: parked documents per issuer, so no single peer can take the whole waiting set. */
63
+ private readonly waitingByIssuer;
64
+ /** R6-S2b: parked documents per SENDING PEER, so fresh random issuers cannot buy more room. */
65
+ private readonly waitingBySender;
66
+ /** R6-S2: last instant the waiting set was swept for expired documents (see `expireWaiting`). */
67
+ private lastSweepAt;
68
+ private readonly rejected;
69
+ private readonly listeners;
70
+ private derived;
71
+ private queue;
72
+ /** increments on every accepted document */
73
+ version: number;
74
+ constructor(opts: TrustStoreOptions, rootFp: string);
75
+ add(doc: unknown, opts?: IngestOpts): Promise<AddResult>;
76
+ /**
77
+ * Ingest documents (serialized). Listeners fire once if anything was accepted.
78
+ * `opts.from` is the transport-level id of the peer that sent them: it is charged the waiting slots they take
79
+ * (R6-S2b) and left undefined for local/own documents, which no sender can be blamed for.
80
+ */
81
+ addMany(docs: readonly unknown[], opts?: IngestOpts): Promise<AddResult[]>;
82
+ private reject;
83
+ private ingest;
84
+ private verifyAndStore;
85
+ /** A parent was rejected for a body-determined reason: its waiting descendants can never be valid. */
86
+ private rejectWaiting;
87
+ /**
88
+ * R6-S4: forget accepted documents (`ids`) so a per-issuer cap can be applied as a rule on the SET held instead
89
+ * of on the arrival order (web/secstate keeps the cap-N smallest ids of each bucket and evicts the rest).
90
+ * Documents are still only ever ADDED from the network: nothing here reads the wire, and the only caller is the
91
+ * cap enforcement, which evicts one document per accepted one, so the store never loses ground.
92
+ * Returns the ids that were actually dropped.
93
+ */
94
+ dropAccepted(ids: readonly string[]): string[];
95
+ private park;
96
+ /**
97
+ * R6-S2: drop every parked document that has been waiting longer than the TTL. Its parent may still arrive later
98
+ * (the document is not remembered as bad, so it is asked for again), but the slot it held is reclaimed now.
99
+ */
100
+ private expireWaiting;
101
+ /** Give back the global, per-issuer and per-sender (R6-S2b) waiting slots of a document that leaves the waiting set. */
102
+ private releaseWaiting;
103
+ /** Delegation rules of a grant w.r.t. its (accepted) issuer grant; undefined parent = root-issued. */
104
+ private checkDelegation;
105
+ private d;
106
+ /** May `fp` do `level` in `module` for an op at (seq, time)? Synchronous: uses only accepted documents. */
107
+ can(fp: string, module: string, level: Level, at?: At): boolean;
108
+ explain(fp: string, module: string, level: Level, at?: At): Decision;
109
+ /** null if grant `g` is in force at `at` (ignoring module/level). */
110
+ private grantDenial;
111
+ /** Grants of `fp` in force at `at`. */
112
+ activeGrants(fp: string, at?: At): Grant[];
113
+ /** Has at least one grant in force (e.g. provider `authorizeDevice`). */
114
+ isMember(fp: string, at?: At): boolean;
115
+ /** Union (max level per module) of the grants in force. */
116
+ effectivePermissions(fp: string, at?: At): Permissions;
117
+ /** Public signing key of a device with any accepted grant (also revoked ones: old ops still verify). */
118
+ keyOf(fp: string): string | undefined;
119
+ grantsOf(fp: string): Grant[];
120
+ getGrant(id: string): Grant | undefined;
121
+ /** S3: anchors of a subject (from effective revocations), highest seq first. */
122
+ anchorsOf(fp: string): Anchor[];
123
+ /** Effective seq cut-off of a grant (Infinity = not revoked). */
124
+ cutOf(grantId: string): number;
125
+ /** Chain length root -> grant (1 = issued by the root). */
126
+ depthOf(grantId: string): number | undefined;
127
+ /** Grants issued (transitively) under `grantId`. */
128
+ descendants(grantId: string): Grant[];
129
+ /** Would a revocation of `targetId` signed by `fp` (with grant `parentId`, or as root) be effective? */
130
+ canRevoke(fp: string, targetId: string, parentId?: string): boolean;
131
+ /**
132
+ * Build the revocation input for `targetId` with cut-offs taken from the revoker's log heads
133
+ * (`heads[fp]` = last seq the revoker has seen from that device, or `{ seq, id }` from `OpLog.headIds()` to also
134
+ * anchor the history, S3), including every cascaded grant (by grant id).
135
+ */
136
+ prepareRevocation(targetId: string, heads: Readonly<Record<string, number | {
137
+ seq: number;
138
+ id: string;
139
+ }>>, reason?: string): RevocationInput;
140
+ /** Every accepted document (replicate / persist these; re-`addMany` them on boot). */
141
+ docs(): TrustDoc[];
142
+ revocations(): Revocation[];
143
+ /** Reason a document id was rejected for a body-determined cause (bounded memory; bad signatures are not kept). */
144
+ rejection(id: string): string | undefined;
145
+ pendingIds(): string[];
146
+ /** Called after documents are accepted (e.g. web/oplog re-evaluates quarantined/pending ops). */
147
+ onChange(cb: () => void): () => void;
148
+ private emit;
149
+ }
150
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/web/trust/store.ts"],"names":[],"mappings":"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"}