@swal/edge-mesh 0.0.0-stage → 0.1.1
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 +157 -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 +192 -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 +71 -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 +52 -0
- package/dist/transport/peerjs.d.ts.map +1 -0
- package/dist/transport/peerjs.js +336 -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 +246 -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 +139 -4
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import type { PostQuantumIdentity } from "../identity/index.js";
|
|
2
|
+
import type { OpLog } from "../op-log/index.js";
|
|
3
|
+
import type { NodoId, ParPublico } from "../types/index.js";
|
|
4
|
+
import type { TransaccionKarma } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* KarmaManager — motor de reputación para nodos de la mesh.
|
|
7
|
+
*
|
|
8
|
+
* Genérico: no contiene lógica de negocio (pesos por industria, umbrales, etc).
|
|
9
|
+
* Cada adapter (VeedurIA, Hosteler-IA, la red médica) registra sus propias reglas.
|
|
10
|
+
*
|
|
11
|
+
* ─── LA REPUTACIÓN ES A PRUEBA DE MANIPULACIÓN, NO DE CONFIANZA ─────────────
|
|
12
|
+
*
|
|
13
|
+
* Un score de reputación vale lo que valga la evidencia detrás. En una red de
|
|
14
|
+
* médicos verificados, un aval sin firma o emitido por uno mismo no vale nada: es
|
|
15
|
+
* indistinguible del de un atacante con una sola clave comprometida. Por eso:
|
|
16
|
+
*
|
|
17
|
+
* 1. TODA transacción aplicada lleva una firma ML-DSA-65 válida de la clave
|
|
18
|
+
* pública del emisor. Sin firma, no hay score.
|
|
19
|
+
* 2. Un nodo NUNCA se avalora a sí mismo (`emisor === sujeto` se rechaza).
|
|
20
|
+
* 3. `delta` está acotado. Ver {@link DELTA_MAX_ABS} para el razonamiento.
|
|
21
|
+
* 4. La aplicación es IDEMPOTENTE por `tx.id`, así una atestación capturada y
|
|
22
|
+
* reenviada desde el OpLog no se cuenta dos veces.
|
|
23
|
+
* 5. La reputación solo baja por su cuenta: decay. Un médico que deja de ser
|
|
24
|
+
* avalado por sus pares pierde standing con el tiempo, así que una
|
|
25
|
+
* reputación ganada una vez y nunca renovada no aguanta para siempre.
|
|
26
|
+
*
|
|
27
|
+
* ─── LIMITACIÓN CONOCIDA ────────────────────────────────────────────────────
|
|
28
|
+
*
|
|
29
|
+
* Esta clase no propaga reputación. Un nodo solo conoce las transacciones que él
|
|
30
|
+
* mismo vio (emitidas localmente o recibidas por la capa de replicación). Dos
|
|
31
|
+
* nodos que observan el mismo aval sostiene scores distintos mientras tanto; el
|
|
32
|
+
* decay debe ir por nodo y la convergencia es de la capa de propagación.
|
|
33
|
+
*
|
|
34
|
+
* ─── LA REPUTACIÓN NUNCA OTORGA ACCESO ──────────────────────────────────────
|
|
35
|
+
*
|
|
36
|
+
* El karma es una SEÑAL, nunca una credencial. El acceso a la red médica lo decide
|
|
37
|
+
* la capa de autorización contra una credencial verificada, nunca comparando un
|
|
38
|
+
* número de karma. {@link DELTA_MAX_ABS} está dimensionado para que ni un par
|
|
39
|
+
* totalmente comprometido mueva un score a través de un umbral por sí solo.
|
|
40
|
+
*/
|
|
41
|
+
export type { TransaccionKarma };
|
|
42
|
+
/** Tope del valor absoluto de un único `delta`. */
|
|
43
|
+
export declare const DELTA_MAX_ABS: 25;
|
|
44
|
+
/**
|
|
45
|
+
* Factor mínimo aceptado en {@link KarmaManager.applyDecay}. Evita que se pase 0
|
|
46
|
+
* (que borraría el score y volvería degenerado a `getBestPeer`) o un negativo
|
|
47
|
+
* (que invertiría el signo del score).
|
|
48
|
+
*/
|
|
49
|
+
export declare const FACTOR_DECAY_MIN: 0.01;
|
|
50
|
+
/**
|
|
51
|
+
* POR QUÉ 25?
|
|
52
|
+
*
|
|
53
|
+
* Un aval es una señal débil y barata — un solo atacante no debe poder mover un
|
|
54
|
+
* score lejos. Con un tope de 25:
|
|
55
|
+
*
|
|
56
|
+
* - alcanzar 100 (una marca plausible de "verificado") exige al menos 4
|
|
57
|
+
* avaladores independientes, así que la reputación no puede fabricarla un
|
|
58
|
+
* solo nodo;
|
|
59
|
+
* - un par totalmente comprometido puede desplazar cualquier score como mucho
|
|
60
|
+
* 25, insuficiente para cruzar por sí solo un umbral de acceso;
|
|
61
|
+
* - sigue siendo lo bastante ancho para que un aval fuerte y legítimo signifique
|
|
62
|
+
* algo, sin permitir el `delta: 1e9` auto-otorgado que este módulo rechaza.
|
|
63
|
+
*
|
|
64
|
+
* Quien necesite pesos propios del dominio debe agregar varios avales en vez de
|
|
65
|
+
* subir este techo.
|
|
66
|
+
*/
|
|
67
|
+
/** Por qué se rechazó una transacción. Expuesto para logs y tests. */
|
|
68
|
+
export type MotivoRechazo = "auto_emision" | "delta_no_positivo" | "delta_sobre_techo" | "firma_vacia" | "firma_invalida" | "emisor_desconocido";
|
|
69
|
+
/**
|
|
70
|
+
* Resuelve la clave pública registrada para un nodo. Devuelve `null`/`undefined`
|
|
71
|
+
* cuando el emisor es desconocido.
|
|
72
|
+
*
|
|
73
|
+
* Inyectada en vez de importarse para que KarmaManager no dependa del registro de
|
|
74
|
+
* pares; la capa de replicación aporta el resolutor.
|
|
75
|
+
*/
|
|
76
|
+
export type ResolvedorClavePublica = (nodoId: NodoId) => ParPublico | null | undefined;
|
|
77
|
+
export declare class KarmaManager {
|
|
78
|
+
private readonly oplog;
|
|
79
|
+
private readonly identity;
|
|
80
|
+
private cache;
|
|
81
|
+
private readonly resolvePublicKey?;
|
|
82
|
+
/** Claves públicas de pares conocidas por este nodo. */
|
|
83
|
+
private readonly clavesConocidas;
|
|
84
|
+
/** Ids de transacciones ya aplicadas, para reenvío idempotente del OpLog. */
|
|
85
|
+
private readonly aplicadas;
|
|
86
|
+
constructor(oplog: OpLog, identity: PostQuantumIdentity, getPublicKey?: (nodeId: NodoId) => ParPublico | undefined);
|
|
87
|
+
/**
|
|
88
|
+
* Registra la clave pública con la que firma un nodo, para que sus avales
|
|
89
|
+
* puedan verificarse localmente. La llama la capa de replicación cuando un
|
|
90
|
+
* par se anuncia.
|
|
91
|
+
*/
|
|
92
|
+
registrarClavePublica(nodoId: NodoId, parPublico: ParPublico): void;
|
|
93
|
+
/**
|
|
94
|
+
* Carga el estado de karma desde el OpLog.
|
|
95
|
+
* Debe llamarse después de crear la instancia.
|
|
96
|
+
*
|
|
97
|
+
* Las entradas que ya no cumplen las reglas se omiten en vez de aplicarse:
|
|
98
|
+
* es un fallo cerrado deliberado, y significa que el historial sin firma
|
|
99
|
+
* escrito antes de este arreglo se descarta en lugar de confiarse.
|
|
100
|
+
*
|
|
101
|
+
* @param keepExistingCache - cuando es `true` (documento restaurado desde
|
|
102
|
+
* snapshot) el cache y el registro de aplicadas se conservan, porque
|
|
103
|
+
* borrarlos reprocesaría sobre un score ya restaurado y lo duplicaría.
|
|
104
|
+
*/
|
|
105
|
+
loadFromOpLog(keepExistingCache?: boolean): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Emite una transacción de karma firmada con la identidad PQC del nodo.
|
|
108
|
+
*
|
|
109
|
+
* Si la firma falla es fatal: una transacción sin firma nunca se emite ni se
|
|
110
|
+
* persiste. Reputación sin prueba no es reputación.
|
|
111
|
+
*
|
|
112
|
+
* La transacción se valida antes de llegar al OpLog, así que una entrada
|
|
113
|
+
* inválida tampoco puede ser reenviada por un par.
|
|
114
|
+
*/
|
|
115
|
+
emit(txData: Omit<TransaccionKarma, "id" | "timestamp" | "firma"> & Partial<Pick<TransaccionKarma, "id" | "timestamp" | "firma">>): Promise<TransaccionKarma>;
|
|
116
|
+
/**
|
|
117
|
+
* Aplica una transacción recibida de otro nodo aplicando todas las reglas de
|
|
118
|
+
* validación. Devuelve `null` cuando se aplicó, o el {@link MotivoRechazo}
|
|
119
|
+
* cuando se rechazó.
|
|
120
|
+
*
|
|
121
|
+
* Esta es la entrada que la capa de replicación debe usar para avales remotos.
|
|
122
|
+
*/
|
|
123
|
+
aplicarTransaccion(tx: TransaccionKarma): Promise<MotivoRechazo | null>;
|
|
124
|
+
/**
|
|
125
|
+
* Obtiene el score de karma de un nodo.
|
|
126
|
+
*/
|
|
127
|
+
getScore(nodeId: NodoId): number;
|
|
128
|
+
/**
|
|
129
|
+
* Obtiene el historial de transacciones de un nodo. Cada entrada conserva su
|
|
130
|
+
* firma original, así que cualquier aval pasado puede reverificarse por separado.
|
|
131
|
+
*/
|
|
132
|
+
getHistory(nodeId: NodoId): readonly TransaccionKarma[];
|
|
133
|
+
/**
|
|
134
|
+
* Aplica decay (olvido) al score de un nodo, o a todos si no se especifica.
|
|
135
|
+
* - factor: 0.95 reduce 5%, 0.90 reduce 10%, etc.
|
|
136
|
+
*
|
|
137
|
+
* Esta es la ÚNICA vía sancionada para que un score baje. Un nodo que deja de
|
|
138
|
+
* ser avalado pierde standing en vez de conservar una reputación que ya no se
|
|
139
|
+
* gana. Rechaza factores fuera de rango en lugar de corromper el score.
|
|
140
|
+
*/
|
|
141
|
+
applyDecay(nodeId?: NodoId, factor?: number): Promise<void>;
|
|
142
|
+
/**
|
|
143
|
+
* Verifica una firma de transacción contra una clave pública.
|
|
144
|
+
*/
|
|
145
|
+
verify(tx: TransaccionKarma, publicKey?: ParPublico): Promise<boolean>;
|
|
146
|
+
/**
|
|
147
|
+
* Devuelve el peer con mejor karma en la mesh (para asignación de trabajo).
|
|
148
|
+
* Si no hay peers con karma registrado, devuelve null.
|
|
149
|
+
*/
|
|
150
|
+
getBestPeer(): NodoId | null;
|
|
151
|
+
/**
|
|
152
|
+
* Valida una transacción y, solo si pasa todas las reglas, la incorpora al
|
|
153
|
+
* cache. Devuelve `null` si todo va bien o el motivo del rechazo si falla.
|
|
154
|
+
*
|
|
155
|
+
* El orden importa: las comprobaciones estructurales baratas corren antes de la
|
|
156
|
+
* verificación de firma, así que una transacción claramente malformada nunca
|
|
157
|
+
* cuesta una operación PQC.
|
|
158
|
+
*/
|
|
159
|
+
private applyTransaction;
|
|
160
|
+
private clavePublicaDe;
|
|
161
|
+
private static factorValido;
|
|
162
|
+
private factorValido;
|
|
163
|
+
private applyDecayToCache;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=karma.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"karma.d.ts","sourceRoot":"","sources":["../../src/maloca/karma.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAS,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC,mDAAmD;AACnD,eAAO,MAAM,aAAa,EAAG,EAAW,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAG,IAAa,CAAC;AAE9C;;;;;;;;;;;;;;;;GAgBG;AAEH,sEAAsE;AACtE,MAAM,MAAM,aAAa,GACtB,cAAc,GACd,mBAAmB,GACnB,mBAAmB,GACnB,aAAa,GACb,gBAAgB,GAChB,oBAAoB,CAAC;AAExB;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,CACpC,MAAM,EAAE,MAAM,KACV,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC;AAyBnC,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAEN;IAC5B,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsC;IACtE,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IAEpD,YACC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,mBAAmB,EAC7B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,EAKzD;IAED;;;;OAIG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAElE;IAED;;;;;;;;;;;OAWG;IACG,aAAa,CAAC,iBAAiB,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB5D;IAED;;;;;;;;OAQG;IACG,IAAI,CACT,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,WAAW,GAAG,OAAO,CAAC,GAC3D,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,WAAW,GAAG,OAAO,CAAC,CAAC,GAC5D,OAAO,CAAC,gBAAgB,CAAC,CAwC3B;IAED;;;;;;OAMG;IACG,kBAAkB,CACvB,EAAE,EAAE,gBAAgB,GAClB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAE/B;IAED;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/B;IAED;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,gBAAgB,EAAE,CAEtD;IAED;;;;;;;OAOG;IACG,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBtE;IAED;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB3E;IAID;;;OAGG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI,CAU3B;IAED;;;;;;;OAOG;YACW,gBAAgB;IA0D9B,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,MAAM,CAAC,YAAY;IAS3B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,iBAAiB;CAmBzB"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/** Tope del valor absoluto de un único `delta`. */
|
|
2
|
+
export const DELTA_MAX_ABS = 25;
|
|
3
|
+
/**
|
|
4
|
+
* Factor mínimo aceptado en {@link KarmaManager.applyDecay}. Evita que se pase 0
|
|
5
|
+
* (que borraría el score y volvería degenerado a `getBestPeer`) o un negativo
|
|
6
|
+
* (que invertiría el signo del score).
|
|
7
|
+
*/
|
|
8
|
+
export const FACTOR_DECAY_MIN = 0.01;
|
|
9
|
+
/**
|
|
10
|
+
* Deterministically stringifies an object for signing.
|
|
11
|
+
*/
|
|
12
|
+
function canonicalStringify(obj) {
|
|
13
|
+
if (obj === null || typeof obj !== "object") {
|
|
14
|
+
return JSON.stringify(obj);
|
|
15
|
+
}
|
|
16
|
+
if (Array.isArray(obj)) {
|
|
17
|
+
return "[" + obj.map(canonicalStringify).join(",") + "]";
|
|
18
|
+
}
|
|
19
|
+
const keys = Object.keys(obj).sort();
|
|
20
|
+
return ("{" +
|
|
21
|
+
keys
|
|
22
|
+
.map((k) => `${JSON.stringify(k)}:${canonicalStringify(obj[k])}`)
|
|
23
|
+
.join(",") +
|
|
24
|
+
"}");
|
|
25
|
+
}
|
|
26
|
+
export class KarmaManager {
|
|
27
|
+
oplog;
|
|
28
|
+
identity;
|
|
29
|
+
cache = new Map();
|
|
30
|
+
resolvePublicKey;
|
|
31
|
+
/** Claves públicas de pares conocidas por este nodo. */
|
|
32
|
+
clavesConocidas = new Map();
|
|
33
|
+
/** Ids de transacciones ya aplicadas, para reenvío idempotente del OpLog. */
|
|
34
|
+
aplicadas = new Set();
|
|
35
|
+
constructor(oplog, identity, getPublicKey) {
|
|
36
|
+
this.oplog = oplog;
|
|
37
|
+
this.identity = identity;
|
|
38
|
+
this.resolvePublicKey = getPublicKey;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Registra la clave pública con la que firma un nodo, para que sus avales
|
|
42
|
+
* puedan verificarse localmente. La llama la capa de replicación cuando un
|
|
43
|
+
* par se anuncia.
|
|
44
|
+
*/
|
|
45
|
+
registrarClavePublica(nodoId, parPublico) {
|
|
46
|
+
this.clavesConocidas.set(nodoId, parPublico);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Carga el estado de karma desde el OpLog.
|
|
50
|
+
* Debe llamarse después de crear la instancia.
|
|
51
|
+
*
|
|
52
|
+
* Las entradas que ya no cumplen las reglas se omiten en vez de aplicarse:
|
|
53
|
+
* es un fallo cerrado deliberado, y significa que el historial sin firma
|
|
54
|
+
* escrito antes de este arreglo se descarta en lugar de confiarse.
|
|
55
|
+
*
|
|
56
|
+
* @param keepExistingCache - cuando es `true` (documento restaurado desde
|
|
57
|
+
* snapshot) el cache y el registro de aplicadas se conservan, porque
|
|
58
|
+
* borrarlos reprocesaría sobre un score ya restaurado y lo duplicaría.
|
|
59
|
+
*/
|
|
60
|
+
async loadFromOpLog(keepExistingCache = false) {
|
|
61
|
+
await this.oplog.cargarDesdeStorage();
|
|
62
|
+
if (!keepExistingCache) {
|
|
63
|
+
this.cache.clear();
|
|
64
|
+
this.aplicadas.clear();
|
|
65
|
+
}
|
|
66
|
+
const ops = await this.oplog.obtenerTodas();
|
|
67
|
+
for (const op of ops) {
|
|
68
|
+
if (op.tipo === "karma:emit") {
|
|
69
|
+
const tx = op.datos;
|
|
70
|
+
await this.applyTransaction(tx);
|
|
71
|
+
}
|
|
72
|
+
else if (op.tipo === "karma:decay") {
|
|
73
|
+
const data = op.datos;
|
|
74
|
+
this.applyDecayToCache(data.sujeto, data.factor);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Emite una transacción de karma firmada con la identidad PQC del nodo.
|
|
80
|
+
*
|
|
81
|
+
* Si la firma falla es fatal: una transacción sin firma nunca se emite ni se
|
|
82
|
+
* persiste. Reputación sin prueba no es reputación.
|
|
83
|
+
*
|
|
84
|
+
* La transacción se valida antes de llegar al OpLog, así que una entrada
|
|
85
|
+
* inválida tampoco puede ser reenviada por un par.
|
|
86
|
+
*/
|
|
87
|
+
async emit(txData) {
|
|
88
|
+
const timestamp = txData.timestamp ?? Date.now();
|
|
89
|
+
const id = txData.id ??
|
|
90
|
+
`${txData.emisor}:${timestamp}:${Math.random().toString(36).substring(2, 9)}`;
|
|
91
|
+
const payloadData = {
|
|
92
|
+
tipo: txData.tipo,
|
|
93
|
+
proyecto: txData.proyecto,
|
|
94
|
+
sujeto: txData.sujeto,
|
|
95
|
+
delta: txData.delta,
|
|
96
|
+
razon: txData.razon,
|
|
97
|
+
emisor: txData.emisor,
|
|
98
|
+
id,
|
|
99
|
+
timestamp,
|
|
100
|
+
};
|
|
101
|
+
const payload = canonicalStringify(payloadData);
|
|
102
|
+
let firma;
|
|
103
|
+
if (txData.firma) {
|
|
104
|
+
firma = txData.firma;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Sin respaldo a firma vacía: si la identidad PQC no puede firmar, el
|
|
108
|
+
// resultado correcto es una emisión rechazada, no un score inverificable.
|
|
109
|
+
firma = await this.identity.firmar(new TextEncoder().encode(payload));
|
|
110
|
+
}
|
|
111
|
+
const tx = {
|
|
112
|
+
...txData,
|
|
113
|
+
id,
|
|
114
|
+
timestamp,
|
|
115
|
+
firma,
|
|
116
|
+
};
|
|
117
|
+
const motivo = await this.applyTransaction(tx);
|
|
118
|
+
if (motivo !== null) {
|
|
119
|
+
throw new Error(`Karma transaction rejected (${motivo}): ${id}`);
|
|
120
|
+
}
|
|
121
|
+
await this.oplog.append("karma:emit", tx, txData.emisor);
|
|
122
|
+
return tx;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Aplica una transacción recibida de otro nodo aplicando todas las reglas de
|
|
126
|
+
* validación. Devuelve `null` cuando se aplicó, o el {@link MotivoRechazo}
|
|
127
|
+
* cuando se rechazó.
|
|
128
|
+
*
|
|
129
|
+
* Esta es la entrada que la capa de replicación debe usar para avales remotos.
|
|
130
|
+
*/
|
|
131
|
+
async aplicarTransaccion(tx) {
|
|
132
|
+
return this.applyTransaction(tx);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Obtiene el score de karma de un nodo.
|
|
136
|
+
*/
|
|
137
|
+
getScore(nodeId) {
|
|
138
|
+
return this.cache.get(nodeId)?.total ?? 0;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Obtiene el historial de transacciones de un nodo. Cada entrada conserva su
|
|
142
|
+
* firma original, así que cualquier aval pasado puede reverificarse por separado.
|
|
143
|
+
*/
|
|
144
|
+
getHistory(nodeId) {
|
|
145
|
+
return this.cache.get(nodeId)?.historial ?? [];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Aplica decay (olvido) al score de un nodo, o a todos si no se especifica.
|
|
149
|
+
* - factor: 0.95 reduce 5%, 0.90 reduce 10%, etc.
|
|
150
|
+
*
|
|
151
|
+
* Esta es la ÚNICA vía sancionada para que un score baje. Un nodo que deja de
|
|
152
|
+
* ser avalado pierde standing en vez de conservar una reputación que ya no se
|
|
153
|
+
* gana. Rechaza factores fuera de rango en lugar de corromper el score.
|
|
154
|
+
*/
|
|
155
|
+
async applyDecay(nodeId, factor = 0.95) {
|
|
156
|
+
if (nodeId !== undefined) {
|
|
157
|
+
if (!this.factorValido(factor))
|
|
158
|
+
return;
|
|
159
|
+
this.applyDecayToCache(nodeId, factor);
|
|
160
|
+
await this.oplog.append("karma:decay", { sujeto: nodeId, factor }, nodeId);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
for (const id of this.cache.keys()) {
|
|
164
|
+
const nid = id;
|
|
165
|
+
if (!this.factorValido(factor))
|
|
166
|
+
return;
|
|
167
|
+
this.applyDecayToCache(nid, factor);
|
|
168
|
+
await this.oplog.append("karma:decay", { sujeto: nid, factor }, nid);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Verifica una firma de transacción contra una clave pública.
|
|
174
|
+
*/
|
|
175
|
+
async verify(tx, publicKey) {
|
|
176
|
+
if (!tx || !ArrayBuffer.isView(tx.firma) || tx.firma.length === 0)
|
|
177
|
+
return false;
|
|
178
|
+
const pub = publicKey ??
|
|
179
|
+
(this.resolvePublicKey
|
|
180
|
+
? this.resolvePublicKey(tx.emisor)
|
|
181
|
+
: this.clavePublicaDe(tx.emisor));
|
|
182
|
+
if (!pub) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
const { firma, ...rest } = tx;
|
|
186
|
+
const payload = canonicalStringify(rest);
|
|
187
|
+
return this.identity.verificar(new TextEncoder().encode(payload), firma, pub);
|
|
188
|
+
}
|
|
189
|
+
// ─── INTERNOS ───────────────────────────────────────────────────────
|
|
190
|
+
/**
|
|
191
|
+
* Devuelve el peer con mejor karma en la mesh (para asignación de trabajo).
|
|
192
|
+
* Si no hay peers con karma registrado, devuelve null.
|
|
193
|
+
*/
|
|
194
|
+
getBestPeer() {
|
|
195
|
+
let best = null;
|
|
196
|
+
let bestScore = Number.NEGATIVE_INFINITY;
|
|
197
|
+
for (const [nodeId, karma] of this.cache.entries()) {
|
|
198
|
+
if (karma.total > bestScore) {
|
|
199
|
+
best = nodeId;
|
|
200
|
+
bestScore = karma.total;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return best;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Valida una transacción y, solo si pasa todas las reglas, la incorpora al
|
|
207
|
+
* cache. Devuelve `null` si todo va bien o el motivo del rechazo si falla.
|
|
208
|
+
*
|
|
209
|
+
* El orden importa: las comprobaciones estructurales baratas corren antes de la
|
|
210
|
+
* verificación de firma, así que una transacción claramente malformada nunca
|
|
211
|
+
* cuesta una operación PQC.
|
|
212
|
+
*/
|
|
213
|
+
async applyTransaction(tx) {
|
|
214
|
+
if (!tx || typeof tx !== "object")
|
|
215
|
+
return "firma_invalida";
|
|
216
|
+
// Un nodo avalándose a sí mismo es el ataque más valioso: no necesita
|
|
217
|
+
// ninguna otra clave comprometida y otorga reputación sin límite gratis.
|
|
218
|
+
if (tx.emisor === tx.sujeto)
|
|
219
|
+
return "auto_emision";
|
|
220
|
+
// La reputación solo la otorga el aval positivo de un par. Los deltas
|
|
221
|
+
// negativos se rechazan a propósito: una penalización dirigida es una
|
|
222
|
+
// primitiva de harassment (cualquier par podría enterrar la reputación de
|
|
223
|
+
// un competidor), así que el decay es la única vía que baja un score y es
|
|
224
|
+
// uniforme, gradual e imposible de dirigir.
|
|
225
|
+
if (typeof tx.delta !== "number" ||
|
|
226
|
+
!Number.isFinite(tx.delta) ||
|
|
227
|
+
tx.delta <= 0) {
|
|
228
|
+
return "delta_no_positivo";
|
|
229
|
+
}
|
|
230
|
+
if (tx.delta > DELTA_MAX_ABS)
|
|
231
|
+
return "delta_sobre_techo";
|
|
232
|
+
if (!tx.firma || !ArrayBuffer.isView(tx.firma) || tx.firma.length === 0) {
|
|
233
|
+
return "firma_vacia";
|
|
234
|
+
}
|
|
235
|
+
// Protección contra reenvío: la misma atestación reenviada desde el OpLog no
|
|
236
|
+
// debe contarse dos veces.
|
|
237
|
+
if (this.aplicadas.has(tx.id))
|
|
238
|
+
return null;
|
|
239
|
+
const parPublico = this.clavePublicaDe(tx.emisor);
|
|
240
|
+
if (!parPublico)
|
|
241
|
+
return "emisor_desconocido";
|
|
242
|
+
const firmaValida = await this.verify(tx, parPublico);
|
|
243
|
+
if (!firmaValida)
|
|
244
|
+
return "firma_invalida";
|
|
245
|
+
const target = tx.sujeto;
|
|
246
|
+
const current = this.cache.get(target) ?? {
|
|
247
|
+
total: 0,
|
|
248
|
+
historial: [],
|
|
249
|
+
pesosPorProyecto: {},
|
|
250
|
+
ultimoDecay: Date.now(),
|
|
251
|
+
};
|
|
252
|
+
this.cache.set(target, {
|
|
253
|
+
total: current.total + tx.delta,
|
|
254
|
+
historial: [...current.historial, tx],
|
|
255
|
+
pesosPorProyecto: {
|
|
256
|
+
...current.pesosPorProyecto,
|
|
257
|
+
[tx.proyecto]: (current.pesosPorProyecto[tx.proyecto] ?? 0) + tx.delta,
|
|
258
|
+
},
|
|
259
|
+
ultimoDecay: current.ultimoDecay,
|
|
260
|
+
});
|
|
261
|
+
this.aplicadas.add(tx.id);
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
clavePublicaDe(emisor) {
|
|
265
|
+
const registrada = this.clavesConocidas.get(emisor);
|
|
266
|
+
if (registrada)
|
|
267
|
+
return registrada;
|
|
268
|
+
const resuelta = this.resolvePublicKey?.(emisor);
|
|
269
|
+
if (resuelta)
|
|
270
|
+
return resuelta;
|
|
271
|
+
// Una transacción que dice venir de este mismo nodo se verifica contra su
|
|
272
|
+
// propia clave: por definición es la clave correcta, y permite avalar a un
|
|
273
|
+
// par sin consultar ningún registro.
|
|
274
|
+
if (emisor === this.identity.nodoId)
|
|
275
|
+
return this.identity.exportarPublico();
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
static factorValido(factor) {
|
|
279
|
+
return (typeof factor === "number" &&
|
|
280
|
+
Number.isFinite(factor) &&
|
|
281
|
+
factor >= FACTOR_DECAY_MIN &&
|
|
282
|
+
factor <= 1);
|
|
283
|
+
}
|
|
284
|
+
factorValido(factor) {
|
|
285
|
+
return KarmaManager.factorValido(factor);
|
|
286
|
+
}
|
|
287
|
+
applyDecayToCache(nodeId, factor) {
|
|
288
|
+
if (!KarmaManager.factorValido(factor))
|
|
289
|
+
return;
|
|
290
|
+
const current = this.cache.get(nodeId);
|
|
291
|
+
if (!current)
|
|
292
|
+
return;
|
|
293
|
+
// Los pesos por proyecto decaen junto con el total; si no, las dos vistas
|
|
294
|
+
// divergen y un nodo decaído sigue viendo fuerza en su desglose.
|
|
295
|
+
const pesosPorProyecto = {};
|
|
296
|
+
for (const [proyecto, peso] of Object.entries(current.pesosPorProyecto)) {
|
|
297
|
+
pesosPorProyecto[proyecto] = peso * factor;
|
|
298
|
+
}
|
|
299
|
+
this.cache.set(nodeId, {
|
|
300
|
+
...current,
|
|
301
|
+
total: Math.max(0, current.total * factor),
|
|
302
|
+
pesosPorProyecto,
|
|
303
|
+
ultimoDecay: Date.now(),
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=karma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"karma.js","sourceRoot":"","sources":["../../src/maloca/karma.ts"],"names":[],"mappings":"AA2CA,mDAAmD;AACnD,MAAM,CAAC,MAAM,aAAa,GAAG,EAAW,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAa,CAAC;AAwC9C;;GAEG;AACH,SAAS,kBAAkB,CAAC,GAAY;IACvC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC1D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,OAAO,CACN,GAAG;QACH,IAAI;aACF,GAAG,CACH,CAAC,CAAC,EAAE,EAAE,CACL,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAE,GAA+B,CAAC,CAAC,CAAC,CAAC,EAAE,CAClF;aACA,IAAI,CAAC,GAAG,CAAC;QACX,GAAG,CACH,CAAC;AACH,CAAC;AAED,MAAM,OAAO,YAAY;IACP,KAAK,CAAQ;IACb,QAAQ,CAAsB;IACvC,KAAK,GAAuB,IAAI,GAAG,EAAE,CAAC;IAC7B,gBAAgB,CAEL;IAC5B,wDAAwD;IACvC,eAAe,GAA4B,IAAI,GAAG,EAAE,CAAC;IACtE,6EAA6E;IAC5D,SAAS,GAAgB,IAAI,GAAG,EAAE,CAAC;IAEpD,YACC,KAAY,EACZ,QAA6B,EAC7B,YAAyD;QAEzD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACH,qBAAqB,CAAC,MAAc,EAAE,UAAsB;QAC3D,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,aAAa,CAAC,iBAAiB,GAAG,KAAK;QAC5C,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;QACtC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC5C,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,MAAM,EAAE,GAAG,EAAE,CAAC,KAAyB,CAAC;gBACxC,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,EAAE,CAAC,KAA2C,CAAC;gBAC5D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CACT,MAC8D;QAE9D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACjD,MAAM,EAAE,GACP,MAAM,CAAC,EAAE;YACT,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAE/E,MAAM,WAAW,GAAG;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,EAAE;YACF,SAAS;SACT,CAAC;QACF,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,KAAiB,CAAC;QACtB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;aAAM,CAAC;YACP,sEAAsE;YACtE,0EAA0E;YAC1E,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,EAAE,GAAqB;YAC5B,GAAG,MAAM;YACT,EAAE;YACF,SAAS;YACT,KAAK;SACL,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,MAAM,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,EAAE,MAAM,CAAC,MAAa,CAAC,CAAC;QAChE,OAAO,EAAE,CAAC;IACX,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,kBAAkB,CACvB,EAAoB;QAEpB,OAAO,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,MAAc;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,MAAc;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IAChD,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,UAAU,CAAC,MAAe,EAAE,MAAM,GAAW,IAAI;QACtD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;gBAAE,OAAO;YACvC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACvC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CACtB,aAAa,EACb,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAC1B,MAAa,CACb,CAAC;QACH,CAAC;aAAM,CAAC;YACP,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBACpC,MAAM,GAAG,GAAG,EAAY,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;oBAAE,OAAO;gBACvC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACpC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CACtB,aAAa,EACb,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EACvB,GAAU,CACV,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAoB,EAAE,SAAsB;QACxD,IAAI,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAChE,OAAO,KAAK,CAAC;QACd,MAAM,GAAG,GACR,SAAS;YACT,CAAC,IAAI,CAAC,gBAAgB;gBACrB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAC7B,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EACjC,KAAK,EACL,GAAG,CACH,CAAC;IACH,CAAC;IAED,uEAAuE;IAEvE;;;OAGG;IACH,WAAW;QACV,IAAI,IAAI,GAAkB,IAAI,CAAC;QAC/B,IAAI,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACzC,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,IAAI,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,CAAC;gBAC7B,IAAI,GAAG,MAAgB,CAAC;gBACxB,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;YACzB,CAAC;QACF,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,gBAAgB,CAC7B,EAAoB;QAEpB,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,OAAO,gBAAgB,CAAC;QAE3D,sEAAsE;QACtE,yEAAyE;QACzE,IAAI,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM;YAAE,OAAO,cAAc,CAAC;QAEnD,sEAAsE;QACtE,sEAAsE;QACtE,0EAA0E;QAC1E,0EAA0E;QAC1E,4CAA4C;QAC5C,IACC,OAAO,EAAE,CAAC,KAAK,KAAK,QAAQ;YAC5B,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC;YAC1B,EAAE,CAAC,KAAK,IAAI,CAAC,EACZ,CAAC;YACF,OAAO,mBAAmB,CAAC;QAC5B,CAAC;QACD,IAAI,EAAE,CAAC,KAAK,GAAG,aAAa;YAAE,OAAO,mBAAmB,CAAC;QAEzD,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzE,OAAO,aAAa,CAAC;QACtB,CAAC;QAED,6EAA6E;QAC7E,2BAA2B;QAC3B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3C,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU;YAAE,OAAO,oBAAoB,CAAC;QAE7C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW;YAAE,OAAO,gBAAgB,CAAC;QAE1C,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI;YACzC,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,EAAE;YACb,gBAAgB,EAAE,EAAE;YACpB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACvB,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK;YAC/B,SAAS,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;YACrC,gBAAgB,EAAE;gBACjB,GAAG,OAAO,CAAC,gBAAgB;gBAC3B,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;aACtE;YACD,WAAW,EAAE,OAAO,CAAC,WAAW;SAChC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACb,CAAC;IAEO,cAAc,CAAC,MAAc;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,0EAA0E;QAC1E,2EAA2E;QAC3E,qCAAqC;QACrC,IAAI,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC5E,OAAO,IAAI,CAAC;IACb,CAAC;IAEO,MAAM,CAAC,YAAY,CAAC,MAAc;QACzC,OAAO,CACN,OAAO,MAAM,KAAK,QAAQ;YAC1B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvB,MAAM,IAAI,gBAAgB;YAC1B,MAAM,IAAI,CAAC,CACX,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,MAAc;QAClC,OAAO,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAEO,iBAAiB,CAAC,MAAc,EAAE,MAAc;QACvD,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC;YAAE,OAAO;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,0EAA0E;QAC1E,iEAAiE;QACjE,MAAM,gBAAgB,GAA2B,EAAE,CAAC;QACpD,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACzE,gBAAgB,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;YACtB,GAAG,OAAO;YACV,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC;YAC1C,gBAAgB;YAChB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACvB,CAAC,CAAC;IACJ,CAAC;CACD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { EdgeMesh } from "../edge-mesh.js";
|
|
2
|
+
import type { EdgeMeshConfig, NodoId } from "../types/index.js";
|
|
3
|
+
import { KarmaManager, type TransaccionKarma } from "./karma.js";
|
|
4
|
+
import { MetadataManager } from "./metadata.js";
|
|
5
|
+
import { type Perfil, ProfileManager } from "./perfil.js";
|
|
6
|
+
export declare class MalocaKernel extends EdgeMesh {
|
|
7
|
+
readonly profiles: ProfileManager;
|
|
8
|
+
readonly karma: KarmaManager;
|
|
9
|
+
readonly metadata: MetadataManager;
|
|
10
|
+
private adapters;
|
|
11
|
+
constructor(config: EdgeMeshConfig);
|
|
12
|
+
iniciar(): Promise<void>;
|
|
13
|
+
registerNode(tipo: "humano" | "servicio", identidad: Uint8Array, metadatos: Record<string, any>): Promise<void>;
|
|
14
|
+
connectProject(projectId: string, adapter: any): void;
|
|
15
|
+
broadcastToNetwork(evento: any): Promise<void>;
|
|
16
|
+
getNetworkStatus(): any;
|
|
17
|
+
getProfile(nodeId: NodoId): Perfil | undefined;
|
|
18
|
+
emitKarma(tx: Omit<TransaccionKarma, "firma" | "timestamp" | "id">): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=kernel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../../src/maloca/kernel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,KAAK,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE1D,qBAAa,YAAa,SAAQ,QAAQ;IACzC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,OAAO,CAAC,QAAQ,CAA+B;IAE/C,YAAY,MAAM,EAAE,cAAc,EAuBjC;IAEc,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAKtC;IAEK,YAAY,CACjB,IAAI,EAAE,QAAQ,GAAG,UAAU,EAC3B,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAoBf;IAED,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,CAEpD;IAEK,kBAAkB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnD;IAED,gBAAgB,IAAI,GAAG,CAOtB;IAED,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE7C;IAEK,SAAS,CACd,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAAC,GACtD,OAAO,CAAC,IAAI,CAAC,CAEf;CACD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { EdgeMesh } from "../edge-mesh.js";
|
|
2
|
+
import { KarmaManager } from "./karma.js";
|
|
3
|
+
import { MetadataManager } from "./metadata.js";
|
|
4
|
+
import { ProfileManager } from "./perfil.js";
|
|
5
|
+
export class MalocaKernel extends EdgeMesh {
|
|
6
|
+
profiles;
|
|
7
|
+
karma;
|
|
8
|
+
metadata;
|
|
9
|
+
adapters = new Map();
|
|
10
|
+
constructor(config) {
|
|
11
|
+
super(config);
|
|
12
|
+
const profileOpLog = this.obtenerOLog("maloca_profiles");
|
|
13
|
+
this.profiles = new ProfileManager(profileOpLog);
|
|
14
|
+
const karmaOpLog = this.obtenerOLog("maloca_karma");
|
|
15
|
+
this.karma = new KarmaManager(karmaOpLog, this.identity, (nodeId) => this.obtenerClavePublica(nodeId));
|
|
16
|
+
// El MeshManager se construyo en el constructor de EdgeMesh, antes de que
|
|
17
|
+
// existiera este motor. Conectarlo aqui es lo que hace que un aval remoto
|
|
18
|
+
// llegue al unico motor que sabe verificarlo: sin esto, `procesarGossip`
|
|
19
|
+
// receive el aval y lo ignora, y la reputacion nunca sale del disco local.
|
|
20
|
+
this.meshGossip.setConsumidorKarma(this.karma);
|
|
21
|
+
const metadataOpLog = this.obtenerOLog("maloca_metadata");
|
|
22
|
+
this.metadata = new MetadataManager(this.yjsAdapter, this.presence, metadataOpLog);
|
|
23
|
+
}
|
|
24
|
+
async iniciar() {
|
|
25
|
+
await super.iniciar();
|
|
26
|
+
await this.profiles.loadProfiles(this.snapshotRestored);
|
|
27
|
+
await this.karma.loadFromOpLog(this.snapshotRestored);
|
|
28
|
+
await this.metadata.syncMetadata();
|
|
29
|
+
}
|
|
30
|
+
async registerNode(tipo, identidad, metadatos) {
|
|
31
|
+
if (tipo === "humano") {
|
|
32
|
+
const perfil = {
|
|
33
|
+
id: this.config.nodoId,
|
|
34
|
+
identidad,
|
|
35
|
+
alias: metadatos.alias || "Anónimo",
|
|
36
|
+
nodos: [this.config.nodoId],
|
|
37
|
+
proyectos: [],
|
|
38
|
+
metadatos,
|
|
39
|
+
};
|
|
40
|
+
await this.profiles.upsertProfile(perfil, this.config.nodoId);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const perfil = {
|
|
44
|
+
id: this.config.nodoId,
|
|
45
|
+
tipo: metadatos.tipo || "servicio",
|
|
46
|
+
version: metadatos.version || "1.0.0",
|
|
47
|
+
capacidades: metadatos.capacidades || [],
|
|
48
|
+
};
|
|
49
|
+
await this.profiles.upsertProfile(perfil, this.config.nodoId);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
connectProject(projectId, adapter) {
|
|
53
|
+
this.adapters.set(projectId, adapter);
|
|
54
|
+
}
|
|
55
|
+
async broadcastToNetwork(evento) {
|
|
56
|
+
await this.transmitir({
|
|
57
|
+
tipo: "maloca_evento",
|
|
58
|
+
payload: evento,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
getNetworkStatus() {
|
|
62
|
+
return {
|
|
63
|
+
nodoId: this.config.nodoId,
|
|
64
|
+
peers: this.presence.obtenerNodosActivos(),
|
|
65
|
+
proyectosConectados: Array.from(this.adapters.keys()),
|
|
66
|
+
perfilesRegistrados: this.profiles.listProfiles().length,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
getProfile(nodeId) {
|
|
70
|
+
return this.profiles.getProfile(nodeId);
|
|
71
|
+
}
|
|
72
|
+
async emitKarma(tx) {
|
|
73
|
+
await this.karma.emit(tx);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=kernel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel.js","sourceRoot":"","sources":["../../src/maloca/kernel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { YjsAdapter } from "../edge-mesh.js";
|
|
2
|
+
import type { OpLog } from "../op-log/index.js";
|
|
3
|
+
import type { PresenceManager } from "../presence/index.js";
|
|
4
|
+
import type { MetadatosCompartidos } from "./types.js";
|
|
5
|
+
export declare class MetadataManager {
|
|
6
|
+
private readonly yjs;
|
|
7
|
+
private readonly presence;
|
|
8
|
+
private readonly metadataMap;
|
|
9
|
+
private readonly oplog?;
|
|
10
|
+
constructor(yjs: YjsAdapter, presence: PresenceManager, oplog?: OpLog);
|
|
11
|
+
getNetworkStatus(): {
|
|
12
|
+
nodosActivos: number;
|
|
13
|
+
totalNodos: number;
|
|
14
|
+
latencias: {
|
|
15
|
+
id: import("../index.js").NodoId;
|
|
16
|
+
latencia: number | null;
|
|
17
|
+
}[];
|
|
18
|
+
latenciaPromedio: number;
|
|
19
|
+
topologia: "mesh-p2p";
|
|
20
|
+
timestamp: number;
|
|
21
|
+
};
|
|
22
|
+
getProfileCache(): {
|
|
23
|
+
count: number;
|
|
24
|
+
lastUpdate: number;
|
|
25
|
+
};
|
|
26
|
+
syncMetadata(key?: string, value?: any): Promise<void>;
|
|
27
|
+
getProjectInfo(projectId: string): {} | null;
|
|
28
|
+
getSharedMetadata(): MetadatosCompartidos;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/maloca/metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAQ;IAE/B,YAAY,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,KAAK,EAKpE;IAED,gBAAgB;;;;;;;;mBAuBH,UAAU;;MAGtB;IAED,eAAe;QAGb,KAAK;QACL,UAAU;MAEX;IAEK,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB3D;IAED,cAAc,CAAC,SAAS,EAAE,MAAM,aAI/B;IAED,iBAAiB,IAAI,oBAAoB,CAcxC;CACD"}
|