@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.
- package/LICENSE +128 -0
- package/NOTICE +37 -0
- package/README.md +470 -2
- package/dist/adapters/gpu-agent/index.d.ts +61 -0
- package/dist/adapters/gpu-agent/index.d.ts.map +1 -0
- package/dist/adapters/gpu-agent/index.js +364 -0
- package/dist/adapters/gpu-agent/index.js.map +1 -0
- package/dist/adapters/maloca-salud/citas-distribuidas.d.ts +19 -0
- package/dist/adapters/maloca-salud/citas-distribuidas.d.ts.map +1 -0
- package/dist/adapters/maloca-salud/citas-distribuidas.js +51 -0
- package/dist/adapters/maloca-salud/citas-distribuidas.js.map +1 -0
- package/dist/adapters/maloca-salud/eps-bridge.d.ts +15 -0
- package/dist/adapters/maloca-salud/eps-bridge.d.ts.map +1 -0
- package/dist/adapters/maloca-salud/eps-bridge.js +27 -0
- package/dist/adapters/maloca-salud/eps-bridge.js.map +1 -0
- package/dist/adapters/maloca-salud/patient-profile.d.ts +20 -0
- package/dist/adapters/maloca-salud/patient-profile.d.ts.map +1 -0
- package/dist/adapters/maloca-salud/patient-profile.js +36 -0
- package/dist/adapters/maloca-salud/patient-profile.js.map +1 -0
- package/dist/adapters/maloca-salud/types.d.ts +40 -0
- package/dist/adapters/maloca-salud/types.d.ts.map +1 -0
- package/dist/adapters/maloca-salud/types.js +2 -0
- package/dist/adapters/maloca-salud/types.js.map +1 -0
- package/dist/adapters/maloca-veeduria/contract-bridge.d.ts +31 -0
- package/dist/adapters/maloca-veeduria/contract-bridge.d.ts.map +1 -0
- package/dist/adapters/maloca-veeduria/contract-bridge.js +103 -0
- package/dist/adapters/maloca-veeduria/contract-bridge.js.map +1 -0
- package/dist/adapters/maloca-veeduria/evidentia-veeduria.d.ts +14 -0
- package/dist/adapters/maloca-veeduria/evidentia-veeduria.d.ts.map +1 -0
- package/dist/adapters/maloca-veeduria/evidentia-veeduria.js +40 -0
- package/dist/adapters/maloca-veeduria/evidentia-veeduria.js.map +1 -0
- package/dist/adapters/maloca-veeduria/licitante-profile.d.ts +21 -0
- package/dist/adapters/maloca-veeduria/licitante-profile.d.ts.map +1 -0
- package/dist/adapters/maloca-veeduria/licitante-profile.js +58 -0
- package/dist/adapters/maloca-veeduria/licitante-profile.js.map +1 -0
- package/dist/adapters/maloca-veeduria/types.d.ts +30 -0
- package/dist/adapters/maloca-veeduria/types.d.ts.map +1 -0
- package/dist/adapters/maloca-veeduria/types.js +2 -0
- package/dist/adapters/maloca-veeduria/types.js.map +1 -0
- package/dist/adapters/maloca-xavier/agent-profile.d.ts +32 -0
- package/dist/adapters/maloca-xavier/agent-profile.d.ts.map +1 -0
- package/dist/adapters/maloca-xavier/agent-profile.js +56 -0
- package/dist/adapters/maloca-xavier/agent-profile.js.map +1 -0
- package/dist/adapters/maloca-xavier/codegraph-bridge.d.ts +27 -0
- package/dist/adapters/maloca-xavier/codegraph-bridge.d.ts.map +1 -0
- package/dist/adapters/maloca-xavier/codegraph-bridge.js +58 -0
- package/dist/adapters/maloca-xavier/codegraph-bridge.js.map +1 -0
- package/dist/adapters/maloca-xavier/llm-router.d.ts +25 -0
- package/dist/adapters/maloca-xavier/llm-router.d.ts.map +1 -0
- package/dist/adapters/maloca-xavier/llm-router.js +58 -0
- package/dist/adapters/maloca-xavier/llm-router.js.map +1 -0
- package/dist/authz/index.d.ts +81 -0
- package/dist/authz/index.d.ts.map +1 -0
- package/dist/authz/index.js +271 -0
- package/dist/authz/index.js.map +1 -0
- package/dist/chat/index.d.ts +138 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +394 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/offline-queue.d.ts +32 -0
- package/dist/chat/offline-queue.d.ts.map +1 -0
- package/dist/chat/offline-queue.js +93 -0
- package/dist/chat/offline-queue.js.map +1 -0
- package/dist/core/DefaultEdgeMeshNode.d.ts +17 -0
- package/dist/core/DefaultEdgeMeshNode.d.ts.map +1 -0
- package/dist/core/DefaultEdgeMeshNode.js +57 -0
- package/dist/core/DefaultEdgeMeshNode.js.map +1 -0
- package/dist/core/node.d.ts +26 -0
- package/dist/core/node.d.ts.map +1 -0
- package/dist/core/node.js +16 -0
- package/dist/core/node.js.map +1 -0
- package/dist/edge-mesh.d.ts +139 -0
- package/dist/edge-mesh.d.ts.map +1 -0
- package/dist/edge-mesh.js +1146 -0
- package/dist/edge-mesh.js.map +1 -0
- package/dist/gos/GosBridge.d.ts +49 -0
- package/dist/gos/GosBridge.d.ts.map +1 -0
- package/dist/gos/GosBridge.js +133 -0
- package/dist/gos/GosBridge.js.map +1 -0
- package/dist/governance/authority.d.ts +44 -0
- package/dist/governance/authority.d.ts.map +1 -0
- package/dist/governance/authority.js +123 -0
- package/dist/governance/authority.js.map +1 -0
- package/dist/governance/index.d.ts +66 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/index.js +210 -0
- package/dist/governance/index.js.map +1 -0
- package/dist/governance/merge.d.ts +31 -0
- package/dist/governance/merge.d.ts.map +1 -0
- package/dist/governance/merge.js +167 -0
- package/dist/governance/merge.js.map +1 -0
- package/dist/identity/index.d.ts +199 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +415 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/maloca/backoffice.d.ts +31 -0
- package/dist/maloca/backoffice.d.ts.map +1 -0
- package/dist/maloca/backoffice.js +40 -0
- package/dist/maloca/backoffice.js.map +1 -0
- package/dist/maloca/event-bus.d.ts +60 -0
- package/dist/maloca/event-bus.d.ts.map +1 -0
- package/dist/maloca/event-bus.js +175 -0
- package/dist/maloca/event-bus.js.map +1 -0
- package/dist/maloca/evidentia.d.ts +136 -0
- package/dist/maloca/evidentia.d.ts.map +1 -0
- package/dist/maloca/evidentia.js +447 -0
- package/dist/maloca/evidentia.js.map +1 -0
- package/dist/maloca/gateway/api.d.ts +146 -0
- package/dist/maloca/gateway/api.d.ts.map +1 -0
- package/dist/maloca/gateway/api.js +228 -0
- package/dist/maloca/gateway/api.js.map +1 -0
- package/dist/maloca/gateway/auth.d.ts +20 -0
- package/dist/maloca/gateway/auth.d.ts.map +1 -0
- package/dist/maloca/gateway/auth.js +115 -0
- package/dist/maloca/gateway/auth.js.map +1 -0
- package/dist/maloca/gateway/dashboard.d.ts +42 -0
- package/dist/maloca/gateway/dashboard.d.ts.map +1 -0
- package/dist/maloca/gateway/dashboard.js +67 -0
- package/dist/maloca/gateway/dashboard.js.map +1 -0
- package/dist/maloca/gateway/websocket.d.ts +34 -0
- package/dist/maloca/gateway/websocket.d.ts.map +1 -0
- package/dist/maloca/gateway/websocket.js +71 -0
- package/dist/maloca/gateway/websocket.js.map +1 -0
- package/dist/maloca/karma.d.ts +165 -0
- package/dist/maloca/karma.d.ts.map +1 -0
- package/dist/maloca/karma.js +307 -0
- package/dist/maloca/karma.js.map +1 -0
- package/dist/maloca/kernel.d.ts +20 -0
- package/dist/maloca/kernel.d.ts.map +1 -0
- package/dist/maloca/kernel.js +76 -0
- package/dist/maloca/kernel.js.map +1 -0
- package/dist/maloca/metadata.d.ts +30 -0
- package/dist/maloca/metadata.d.ts.map +1 -0
- package/dist/maloca/metadata.js +80 -0
- package/dist/maloca/metadata.js.map +1 -0
- package/dist/maloca/perfil.d.ts +57 -0
- package/dist/maloca/perfil.d.ts.map +1 -0
- package/dist/maloca/perfil.js +113 -0
- package/dist/maloca/perfil.js.map +1 -0
- package/dist/maloca/plugin-registry.d.ts +27 -0
- package/dist/maloca/plugin-registry.d.ts.map +1 -0
- package/dist/maloca/plugin-registry.js +76 -0
- package/dist/maloca/plugin-registry.js.map +1 -0
- package/dist/maloca/polygon-bridge.d.ts +63 -0
- package/dist/maloca/polygon-bridge.d.ts.map +1 -0
- package/dist/maloca/polygon-bridge.js +198 -0
- package/dist/maloca/polygon-bridge.js.map +1 -0
- package/dist/maloca/types.d.ts +44 -0
- package/dist/maloca/types.d.ts.map +1 -0
- package/dist/maloca/types.js +2 -0
- package/dist/maloca/types.js.map +1 -0
- package/dist/medico/aval.d.ts +149 -0
- package/dist/medico/aval.d.ts.map +1 -0
- package/dist/medico/aval.js +281 -0
- package/dist/medico/aval.js.map +1 -0
- package/dist/medico/canonica.d.ts +96 -0
- package/dist/medico/canonica.d.ts.map +1 -0
- package/dist/medico/canonica.js +148 -0
- package/dist/medico/canonica.js.map +1 -0
- package/dist/medico/credencial.d.ts +160 -0
- package/dist/medico/credencial.d.ts.map +1 -0
- package/dist/medico/credencial.js +240 -0
- package/dist/medico/credencial.js.map +1 -0
- package/dist/medico/index.d.ts +36 -0
- package/dist/medico/index.d.ts.map +1 -0
- package/dist/medico/index.js +39 -0
- package/dist/medico/index.js.map +1 -0
- package/dist/medico/malla.d.ts +218 -0
- package/dist/medico/malla.d.ts.map +1 -0
- package/dist/medico/malla.js +347 -0
- package/dist/medico/malla.js.map +1 -0
- package/dist/medico/registro-profesional.d.ts +84 -0
- package/dist/medico/registro-profesional.d.ts.map +1 -0
- package/dist/medico/registro-profesional.js +135 -0
- package/dist/medico/registro-profesional.js.map +1 -0
- package/dist/medico/registro.d.ts +149 -0
- package/dist/medico/registro.d.ts.map +1 -0
- package/dist/medico/registro.js +173 -0
- package/dist/medico/registro.js.map +1 -0
- package/dist/medico/types.d.ts +287 -0
- package/dist/medico/types.d.ts.map +1 -0
- package/dist/medico/types.js +135 -0
- package/dist/medico/types.js.map +1 -0
- package/dist/medico/verificacion-registro.d.ts +300 -0
- package/dist/medico/verificacion-registro.d.ts.map +1 -0
- package/dist/medico/verificacion-registro.js +319 -0
- package/dist/medico/verificacion-registro.js.map +1 -0
- package/dist/mesh/index.d.ts +457 -0
- package/dist/mesh/index.d.ts.map +1 -0
- package/dist/mesh/index.js +929 -0
- package/dist/mesh/index.js.map +1 -0
- package/dist/namespaces/encrypted-plugin.d.ts +56 -0
- package/dist/namespaces/encrypted-plugin.d.ts.map +1 -0
- package/dist/namespaces/encrypted-plugin.js +173 -0
- package/dist/namespaces/encrypted-plugin.js.map +1 -0
- package/dist/namespaces/index.d.ts +52 -0
- package/dist/namespaces/index.d.ts.map +1 -0
- package/dist/namespaces/index.js +134 -0
- package/dist/namespaces/index.js.map +1 -0
- package/dist/namespaces/ivn-proofs.d.ts +54 -0
- package/dist/namespaces/ivn-proofs.d.ts.map +1 -0
- package/dist/namespaces/ivn-proofs.js +162 -0
- package/dist/namespaces/ivn-proofs.js.map +1 -0
- package/dist/namespaces/offers-gossip.d.ts +95 -0
- package/dist/namespaces/offers-gossip.d.ts.map +1 -0
- package/dist/namespaces/offers-gossip.js +213 -0
- package/dist/namespaces/offers-gossip.js.map +1 -0
- package/dist/node-memory/idb-store.d.ts +22 -0
- package/dist/node-memory/idb-store.d.ts.map +1 -0
- package/dist/node-memory/idb-store.js +154 -0
- package/dist/node-memory/idb-store.js.map +1 -0
- package/dist/node-memory/index.d.ts +14 -0
- package/dist/node-memory/index.d.ts.map +1 -0
- package/dist/node-memory/index.js +159 -0
- package/dist/node-memory/index.js.map +1 -0
- package/dist/node-memory/sync-flush.d.ts +11 -0
- package/dist/node-memory/sync-flush.d.ts.map +1 -0
- package/dist/node-memory/sync-flush.js +37 -0
- package/dist/node-memory/sync-flush.js.map +1 -0
- package/dist/node-memory/types.d.ts +34 -0
- package/dist/node-memory/types.d.ts.map +1 -0
- package/dist/node-memory/types.js +2 -0
- package/dist/node-memory/types.js.map +1 -0
- package/dist/node-memory/xavier-store.d.ts +12 -0
- package/dist/node-memory/xavier-store.d.ts.map +1 -0
- package/dist/node-memory/xavier-store.js +75 -0
- package/dist/node-memory/xavier-store.js.map +1 -0
- package/dist/op-log/index.d.ts +49 -0
- package/dist/op-log/index.d.ts.map +1 -0
- package/dist/op-log/index.js +190 -0
- package/dist/op-log/index.js.map +1 -0
- package/dist/presence/health.d.ts +54 -0
- package/dist/presence/health.d.ts.map +1 -0
- package/dist/presence/health.js +139 -0
- package/dist/presence/health.js.map +1 -0
- package/dist/presence/index.d.ts +85 -0
- package/dist/presence/index.d.ts.map +1 -0
- package/dist/presence/index.js +255 -0
- package/dist/presence/index.js.map +1 -0
- package/dist/presence/peer-health.d.ts +40 -0
- package/dist/presence/peer-health.d.ts.map +1 -0
- package/dist/presence/peer-health.js +118 -0
- package/dist/presence/peer-health.js.map +1 -0
- package/dist/protocol/canonical.d.ts +10 -0
- package/dist/protocol/canonical.d.ts.map +1 -0
- package/dist/protocol/canonical.js +32 -0
- package/dist/protocol/canonical.js.map +1 -0
- package/dist/protocol/crypto.d.ts +299 -0
- package/dist/protocol/crypto.d.ts.map +1 -0
- package/dist/protocol/crypto.js +739 -0
- package/dist/protocol/crypto.js.map +1 -0
- package/dist/protocol/index.d.ts +30 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +116 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/utils.d.ts +5 -0
- package/dist/protocol/utils.d.ts.map +1 -0
- package/dist/protocol/utils.js +27 -0
- package/dist/protocol/utils.js.map +1 -0
- package/dist/salones/manager.d.ts +100 -0
- package/dist/salones/manager.d.ts.map +1 -0
- package/dist/salones/manager.js +240 -0
- package/dist/salones/manager.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +13 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +32 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/snapshot/index.d.ts +90 -0
- package/dist/snapshot/index.d.ts.map +1 -0
- package/dist/snapshot/index.js +189 -0
- package/dist/snapshot/index.js.map +1 -0
- package/dist/storage/index.d.ts +49 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +176 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/optimizer.d.ts +28 -0
- package/dist/storage/optimizer.d.ts.map +1 -0
- package/dist/storage/optimizer.js +50 -0
- package/dist/storage/optimizer.js.map +1 -0
- package/dist/storage/ydoc-persistence.d.ts +27 -0
- package/dist/storage/ydoc-persistence.d.ts.map +1 -0
- package/dist/storage/ydoc-persistence.js +128 -0
- package/dist/storage/ydoc-persistence.js.map +1 -0
- package/dist/sync/ChunkSyncManager.d.ts +41 -0
- package/dist/sync/ChunkSyncManager.d.ts.map +1 -0
- package/dist/sync/ChunkSyncManager.js +115 -0
- package/dist/sync/ChunkSyncManager.js.map +1 -0
- package/dist/sync/conflict-resolver.d.ts +33 -0
- package/dist/sync/conflict-resolver.d.ts.map +1 -0
- package/dist/sync/conflict-resolver.js +54 -0
- package/dist/sync/conflict-resolver.js.map +1 -0
- package/dist/sync/engine.d.ts +168 -0
- package/dist/sync/engine.d.ts.map +1 -0
- package/dist/sync/engine.js +315 -0
- package/dist/sync/engine.js.map +1 -0
- package/dist/sync/index.d.ts +3 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +3 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/transport/TorTransportAdapter.d.ts +70 -0
- package/dist/transport/TorTransportAdapter.d.ts.map +1 -0
- package/dist/transport/TorTransportAdapter.js +192 -0
- package/dist/transport/TorTransportAdapter.js.map +1 -0
- package/dist/transport/memory.d.ts +31 -0
- package/dist/transport/memory.d.ts.map +1 -0
- package/dist/transport/memory.js +114 -0
- package/dist/transport/memory.js.map +1 -0
- package/dist/transport/peerjs.d.ts +45 -0
- package/dist/transport/peerjs.d.ts.map +1 -0
- package/dist/transport/peerjs.js +301 -0
- package/dist/transport/peerjs.js.map +1 -0
- package/dist/transport/pqc-handshake.d.ts +72 -0
- package/dist/transport/pqc-handshake.d.ts.map +1 -0
- package/dist/transport/pqc-handshake.js +129 -0
- package/dist/transport/pqc-handshake.js.map +1 -0
- package/dist/transport/relay-config.d.ts +11 -0
- package/dist/transport/relay-config.d.ts.map +1 -0
- package/dist/transport/relay-config.js +48 -0
- package/dist/transport/relay-config.js.map +1 -0
- package/dist/transport/relay-server.d.ts +37 -0
- package/dist/transport/relay-server.d.ts.map +1 -0
- package/dist/transport/relay-server.js +230 -0
- package/dist/transport/relay-server.js.map +1 -0
- package/dist/transport/tor.d.ts +47 -0
- package/dist/transport/tor.d.ts.map +1 -0
- package/dist/transport/tor.js +158 -0
- package/dist/transport/tor.js.map +1 -0
- package/dist/transport/types.d.ts +34 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +2 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/types/index.d.ts +293 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +73 -0
- package/dist/types/index.js.map +1 -0
- package/dist/web/admission.d.ts +24 -0
- package/dist/web/admission.d.ts.map +1 -0
- package/dist/web/admission.js +41 -0
- package/dist/web/admission.js.map +1 -0
- package/dist/web/crypto.d.ts +18 -0
- package/dist/web/crypto.d.ts.map +1 -0
- package/dist/web/crypto.js +78 -0
- package/dist/web/crypto.js.map +1 -0
- package/dist/web/exchange.d.ts +23 -0
- package/dist/web/exchange.d.ts.map +1 -0
- package/dist/web/exchange.js +54 -0
- package/dist/web/exchange.js.map +1 -0
- package/dist/web/fragment.d.ts +58 -0
- package/dist/web/fragment.d.ts.map +1 -0
- package/dist/web/fragment.js +198 -0
- package/dist/web/fragment.js.map +1 -0
- package/dist/web/index.d.ts +25 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +14 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/merge/index.d.ts +104 -0
- package/dist/web/merge/index.d.ts.map +1 -0
- package/dist/web/merge/index.js +236 -0
- package/dist/web/merge/index.js.map +1 -0
- package/dist/web/oplog/hlc.d.ts +19 -0
- package/dist/web/oplog/hlc.d.ts.map +1 -0
- package/dist/web/oplog/hlc.js +39 -0
- package/dist/web/oplog/hlc.js.map +1 -0
- package/dist/web/oplog/index.d.ts +10 -0
- package/dist/web/oplog/index.d.ts.map +1 -0
- package/dist/web/oplog/index.js +6 -0
- package/dist/web/oplog/index.js.map +1 -0
- package/dist/web/oplog/log.d.ts +182 -0
- package/dist/web/oplog/log.d.ts.map +1 -0
- package/dist/web/oplog/log.js +693 -0
- package/dist/web/oplog/log.js.map +1 -0
- package/dist/web/oplog/store.d.ts +40 -0
- package/dist/web/oplog/store.d.ts.map +1 -0
- package/dist/web/oplog/store.js +85 -0
- package/dist/web/oplog/store.js.map +1 -0
- package/dist/web/oplog/sync.d.ts +54 -0
- package/dist/web/oplog/sync.d.ts.map +1 -0
- package/dist/web/oplog/sync.js +162 -0
- package/dist/web/oplog/sync.js.map +1 -0
- package/dist/web/oplog/types.d.ts +119 -0
- package/dist/web/oplog/types.d.ts.map +1 -0
- package/dist/web/oplog/types.js +2 -0
- package/dist/web/oplog/types.js.map +1 -0
- package/dist/web/pairing.d.ts +186 -0
- package/dist/web/pairing.d.ts.map +1 -0
- package/dist/web/pairing.js +395 -0
- package/dist/web/pairing.js.map +1 -0
- package/dist/web/pq.d.ts +36 -0
- package/dist/web/pq.d.ts.map +1 -0
- package/dist/web/pq.js +59 -0
- package/dist/web/pq.js.map +1 -0
- package/dist/web/provider.d.ts +188 -0
- package/dist/web/provider.d.ts.map +1 -0
- package/dist/web/provider.js +2042 -0
- package/dist/web/provider.js.map +1 -0
- package/dist/web/rooms.d.ts +20 -0
- package/dist/web/rooms.d.ts.map +1 -0
- package/dist/web/rooms.js +51 -0
- package/dist/web/rooms.js.map +1 -0
- package/dist/web/rotation.d.ts +73 -0
- package/dist/web/rotation.d.ts.map +1 -0
- package/dist/web/rotation.js +130 -0
- package/dist/web/rotation.js.map +1 -0
- package/dist/web/secstate.d.ts +213 -0
- package/dist/web/secstate.d.ts.map +1 -0
- package/dist/web/secstate.js +789 -0
- package/dist/web/secstate.js.map +1 -0
- package/dist/web/store.d.ts +9 -0
- package/dist/web/store.d.ts.map +1 -0
- package/dist/web/store.js +32 -0
- package/dist/web/store.js.map +1 -0
- package/dist/web/transports/loopback.d.ts +11 -0
- package/dist/web/transports/loopback.d.ts.map +1 -0
- package/dist/web/transports/loopback.js +97 -0
- package/dist/web/transports/loopback.js.map +1 -0
- package/dist/web/transports/qr-sdp.d.ts +27 -0
- package/dist/web/transports/qr-sdp.d.ts.map +1 -0
- package/dist/web/transports/qr-sdp.js +131 -0
- package/dist/web/transports/qr-sdp.js.map +1 -0
- package/dist/web/transports/ws.d.ts +12 -0
- package/dist/web/transports/ws.d.ts.map +1 -0
- package/dist/web/transports/ws.js +139 -0
- package/dist/web/transports/ws.js.map +1 -0
- package/dist/web/trust/canonical.d.ts +8 -0
- package/dist/web/trust/canonical.d.ts.map +1 -0
- package/dist/web/trust/canonical.js +27 -0
- package/dist/web/trust/canonical.js.map +1 -0
- package/dist/web/trust/docs.d.ts +51 -0
- package/dist/web/trust/docs.d.ts.map +1 -0
- package/dist/web/trust/docs.js +170 -0
- package/dist/web/trust/docs.js.map +1 -0
- package/dist/web/trust/index.d.ts +10 -0
- package/dist/web/trust/index.d.ts.map +1 -0
- package/dist/web/trust/index.js +7 -0
- package/dist/web/trust/index.js.map +1 -0
- package/dist/web/trust/keys.d.ts +37 -0
- package/dist/web/trust/keys.d.ts.map +1 -0
- package/dist/web/trust/keys.js +75 -0
- package/dist/web/trust/keys.js.map +1 -0
- package/dist/web/trust/store.d.ts +150 -0
- package/dist/web/trust/store.d.ts.map +1 -0
- package/dist/web/trust/store.js +587 -0
- package/dist/web/trust/store.js.map +1 -0
- package/dist/web/trust/types.d.ts +134 -0
- package/dist/web/trust/types.d.ts.map +1 -0
- package/dist/web/trust/types.js +4 -0
- package/dist/web/trust/types.js.map +1 -0
- package/dist/web/types.d.ts +115 -0
- package/dist/web/types.d.ts.map +1 -0
- package/dist/web/types.js +2 -0
- package/dist/web/types.js.map +1 -0
- package/dist/web/util.d.ts +12 -0
- package/dist/web/util.d.ts.map +1 -0
- package/dist/web/util.js +54 -0
- package/dist/web/util.js.map +1 -0
- package/dist/web/webrtc.d.ts +35 -0
- package/dist/web/webrtc.d.ts.map +1 -0
- package/dist/web/webrtc.js +304 -0
- package/dist/web/webrtc.js.map +1 -0
- package/package.json +138 -4
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
import { canonicalSerialize } from "../protocol/canonical.js";
|
|
2
|
+
import { bytesAHex, hexABytes } from "../protocol/utils.js";
|
|
3
|
+
/** Serializacion canonica de bytes del cuerpo firmado (mensaje ML-DSA). */
|
|
4
|
+
export function canonicalEvidentiaBytes(cuerpo) {
|
|
5
|
+
return canonicalSerialize({
|
|
6
|
+
version: cuerpo.version,
|
|
7
|
+
tipo: cuerpo.tipo,
|
|
8
|
+
contenidoHash: cuerpo.contenidoHash,
|
|
9
|
+
emisor: cuerpo.emisor,
|
|
10
|
+
timestamp: cuerpo.timestamp,
|
|
11
|
+
procedencia: {
|
|
12
|
+
fechaEmision: cuerpo.procedencia.fechaEmision,
|
|
13
|
+
emisor: cuerpo.procedencia.emisor,
|
|
14
|
+
queRespalda: cuerpo.procedencia.queRespalda,
|
|
15
|
+
descripcionEmisor: cuerpo.procedencia.descripcionEmisor ?? null,
|
|
16
|
+
referencia: cuerpo.procedencia.referencia ?? null,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/** Construye el cuerpo firmado a partir de una Evidentia completa. */
|
|
21
|
+
export function cuerpoFirmado(ev) {
|
|
22
|
+
return {
|
|
23
|
+
version: 1,
|
|
24
|
+
tipo: ev.tipo,
|
|
25
|
+
contenidoHash: ev.contenidoHash,
|
|
26
|
+
emisor: ev.emisor,
|
|
27
|
+
timestamp: ev.timestamp,
|
|
28
|
+
procedencia: ev.procedencia,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// ─── EVIDENTIA MANAGER ─────────────────────────────────────────────────────
|
|
32
|
+
/** Desfase de reloj tolerado en `fechaEmision` / `timestamp` antes de rechazar. */
|
|
33
|
+
const TOLERANCIA_RELOJ_MS = 5 * 60 * 1000;
|
|
34
|
+
export class EvidentiaManager extends EventTarget {
|
|
35
|
+
identity;
|
|
36
|
+
mesh;
|
|
37
|
+
evidentias;
|
|
38
|
+
NAMESPACE = "_maloca:evidentia";
|
|
39
|
+
bridge;
|
|
40
|
+
/** Claves publicas de emisores conocidas fuera de banda. Nunca se leen de una evidencia. */
|
|
41
|
+
clavesPublicas;
|
|
42
|
+
constructor(identity, mesh, bridge) {
|
|
43
|
+
super();
|
|
44
|
+
this.identity = identity;
|
|
45
|
+
this.mesh = mesh;
|
|
46
|
+
this.evidentias = new Map();
|
|
47
|
+
this.bridge = bridge;
|
|
48
|
+
this.clavesPublicas = new Map();
|
|
49
|
+
// El par de claves local es de fiar por construccion: tenemos la mitad privada.
|
|
50
|
+
this.registrarEmisor(identity.nodoId, identity.exportarPublico());
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Registra una clave publica de emisor. Solo pueden registrarse aqui claves
|
|
54
|
+
* obtenidas por un canal de confianza (handshake de identidad, roster de
|
|
55
|
+
* administracion) — `verify()` se niega a confiar en una pubkey que viaje
|
|
56
|
+
* dentro de la misma evidencia que se le pide validar.
|
|
57
|
+
*/
|
|
58
|
+
registrarEmisor(emisor, parPublico) {
|
|
59
|
+
if (!parPublico || parPublico.length === 0)
|
|
60
|
+
return;
|
|
61
|
+
this.clavesPublicas.set(String(emisor), new Uint8Array(parPublico));
|
|
62
|
+
}
|
|
63
|
+
clavePublicaDe(emisor) {
|
|
64
|
+
return this.clavesPublicas.get(String(emisor));
|
|
65
|
+
}
|
|
66
|
+
async notarize(contenido, tipo, procedencia) {
|
|
67
|
+
const encoder = new TextEncoder();
|
|
68
|
+
const contenidoStr = JSON.stringify(contenido);
|
|
69
|
+
const contenidoBytes = encoder.encode(contenidoStr);
|
|
70
|
+
// Hashear contenido (SHA-256)
|
|
71
|
+
const digest = await crypto.subtle.digest("SHA-256", contenidoBytes);
|
|
72
|
+
const contenidoHash = bytesAHex(new Uint8Array(digest));
|
|
73
|
+
const emisor = this.identity.nodoId;
|
|
74
|
+
const timestamp = Date.now();
|
|
75
|
+
// La procedencia forma parte del cuerpo firmado, asi que debe resolverse
|
|
76
|
+
// ANTES de firmar.
|
|
77
|
+
const proc = {
|
|
78
|
+
fechaEmision: procedencia?.fechaEmision ?? timestamp,
|
|
79
|
+
emisor: procedencia?.emisor ?? emisor,
|
|
80
|
+
queRespalda: (procedencia?.queRespalda ?? tipo).trim(),
|
|
81
|
+
...(procedencia?.descripcionEmisor !== undefined
|
|
82
|
+
? { descripcionEmisor: procedencia.descripcionEmisor }
|
|
83
|
+
: {}),
|
|
84
|
+
...(procedencia?.referencia !== undefined
|
|
85
|
+
? { referencia: procedencia.referencia }
|
|
86
|
+
: {}),
|
|
87
|
+
};
|
|
88
|
+
const cuerpo = {
|
|
89
|
+
version: 1,
|
|
90
|
+
tipo,
|
|
91
|
+
contenidoHash,
|
|
92
|
+
emisor,
|
|
93
|
+
timestamp,
|
|
94
|
+
procedencia: proc,
|
|
95
|
+
};
|
|
96
|
+
// Firmar con PQC el cuerpo canonico completo (contenido + procedencia)
|
|
97
|
+
const firmaBytes = await this.identity.firmar(canonicalEvidentiaBytes(cuerpo));
|
|
98
|
+
const firmaPQC = bytesAHex(firmaBytes);
|
|
99
|
+
// Crear hash de la notarización completa
|
|
100
|
+
const notarizacionId = await this.calcularHashNotarizacion(contenidoHash, firmaPQC, emisor);
|
|
101
|
+
const evidentia = {
|
|
102
|
+
hash: notarizacionId,
|
|
103
|
+
tipo,
|
|
104
|
+
contenidoHash,
|
|
105
|
+
emisor,
|
|
106
|
+
firmaPQC,
|
|
107
|
+
red: this.bridge ? "polygon-testnet" : "maloca-mesh",
|
|
108
|
+
confirmaciones: 1,
|
|
109
|
+
timestamp,
|
|
110
|
+
procedencia: proc,
|
|
111
|
+
};
|
|
112
|
+
this.evidentias.set(evidentia.hash, evidentia);
|
|
113
|
+
// Difundir en la red mesh / Polygon
|
|
114
|
+
await this.broadcastToBlockchain(evidentia);
|
|
115
|
+
this.dispatchEvent(new CustomEvent("notarizacionCreada", { detail: evidentia }));
|
|
116
|
+
return evidentia;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Verificacion completa de una evidencia conocida localmente.
|
|
120
|
+
*
|
|
121
|
+
* Devuelve false (y emite `evidenciaRechazada`) salvo que pase TODAS las
|
|
122
|
+
* comprobaciones: integridad del id, coherencia de la procedencia, clave de
|
|
123
|
+
* emisor registrada, y una firma ML-DSA-65 valida sobre el cuerpo canonico.
|
|
124
|
+
*
|
|
125
|
+
* La verificacion on-chain del bridge, cuando existe, sigue siendo una fuente
|
|
126
|
+
* valida: un anchor confirmado en cadena prueba que el hash quedo anclado. Pero
|
|
127
|
+
* ya no es la UNICA via — antes, si el bridge fallaba, caia a `return true`, es
|
|
128
|
+
* decir: verificacion que en realidad no verificaba nada.
|
|
129
|
+
*/
|
|
130
|
+
async verify(hash) {
|
|
131
|
+
const evidentia = this.evidentias.get(hash);
|
|
132
|
+
if (!evidentia)
|
|
133
|
+
return false;
|
|
134
|
+
const res = await this.verificarEvidentia(evidentia);
|
|
135
|
+
if (res.valido)
|
|
136
|
+
return true;
|
|
137
|
+
// Si la evidencia esta anclada on-chain, el anclaje es prueba suficiente.
|
|
138
|
+
if (this.bridge) {
|
|
139
|
+
const root = evidentia.hash.startsWith("0x")
|
|
140
|
+
? evidentia.hash
|
|
141
|
+
: `0x${evidentia.hash}`;
|
|
142
|
+
if (await this.bridge.verifyOnChain(root, []))
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
this.dispatchEvent(new CustomEvent("evidenciaRechazada", {
|
|
146
|
+
detail: { hash, motivo: res.motivo, emisor: evidentia.emisor },
|
|
147
|
+
}));
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Verifica una evidencia recibida de la red (aun no confiable localmente).
|
|
152
|
+
* Mismas comprobaciones que `verify()`; la usan quienes ingieren pruebas
|
|
153
|
+
* gosseadas y deben rechazar todo lo que no puedan atribuir criptograficamente.
|
|
154
|
+
*/
|
|
155
|
+
async verificarEvidentia(ev) {
|
|
156
|
+
if (!ev || typeof ev !== "object") {
|
|
157
|
+
return { valido: false, motivo: "evidencia invalida" };
|
|
158
|
+
}
|
|
159
|
+
if (typeof ev.firmaPQC !== "string" || ev.firmaPQC.length === 0) {
|
|
160
|
+
return { valido: false, motivo: "firma ausente" };
|
|
161
|
+
}
|
|
162
|
+
if (!ev.procedencia)
|
|
163
|
+
return { valido: false, motivo: "procedencia ausente" };
|
|
164
|
+
// 1. Identidad del propio registro: el hash debe coincidir con sus
|
|
165
|
+
// componentes, si no un par podria mutar tipo/contenidoHash/emisor en
|
|
166
|
+
// transito.
|
|
167
|
+
const esperado = await this.calcularHashNotarizacion(ev.contenidoHash, ev.firmaPQC, ev.emisor);
|
|
168
|
+
if (esperado !== ev.hash)
|
|
169
|
+
return { valido: false, motivo: "hash inconsistente" };
|
|
170
|
+
// 2. Coherencia de la procedencia: quien, cuando, que.
|
|
171
|
+
const proc = ev.procedencia;
|
|
172
|
+
if (proc.emisor !== ev.emisor) {
|
|
173
|
+
return { valido: false, motivo: "procedencia con emisor distinto" };
|
|
174
|
+
}
|
|
175
|
+
if (typeof proc.queRespalda !== "string" ||
|
|
176
|
+
proc.queRespalda.trim().length === 0) {
|
|
177
|
+
return { valido: false, motivo: "procedencia sin queRespalda" };
|
|
178
|
+
}
|
|
179
|
+
if (!Number.isFinite(proc.fechaEmision) || proc.fechaEmision <= 0) {
|
|
180
|
+
return { valido: false, motivo: "procedencia con fecha invalida" };
|
|
181
|
+
}
|
|
182
|
+
const ahora = Date.now();
|
|
183
|
+
if (proc.fechaEmision - ahora > TOLERANCIA_RELOJ_MS ||
|
|
184
|
+
ahora - proc.fechaEmision > TOLERANCIA_RELOJ_MS) {
|
|
185
|
+
return {
|
|
186
|
+
valido: false,
|
|
187
|
+
motivo: "procedencia fuera de la ventana temporal",
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
if (!Number.isFinite(ev.timestamp) || ev.timestamp <= 0) {
|
|
191
|
+
return { valido: false, motivo: "timestamp invalido" };
|
|
192
|
+
}
|
|
193
|
+
// 3. La clave del emisor debe estar REGISTRADA. Una pubkey que viaje dentro
|
|
194
|
+
// de la propia evidencia haria que la firma se autocertificara: no valdria
|
|
195
|
+
// nada.
|
|
196
|
+
const parPublico = this.clavesPublicas.get(String(ev.emisor));
|
|
197
|
+
if (!parPublico) {
|
|
198
|
+
return { valido: false, motivo: "pubkey del emisor no registrada" };
|
|
199
|
+
}
|
|
200
|
+
// 4. Firma ML-DSA-65 sobre el cuerpo canonico (contenido + procedencia).
|
|
201
|
+
let firmaBytes;
|
|
202
|
+
try {
|
|
203
|
+
firmaBytes = hexABytes(ev.firmaPQC);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return { valido: false, motivo: "firma malformada" };
|
|
207
|
+
}
|
|
208
|
+
if (firmaBytes.length === 0) {
|
|
209
|
+
return { valido: false, motivo: "firma malformada" };
|
|
210
|
+
}
|
|
211
|
+
const ok = await this.identity.verificar(canonicalEvidentiaBytes(cuerpoFirmado(ev)), firmaBytes, parPublico);
|
|
212
|
+
if (!ok)
|
|
213
|
+
return { valido: false, motivo: "firma PQC invalida" };
|
|
214
|
+
return { valido: true, motivo: "ok" };
|
|
215
|
+
}
|
|
216
|
+
getProof(hash) {
|
|
217
|
+
return this.evidentias.get(hash) ?? null;
|
|
218
|
+
}
|
|
219
|
+
getBridge() {
|
|
220
|
+
return this.bridge;
|
|
221
|
+
}
|
|
222
|
+
async calcularHashNotarizacion(contenidoHash, firmaPQC, emisor) {
|
|
223
|
+
const encoder = new TextEncoder();
|
|
224
|
+
const digest = await crypto.subtle.digest("SHA-256", encoder.encode(`${contenidoHash}${firmaPQC}${emisor}`));
|
|
225
|
+
return bytesAHex(new Uint8Array(digest));
|
|
226
|
+
}
|
|
227
|
+
async broadcastToBlockchain(evidentia) {
|
|
228
|
+
// Si hay bridge de Polygon, enviamos el anchor correspondientemente
|
|
229
|
+
if (this.bridge) {
|
|
230
|
+
const anchor = {
|
|
231
|
+
merkleRoot: evidentia.hash.startsWith("0x")
|
|
232
|
+
? evidentia.hash
|
|
233
|
+
: `0x${evidentia.hash}`,
|
|
234
|
+
cid: evidentia.contenidoHash,
|
|
235
|
+
timestamp: evidentia.timestamp,
|
|
236
|
+
};
|
|
237
|
+
try {
|
|
238
|
+
await this.bridge.submitAnchor(anchor);
|
|
239
|
+
}
|
|
240
|
+
catch (_err) {
|
|
241
|
+
// El bridge maneja el encolado interno en caso de error
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Difundir vía gossip en el mesh como "blockchain adapter"
|
|
245
|
+
await this.mesh.transmitirConGossip(this.NAMESPACE, {
|
|
246
|
+
tipo: "DOC_NOTARIZED",
|
|
247
|
+
evidentia,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// ─── SHA-256 UNIVERSAL (Web Crypto API) ────────────────────────────────────
|
|
252
|
+
// Reemplaza `node:crypto.createHash` para que edge-mesh sea universal
|
|
253
|
+
// (browser + node). Determinista: mismo SHA-256 sobre los mismos bytes.
|
|
254
|
+
const sha256Encoder = new TextEncoder();
|
|
255
|
+
async function sha256Hex(data) {
|
|
256
|
+
const bytes = typeof data === "string" ? sha256Encoder.encode(data) : data;
|
|
257
|
+
const digest = await crypto.subtle.digest("SHA-256", bytes);
|
|
258
|
+
return bytesAHex(new Uint8Array(digest));
|
|
259
|
+
}
|
|
260
|
+
export class MerkleTree {
|
|
261
|
+
leaves;
|
|
262
|
+
root;
|
|
263
|
+
buildPromise;
|
|
264
|
+
buildGeneration = 0;
|
|
265
|
+
signature;
|
|
266
|
+
constructor(leaves = []) {
|
|
267
|
+
this.leaves = [...leaves];
|
|
268
|
+
this.root = "";
|
|
269
|
+
// rebuild() es async (Web Crypto); se dispara y se espera vía buildPromise.
|
|
270
|
+
this.buildPromise = this.rebuild();
|
|
271
|
+
}
|
|
272
|
+
getLeaves() {
|
|
273
|
+
return [...this.leaves];
|
|
274
|
+
}
|
|
275
|
+
toJSON() {
|
|
276
|
+
return {
|
|
277
|
+
leaves: this.leaves,
|
|
278
|
+
signature: this.signature,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
async add(leaf) {
|
|
282
|
+
this.leaves.push(leaf);
|
|
283
|
+
this.buildPromise = this.rebuild();
|
|
284
|
+
await this.buildPromise;
|
|
285
|
+
}
|
|
286
|
+
async getRoot() {
|
|
287
|
+
await this.buildPromise;
|
|
288
|
+
return this.root;
|
|
289
|
+
}
|
|
290
|
+
async rebuild() {
|
|
291
|
+
// Generación anti-race: si un rebuild previo termina después que uno nuevo,
|
|
292
|
+
// su resultado se descarta (snapshot + guard de generación).
|
|
293
|
+
const generation = ++this.buildGeneration;
|
|
294
|
+
const snapshot = [...this.leaves];
|
|
295
|
+
if (snapshot.length === 0) {
|
|
296
|
+
this.root = "";
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
let level = [];
|
|
300
|
+
for (const leaf of snapshot) {
|
|
301
|
+
level.push(await hashLeaf(leaf));
|
|
302
|
+
}
|
|
303
|
+
while (level.length > 1) {
|
|
304
|
+
const nextLevel = [];
|
|
305
|
+
for (let i = 0; i < level.length; i += 2) {
|
|
306
|
+
if (i + 1 < level.length) {
|
|
307
|
+
const left = level[i];
|
|
308
|
+
const right = level[i + 1];
|
|
309
|
+
const combined = left < right ? left + right : right + left;
|
|
310
|
+
nextLevel.push(await sha256Hex(combined));
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
const left = level[i];
|
|
314
|
+
const combined = left + left;
|
|
315
|
+
nextLevel.push(await sha256Hex(combined));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
level = nextLevel;
|
|
319
|
+
}
|
|
320
|
+
if (generation === this.buildGeneration) {
|
|
321
|
+
this.root = level[0] || "";
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
async verify(leaf, proof) {
|
|
325
|
+
let currentHash = await hashLeaf(leaf);
|
|
326
|
+
for (const sibling of proof) {
|
|
327
|
+
const combined = currentHash < sibling ? currentHash + sibling : sibling + currentHash;
|
|
328
|
+
currentHash = await sha256Hex(combined);
|
|
329
|
+
}
|
|
330
|
+
return currentHash === (await this.getRoot());
|
|
331
|
+
}
|
|
332
|
+
async getProof(leaf) {
|
|
333
|
+
let index = this.leaves.findIndex((l) => l.id === leaf.id);
|
|
334
|
+
if (index === -1)
|
|
335
|
+
return [];
|
|
336
|
+
const proof = [];
|
|
337
|
+
let level = [];
|
|
338
|
+
for (const l of this.leaves) {
|
|
339
|
+
level.push(await hashLeaf(l));
|
|
340
|
+
}
|
|
341
|
+
while (level.length > 1) {
|
|
342
|
+
const nextLevel = [];
|
|
343
|
+
for (let i = 0; i < level.length; i += 2) {
|
|
344
|
+
if (i + 1 < level.length) {
|
|
345
|
+
const left = level[i];
|
|
346
|
+
const right = level[i + 1];
|
|
347
|
+
const combined = left < right ? left + right : right + left;
|
|
348
|
+
nextLevel.push(await sha256Hex(combined));
|
|
349
|
+
if (i === index) {
|
|
350
|
+
proof.push(right);
|
|
351
|
+
}
|
|
352
|
+
else if (i + 1 === index) {
|
|
353
|
+
proof.push(left);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
const left = level[i];
|
|
358
|
+
const combined = left + left;
|
|
359
|
+
nextLevel.push(await sha256Hex(combined));
|
|
360
|
+
if (i === index) {
|
|
361
|
+
proof.push(left);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
index = Math.floor(index / 2);
|
|
366
|
+
level = nextLevel;
|
|
367
|
+
}
|
|
368
|
+
return proof;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
export async function hashLeaf(leaf) {
|
|
372
|
+
const dataToHash = `${leaf.id}:${leaf.hash}:${leaf.timestamp}`;
|
|
373
|
+
return sha256Hex(dataToHash);
|
|
374
|
+
}
|
|
375
|
+
export async function mergeMerkleTrees(treeA, treeB, identity) {
|
|
376
|
+
// Atomic rollback check: take snapshots of leaves to prevent mutating treeA or treeB
|
|
377
|
+
const originalLeavesA = treeA.getLeaves();
|
|
378
|
+
const originalLeavesB = treeB.getLeaves();
|
|
379
|
+
// Atomicidad: se trabaja sobre snapshots de leaves (originalLeavesA/B),
|
|
380
|
+
// nunca se mutan treeA ni treeB. Cualquier error aborta sin efectos.
|
|
381
|
+
const leavesMap = new Map();
|
|
382
|
+
for (const leaf of originalLeavesA) {
|
|
383
|
+
leavesMap.set(leaf.id, { a: leaf });
|
|
384
|
+
}
|
|
385
|
+
for (const leaf of originalLeavesB) {
|
|
386
|
+
const entry = leavesMap.get(leaf.id) || {};
|
|
387
|
+
entry.b = leaf;
|
|
388
|
+
leavesMap.set(leaf.id, entry);
|
|
389
|
+
}
|
|
390
|
+
const mergedLeaves = [];
|
|
391
|
+
const resolvedLeaves = [];
|
|
392
|
+
const pendingLeaves = [];
|
|
393
|
+
let conflictCount = 0;
|
|
394
|
+
for (const [_, entry] of leavesMap.entries()) {
|
|
395
|
+
if (entry.a && !entry.b) {
|
|
396
|
+
mergedLeaves.push(entry.a);
|
|
397
|
+
}
|
|
398
|
+
else if (!entry.a && entry.b) {
|
|
399
|
+
mergedLeaves.push(entry.b);
|
|
400
|
+
}
|
|
401
|
+
else if (entry.a && entry.b) {
|
|
402
|
+
const leafA = entry.a;
|
|
403
|
+
const leafB = entry.b;
|
|
404
|
+
if (leafA.hash === leafB.hash) {
|
|
405
|
+
// No conflict, they are identical
|
|
406
|
+
mergedLeaves.push(leafA);
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
// Conflict!
|
|
410
|
+
conflictCount++;
|
|
411
|
+
const diff = Math.abs(leafA.timestamp - leafB.timestamp);
|
|
412
|
+
const fiveMinutesMs = 5 * 60 * 1000;
|
|
413
|
+
if (diff > fiveMinutesMs) {
|
|
414
|
+
// Resolve by LWW (Last-Writer-Wins)
|
|
415
|
+
const winner = leafA.timestamp > leafB.timestamp ? leafA : leafB;
|
|
416
|
+
resolvedLeaves.push(winner);
|
|
417
|
+
mergedLeaves.push(winner);
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
// Irresoluble conflict, requires governance vote
|
|
421
|
+
pendingLeaves.push(leafA);
|
|
422
|
+
pendingLeaves.push(leafB);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
// Create merged tree
|
|
428
|
+
const mergedTree = new MerkleTree(mergedLeaves);
|
|
429
|
+
// El nuevo root se firma con ML-DSA-65
|
|
430
|
+
if (identity) {
|
|
431
|
+
const root = await mergedTree.getRoot();
|
|
432
|
+
if (root) {
|
|
433
|
+
const encoder = new TextEncoder();
|
|
434
|
+
const rootBytes = encoder.encode(root);
|
|
435
|
+
const digest = await crypto.subtle.digest("SHA-256", rootBytes);
|
|
436
|
+
const signatureBytes = await identity.firmar(new Uint8Array(digest));
|
|
437
|
+
mergedTree.signature = bytesAHex(signatureBytes);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return {
|
|
441
|
+
mergedTree,
|
|
442
|
+
conflictCount,
|
|
443
|
+
resolvedLeaves,
|
|
444
|
+
pendingLeaves,
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=evidentia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidentia.js","sourceRoot":"","sources":["../../src/maloca/evidentia.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type { EdgeMesh } from "../../edge-mesh.js";
|
|
2
|
+
import type { NodoId } from "../../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Banda de reputacion devuelta junto al score de karma.
|
|
5
|
+
*
|
|
6
|
+
* IMPORTANTE (mesh medico): son BANDAS DE PRESENTACION derivadas del score real
|
|
7
|
+
* del motor. No son una señal de autorización. Una insignia de reputación NO
|
|
8
|
+
* debe leerse como "este nodo puede ver pacientes" — el acceso lo concede la
|
|
9
|
+
* verificacion de credencial, nunca la reputación.
|
|
10
|
+
*/
|
|
11
|
+
export type ReputationBand = "unrated" | "newcomer" | "member" | "trusted" | "legendary";
|
|
12
|
+
/**
|
|
13
|
+
* REST API Gateway para el mesh Maloca.
|
|
14
|
+
*
|
|
15
|
+
* ── ALCANCE: SOLO LECTURA RESPECTO A LA REPUTACIÓN ─────────────────────────
|
|
16
|
+
* Todo valor de reputación que se expone aqui (perfiles, karma) se LEE del unico
|
|
17
|
+
* motor real (`KarmaManager`, conectado como `mesh.karma` por `MalocaKernel`). El
|
|
18
|
+
* gateway nunca recalcula un score con sus propias reglas ni inventa una base.
|
|
19
|
+
*
|
|
20
|
+
* Un nodo sin historial de karma firmado reporta `0` / `unrated`. NO se le
|
|
21
|
+
* regala una puntuacion inicial gratuita: la reputación se gana con transacciones
|
|
22
|
+
* validadas.
|
|
23
|
+
*
|
|
24
|
+
* NOTA DE SEGURIDAD (redes medicas): la reputación es una señal sobre el
|
|
25
|
+
* historial, no sobre el derecho de acceso. La verificacion de credenciales
|
|
26
|
+
* (`identidad` / atestacion de registro) es lo que da acceso a datos de pacientes.
|
|
27
|
+
* Esta API es de solo lectura y no concede nada.
|
|
28
|
+
*/
|
|
29
|
+
export declare class MalocaGatewayAPI {
|
|
30
|
+
private readonly mesh;
|
|
31
|
+
private readonly rateLimiter;
|
|
32
|
+
constructor(mesh: EdgeMesh);
|
|
33
|
+
private checkRateLimit;
|
|
34
|
+
/**
|
|
35
|
+
* GET /mesh/status
|
|
36
|
+
*/
|
|
37
|
+
getMeshStatus(clientIp?: string): Promise<{
|
|
38
|
+
status: string;
|
|
39
|
+
totalNodes: number;
|
|
40
|
+
activeNodes: readonly NodoId[];
|
|
41
|
+
config: {
|
|
42
|
+
nodoId: NodoId;
|
|
43
|
+
};
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* GET /profiles/:id
|
|
47
|
+
*/
|
|
48
|
+
getProfile(id: string, clientIp?: string): Promise<any>;
|
|
49
|
+
/**
|
|
50
|
+
* POST /profiles
|
|
51
|
+
*/
|
|
52
|
+
registerProfile(profile: any, clientIp?: string): Promise<{
|
|
53
|
+
success: boolean;
|
|
54
|
+
profile: any;
|
|
55
|
+
}>;
|
|
56
|
+
/**
|
|
57
|
+
* GET /karma/:id
|
|
58
|
+
*
|
|
59
|
+
* Vista de SOLO LECTURA de la reputación. El score y la banda vienen ambos del
|
|
60
|
+
* motor real. Nada de aqui concede acceso a datos clínicos — eso lo concede la
|
|
61
|
+
* verificacion de credenciales.
|
|
62
|
+
*/
|
|
63
|
+
getKarma(id: string, clientIp?: string): Promise<{
|
|
64
|
+
nodoId: string;
|
|
65
|
+
karma: number;
|
|
66
|
+
reputacion: ReputationBand;
|
|
67
|
+
autorizaAcceso: false;
|
|
68
|
+
}>;
|
|
69
|
+
/**
|
|
70
|
+
* POST /karma/emit
|
|
71
|
+
*
|
|
72
|
+
* Escribe un evento de karma SIN FIRMAR en el log Yjs compartido, para
|
|
73
|
+
* mostrarlo en el panel/clasificacion. NO toca el motor de reputación: el
|
|
74
|
+
* score que devuelven `getKarma`/`getProfile` no le afecta.
|
|
75
|
+
*
|
|
76
|
+
* Justificacion: ese log sin firma lo sigue leyendo
|
|
77
|
+
* `MalocaDashboard.getKarmaValue` para su clasificacion, asi que quitar aqui
|
|
78
|
+
* el escritor romperia ese archivo (fuera del alcance de este cambio). El
|
|
79
|
+
* camino autoritativo es `MalocaKernel.emitKarma` -> `KarmaManager.emit`, que
|
|
80
|
+
* firma con la identidad PQC del nodo.
|
|
81
|
+
*
|
|
82
|
+
* TODO(owner): unificar ambos caminos cuando el dashboard migre fuera del
|
|
83
|
+
* array Yjs crudo.
|
|
84
|
+
*/
|
|
85
|
+
emitKarma(transaction: {
|
|
86
|
+
to: string;
|
|
87
|
+
amount: number;
|
|
88
|
+
reason: string;
|
|
89
|
+
}, clientIp?: string): Promise<{
|
|
90
|
+
to: string;
|
|
91
|
+
amount: number;
|
|
92
|
+
reason: string;
|
|
93
|
+
from: NodoId;
|
|
94
|
+
timestamp: number;
|
|
95
|
+
txId: string;
|
|
96
|
+
afectaReputacion: false;
|
|
97
|
+
}>;
|
|
98
|
+
/**
|
|
99
|
+
* GET /plugins
|
|
100
|
+
*/
|
|
101
|
+
getPlugins(clientIp?: string): Promise<{
|
|
102
|
+
id: string;
|
|
103
|
+
status: string;
|
|
104
|
+
}[]>;
|
|
105
|
+
/**
|
|
106
|
+
* POST /evidentia/notarize
|
|
107
|
+
*/
|
|
108
|
+
notarizeDocument(doc: {
|
|
109
|
+
hash: string;
|
|
110
|
+
metadata: any;
|
|
111
|
+
}, clientIp?: string): Promise<{
|
|
112
|
+
hash: string;
|
|
113
|
+
metadata: any;
|
|
114
|
+
timestamp: number;
|
|
115
|
+
author: NodoId;
|
|
116
|
+
notarized: boolean;
|
|
117
|
+
}>;
|
|
118
|
+
/**
|
|
119
|
+
* Resuelve el motor REAL de karma (`KarmaManager`) conectado a la malla.
|
|
120
|
+
*
|
|
121
|
+
* `MalocaKernel` expone `readonly karma: KarmaManager`. El gateway esta
|
|
122
|
+
* tipado contra el `EdgeMesh` base, asi que buscamos el accessor
|
|
123
|
+
* estructuralmente en vez de castear a ciegas. Cuando la malla es un
|
|
124
|
+
* `EdgeMesh` simple (sin kernel conectado) no hay motor que leer y reportamos
|
|
125
|
+
* "sin datos de reputacion" en vez de fabricar un score.
|
|
126
|
+
*/
|
|
127
|
+
private getKarmaEngine;
|
|
128
|
+
/**
|
|
129
|
+
* Lee el score de karma del motor real.
|
|
130
|
+
*
|
|
131
|
+
* Un nodo sin historial devuelve 0 — nunca un valor base sintetico. Un motor
|
|
132
|
+
* ausente (EdgeMesh simple, kernel no conectado) tambien se reporta como 0,
|
|
133
|
+
* para que la API nunca pueda implicar standing no ganado.
|
|
134
|
+
*/
|
|
135
|
+
private getKarmaValue;
|
|
136
|
+
/**
|
|
137
|
+
* Deriva una banda de PRESENTACION del score del motor real.
|
|
138
|
+
*
|
|
139
|
+
* El score es la fuente de verdad; esto solo lo agrupa para presentarlo.
|
|
140
|
+
* `unrated` se devuelve para un score cero, de modo que un nodo sin historial
|
|
141
|
+
* validado sea visiblemente no rated en vez de heredar el suelo "newcomer" de
|
|
142
|
+
* la antigua base-100.
|
|
143
|
+
*/
|
|
144
|
+
private calculateReputation;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/maloca/gateway/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAMnD;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GACvB,SAAS,GACT,UAAU,GACV,QAAQ,GACR,SAAS,GACT,WAAW,CAAC;AAEf;;;;;;;;;;;;;;;;GAgBG;AAEH,qBAAa,gBAAgB;IAOhB,OAAO,CAAC,QAAQ,CAAC,IAAI;IANjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAIzB;IAEH,YAA6B,IAAI,EAAE,QAAQ,EAAI;IAE/C,OAAO,CAAC,cAAc;IAStB;;OAEG;IACG,aAAa,CAAC,QAAQ,SAAc;;;;;YAQvC,MAAM;;OAGR;IAED;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,SAAc,gBAkBlD;IAED;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,SAAc;;;OAYzD;IAED;;;;;;OAMG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,SAAc;;;;;OAYhD;IAED;;;;;;;;;;;;;;;OAeG;IACG,SAAS,CACd,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAC3D,QAAQ,SAAc;YADH,MAAM;gBAAU,MAAM;gBAAU,MAAM;;;;;OAkBzD;IAED;;OAEG;IACG,UAAU,CAAC,QAAQ,SAAc;;;SAStC;IAED;;OAEG;IACG,gBAAgB,CACrB,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAA;KAAE,EACpC,QAAQ,SAAc;cADT,MAAM;kBAAY,GAAG;;;;OAgBlC;IAID;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;IAUtB;;;;;;OAMG;YACW,aAAa;IAa3B;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;CAO3B"}
|