@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,228 @@
|
|
|
1
|
+
import { TokenBucketRateLimiter } from "../../security/rate-limiter.js";
|
|
2
|
+
/**
|
|
3
|
+
* REST API Gateway para el mesh Maloca.
|
|
4
|
+
*
|
|
5
|
+
* ── ALCANCE: SOLO LECTURA RESPECTO A LA REPUTACIÓN ─────────────────────────
|
|
6
|
+
* Todo valor de reputación que se expone aqui (perfiles, karma) se LEE del unico
|
|
7
|
+
* motor real (`KarmaManager`, conectado como `mesh.karma` por `MalocaKernel`). El
|
|
8
|
+
* gateway nunca recalcula un score con sus propias reglas ni inventa una base.
|
|
9
|
+
*
|
|
10
|
+
* Un nodo sin historial de karma firmado reporta `0` / `unrated`. NO se le
|
|
11
|
+
* regala una puntuacion inicial gratuita: la reputación se gana con transacciones
|
|
12
|
+
* validadas.
|
|
13
|
+
*
|
|
14
|
+
* NOTA DE SEGURIDAD (redes medicas): la reputación es una señal sobre el
|
|
15
|
+
* historial, no sobre el derecho de acceso. La verificacion de credenciales
|
|
16
|
+
* (`identidad` / atestacion de registro) es lo que da acceso a datos de pacientes.
|
|
17
|
+
* Esta API es de solo lectura y no concede nada.
|
|
18
|
+
*/
|
|
19
|
+
export class MalocaGatewayAPI {
|
|
20
|
+
mesh;
|
|
21
|
+
rateLimiter = new TokenBucketRateLimiter({
|
|
22
|
+
tokensPerInterval: 60,
|
|
23
|
+
intervalMs: 1000,
|
|
24
|
+
maxTokens: 100,
|
|
25
|
+
});
|
|
26
|
+
constructor(mesh) {
|
|
27
|
+
this.mesh = mesh;
|
|
28
|
+
}
|
|
29
|
+
checkRateLimit(clientIp) {
|
|
30
|
+
if (!this.rateLimiter.consume(clientIp)) {
|
|
31
|
+
console.warn(`Rate limit exceeded for IP/peer: ${clientIp} on Gateway API`);
|
|
32
|
+
throw new Error("Rate limit exceeded: 429");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* GET /mesh/status
|
|
37
|
+
*/
|
|
38
|
+
async getMeshStatus(clientIp = "127.0.0.1") {
|
|
39
|
+
this.checkRateLimit(clientIp);
|
|
40
|
+
const nodes = this.mesh.presence.obtenerNodosActivos();
|
|
41
|
+
return {
|
|
42
|
+
status: "online",
|
|
43
|
+
totalNodes: nodes.length,
|
|
44
|
+
activeNodes: nodes,
|
|
45
|
+
config: {
|
|
46
|
+
nodoId: this.mesh.config.nodoId,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* GET /profiles/:id
|
|
52
|
+
*/
|
|
53
|
+
async getProfile(id, clientIp = "127.0.0.1") {
|
|
54
|
+
this.checkRateLimit(clientIp);
|
|
55
|
+
const profiles = this.mesh.yjsAdapter.getMap("maloca:profiles");
|
|
56
|
+
const profileData = profiles.get(id);
|
|
57
|
+
if (!profileData) {
|
|
58
|
+
return {
|
|
59
|
+
id,
|
|
60
|
+
alias: `Nodo ${id.slice(0, 4)}`,
|
|
61
|
+
karma: await this.getKarmaValue(id),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
...profileData,
|
|
66
|
+
id,
|
|
67
|
+
karma: await this.getKarmaValue(id),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* POST /profiles
|
|
72
|
+
*/
|
|
73
|
+
async registerProfile(profile, clientIp = "127.0.0.1") {
|
|
74
|
+
this.checkRateLimit(clientIp);
|
|
75
|
+
const profiles = this.mesh.yjsAdapter.getMap("maloca:profiles");
|
|
76
|
+
profiles.set(this.mesh.config.nodoId, {
|
|
77
|
+
...profile,
|
|
78
|
+
updatedAt: Date.now(),
|
|
79
|
+
});
|
|
80
|
+
return {
|
|
81
|
+
success: true,
|
|
82
|
+
profile,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* GET /karma/:id
|
|
87
|
+
*
|
|
88
|
+
* Vista de SOLO LECTURA de la reputación. El score y la banda vienen ambos del
|
|
89
|
+
* motor real. Nada de aqui concede acceso a datos clínicos — eso lo concede la
|
|
90
|
+
* verificacion de credenciales.
|
|
91
|
+
*/
|
|
92
|
+
async getKarma(id, clientIp = "127.0.0.1") {
|
|
93
|
+
this.checkRateLimit(clientIp);
|
|
94
|
+
const karmaValue = await this.getKarmaValue(id);
|
|
95
|
+
return {
|
|
96
|
+
nodoId: id,
|
|
97
|
+
karma: karmaValue,
|
|
98
|
+
reputacion: this.calculateReputation(karmaValue),
|
|
99
|
+
// Invariante explicito para el mesh medico: la reputación es
|
|
100
|
+
// informativa. Quien consuma esto NO debe tratar `reputacion` como un
|
|
101
|
+
// derecho a tratar pacientes.
|
|
102
|
+
autorizaAcceso: false,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* POST /karma/emit
|
|
107
|
+
*
|
|
108
|
+
* Escribe un evento de karma SIN FIRMAR en el log Yjs compartido, para
|
|
109
|
+
* mostrarlo en el panel/clasificacion. NO toca el motor de reputación: el
|
|
110
|
+
* score que devuelven `getKarma`/`getProfile` no le afecta.
|
|
111
|
+
*
|
|
112
|
+
* Justificacion: ese log sin firma lo sigue leyendo
|
|
113
|
+
* `MalocaDashboard.getKarmaValue` para su clasificacion, asi que quitar aqui
|
|
114
|
+
* el escritor romperia ese archivo (fuera del alcance de este cambio). El
|
|
115
|
+
* camino autoritativo es `MalocaKernel.emitKarma` -> `KarmaManager.emit`, que
|
|
116
|
+
* firma con la identidad PQC del nodo.
|
|
117
|
+
*
|
|
118
|
+
* TODO(owner): unificar ambos caminos cuando el dashboard migre fuera del
|
|
119
|
+
* array Yjs crudo.
|
|
120
|
+
*/
|
|
121
|
+
async emitKarma(transaction, clientIp = "127.0.0.1") {
|
|
122
|
+
this.checkRateLimit(clientIp);
|
|
123
|
+
const karmaLogs = this.mesh.yjsAdapter.getArray("maloca:karma:txs");
|
|
124
|
+
const tx = {
|
|
125
|
+
from: this.mesh.config.nodoId,
|
|
126
|
+
...transaction,
|
|
127
|
+
timestamp: Date.now(),
|
|
128
|
+
};
|
|
129
|
+
karmaLogs.push([tx]);
|
|
130
|
+
return {
|
|
131
|
+
txId: Math.random().toString(36).substring(7),
|
|
132
|
+
...tx,
|
|
133
|
+
// Quien llame no debe suponer que esto afetó al score.
|
|
134
|
+
afectaReputacion: false,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* GET /plugins
|
|
139
|
+
*/
|
|
140
|
+
async getPlugins(clientIp = "127.0.0.1") {
|
|
141
|
+
this.checkRateLimit(clientIp);
|
|
142
|
+
// Lista de plugins activos basada en configuración o estado dinámico
|
|
143
|
+
return [
|
|
144
|
+
{ id: "core", status: "active" },
|
|
145
|
+
{ id: "chat", status: "active" },
|
|
146
|
+
{ id: "governance", status: "active" },
|
|
147
|
+
{ id: "gateway", status: "active" },
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* POST /evidentia/notarize
|
|
152
|
+
*/
|
|
153
|
+
async notarizeDocument(doc, clientIp = "127.0.0.1") {
|
|
154
|
+
this.checkRateLimit(clientIp);
|
|
155
|
+
const notarizations = this.mesh.yjsAdapter.getMap("maloca:evidentia");
|
|
156
|
+
const entry = {
|
|
157
|
+
...doc,
|
|
158
|
+
timestamp: Date.now(),
|
|
159
|
+
author: this.mesh.config.nodoId,
|
|
160
|
+
};
|
|
161
|
+
notarizations.set(doc.hash, entry);
|
|
162
|
+
return {
|
|
163
|
+
notarized: true,
|
|
164
|
+
...entry,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
// --- Helpers ---
|
|
168
|
+
/**
|
|
169
|
+
* Resuelve el motor REAL de karma (`KarmaManager`) conectado a la malla.
|
|
170
|
+
*
|
|
171
|
+
* `MalocaKernel` expone `readonly karma: KarmaManager`. El gateway esta
|
|
172
|
+
* tipado contra el `EdgeMesh` base, asi que buscamos el accessor
|
|
173
|
+
* estructuralmente en vez de castear a ciegas. Cuando la malla es un
|
|
174
|
+
* `EdgeMesh` simple (sin kernel conectado) no hay motor que leer y reportamos
|
|
175
|
+
* "sin datos de reputacion" en vez de fabricar un score.
|
|
176
|
+
*/
|
|
177
|
+
getKarmaEngine() {
|
|
178
|
+
const mesh = this.mesh;
|
|
179
|
+
const engine = mesh.karma;
|
|
180
|
+
if (!engine || typeof engine !== "object")
|
|
181
|
+
return null;
|
|
182
|
+
const candidate = engine;
|
|
183
|
+
return typeof candidate.getScore === "function"
|
|
184
|
+
? engine
|
|
185
|
+
: null;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Lee el score de karma del motor real.
|
|
189
|
+
*
|
|
190
|
+
* Un nodo sin historial devuelve 0 — nunca un valor base sintetico. Un motor
|
|
191
|
+
* ausente (EdgeMesh simple, kernel no conectado) tambien se reporta como 0,
|
|
192
|
+
* para que la API nunca pueda implicar standing no ganado.
|
|
193
|
+
*/
|
|
194
|
+
async getKarmaValue(id) {
|
|
195
|
+
const engine = this.getKarmaEngine();
|
|
196
|
+
if (engine === null)
|
|
197
|
+
return 0;
|
|
198
|
+
try {
|
|
199
|
+
const score = engine.getScore(id);
|
|
200
|
+
return Number.isFinite(score) ? score : 0;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// Motor presente pero ilegible: fallo cerrado a 0 en vez de inventar
|
|
204
|
+
// standing.
|
|
205
|
+
return 0;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Deriva una banda de PRESENTACION del score del motor real.
|
|
210
|
+
*
|
|
211
|
+
* El score es la fuente de verdad; esto solo lo agrupa para presentarlo.
|
|
212
|
+
* `unrated` se devuelve para un score cero, de modo que un nodo sin historial
|
|
213
|
+
* validado sea visiblemente no rated en vez de heredar el suelo "newcomer" de
|
|
214
|
+
* la antigua base-100.
|
|
215
|
+
*/
|
|
216
|
+
calculateReputation(karma) {
|
|
217
|
+
if (karma > 1000)
|
|
218
|
+
return "legendary";
|
|
219
|
+
if (karma > 500)
|
|
220
|
+
return "trusted";
|
|
221
|
+
if (karma > 100)
|
|
222
|
+
return "member";
|
|
223
|
+
if (karma > 0)
|
|
224
|
+
return "newcomer";
|
|
225
|
+
return "unrated";
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/maloca/gateway/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { TokenBucketRateLimiter } from "../../security/rate-limiter.js";
|
|
2
|
+
import type { ParPublico } from "../../types/index.js";
|
|
3
|
+
export declare const authRateLimiter: TokenBucketRateLimiter;
|
|
4
|
+
/**
|
|
5
|
+
* Autenticación vía firma PQC.
|
|
6
|
+
*/
|
|
7
|
+
export declare function loginWithPQC(firma: Uint8Array, publicKey: ParPublico, challenge?: Uint8Array, clientIp?: string): Promise<string | null>;
|
|
8
|
+
/**
|
|
9
|
+
* Genera un JWT para sesión externa usando HMAC-SHA256.
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateJWT(profileId: string): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* Verifica un JWT usando HMAC-SHA256.
|
|
14
|
+
*/
|
|
15
|
+
export declare function verifyToken(token: string): Promise<boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* Obtiene el perfil desde el token.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getProfileFromToken(token: string): Promise<string | null>;
|
|
20
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/maloca/gateway/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAiDvD,eAAO,MAAM,eAAe,wBAI1B,CAAC;AAOH;;GAEG;AACH,wBAAsB,YAAY,CACjC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,UAAU,EACrB,SAAS,GAAE,UAA+D,EAC1E,QAAQ,SAAc,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAexB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBpE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BjE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACxC,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { ml_dsa65 } from "@noble/post-quantum/ml-dsa.js";
|
|
2
|
+
import { TokenBucketRateLimiter } from "../../security/rate-limiter.js";
|
|
3
|
+
/**
|
|
4
|
+
* SSO Centralizado con identidad PQC + JWT
|
|
5
|
+
*/
|
|
6
|
+
// Helpers cross-platform (no Buffer/Node.js)
|
|
7
|
+
function bytesToHex(bytes) {
|
|
8
|
+
return Array.from(bytes)
|
|
9
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
10
|
+
.join("");
|
|
11
|
+
}
|
|
12
|
+
function base64url(bytes) {
|
|
13
|
+
return btoa(String.fromCharCode(...bytes))
|
|
14
|
+
.replace(/\+/g, "-")
|
|
15
|
+
.replace(/\//g, "_")
|
|
16
|
+
.replace(/=+$/, "");
|
|
17
|
+
}
|
|
18
|
+
function base64urlDecode(str) {
|
|
19
|
+
const base64 = str.replace(/-/g, "+").replace(/_/g, "/") +
|
|
20
|
+
"=".repeat((4 - (str.length % 4)) % 4);
|
|
21
|
+
return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
|
|
22
|
+
}
|
|
23
|
+
// HMAC-SHA256 via Web Crypto API
|
|
24
|
+
async function hmacSha256(secret, data) {
|
|
25
|
+
const subtle = crypto.subtle;
|
|
26
|
+
const key = await subtle.importKey("raw", secret, { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
27
|
+
const sig = await subtle.sign("HMAC", key, data);
|
|
28
|
+
return new Uint8Array(sig);
|
|
29
|
+
}
|
|
30
|
+
// Secreto para JWT
|
|
31
|
+
const JWT_SECRET = new TextEncoder().encode("maloca-gateway-default-secret-change-me");
|
|
32
|
+
export const authRateLimiter = new TokenBucketRateLimiter({
|
|
33
|
+
tokensPerInterval: 3,
|
|
34
|
+
intervalMs: 1000,
|
|
35
|
+
maxTokens: 5,
|
|
36
|
+
});
|
|
37
|
+
/** Deriva un profileId corto desde una clave pública PQC */
|
|
38
|
+
function deriveProfileId(publicKey) {
|
|
39
|
+
return bytesToHex(publicKey).slice(0, 16);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Autenticación vía firma PQC.
|
|
43
|
+
*/
|
|
44
|
+
export async function loginWithPQC(firma, publicKey, challenge = new TextEncoder().encode("maloca-login-challenge"), clientIp = "127.0.0.1") {
|
|
45
|
+
if (!authRateLimiter.consume(clientIp)) {
|
|
46
|
+
console.warn(`Rate limit exceeded for IP: ${clientIp} on Auth login`);
|
|
47
|
+
throw new Error("Rate limit exceeded: 429");
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const isValid = ml_dsa65.verify(firma, challenge, publicKey);
|
|
51
|
+
if (isValid) {
|
|
52
|
+
const profileId = deriveProfileId(publicKey);
|
|
53
|
+
return generateJWT(profileId);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error("PQC Auth Error:", error);
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Genera un JWT para sesión externa usando HMAC-SHA256.
|
|
63
|
+
*/
|
|
64
|
+
export async function generateJWT(profileId) {
|
|
65
|
+
const headerEncoded = base64url(new TextEncoder().encode(JSON.stringify({ alg: "HS256", typ: "JWT" })));
|
|
66
|
+
const payloadEncoded = base64url(new TextEncoder().encode(JSON.stringify({
|
|
67
|
+
sub: profileId,
|
|
68
|
+
iat: Math.floor(Date.now() / 1000),
|
|
69
|
+
exp: Math.floor(Date.now() / 1000) + 3600,
|
|
70
|
+
})));
|
|
71
|
+
const hmacResult = await hmacSha256(JWT_SECRET, new TextEncoder().encode(`${headerEncoded}.${payloadEncoded}`));
|
|
72
|
+
const signatureEncoded = base64url(hmacResult);
|
|
73
|
+
return `${headerEncoded}.${payloadEncoded}.${signatureEncoded}`;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Verifica un JWT usando HMAC-SHA256.
|
|
77
|
+
*/
|
|
78
|
+
export async function verifyToken(token) {
|
|
79
|
+
try {
|
|
80
|
+
const parts = token.split(".");
|
|
81
|
+
if (parts.length !== 3)
|
|
82
|
+
return false;
|
|
83
|
+
const [header, payload, signature] = parts;
|
|
84
|
+
const hmacResult = await hmacSha256(JWT_SECRET, new TextEncoder().encode(`${header}.${payload}`));
|
|
85
|
+
const expectedSignature = base64url(hmacResult);
|
|
86
|
+
if (signature !== expectedSignature)
|
|
87
|
+
return false;
|
|
88
|
+
// Verificar expiración
|
|
89
|
+
const decodedPayload = JSON.parse(new TextDecoder().decode(base64urlDecode(payload)));
|
|
90
|
+
if (decodedPayload.exp &&
|
|
91
|
+
decodedPayload.exp < Math.floor(Date.now() / 1000)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Obtiene el perfil desde el token.
|
|
102
|
+
*/
|
|
103
|
+
export async function getProfileFromToken(token) {
|
|
104
|
+
try {
|
|
105
|
+
if (!(await verifyToken(token)))
|
|
106
|
+
return null;
|
|
107
|
+
const parts = token.split(".");
|
|
108
|
+
const decodedPayload = JSON.parse(new TextDecoder().decode(base64urlDecode(parts[1])));
|
|
109
|
+
return decodedPayload.sub;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/maloca/gateway/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { EdgeMesh } from "../../edge-mesh.js";
|
|
2
|
+
/**
|
|
3
|
+
* Dashboard en tiempo real del estado de la red mesh.
|
|
4
|
+
*/
|
|
5
|
+
export declare class MalocaDashboard {
|
|
6
|
+
private readonly mesh;
|
|
7
|
+
constructor(mesh: EdgeMesh);
|
|
8
|
+
/**
|
|
9
|
+
* Retorna la topología actual de la red para visualización.
|
|
10
|
+
*/
|
|
11
|
+
getNetworkGraph(): Promise<{
|
|
12
|
+
nodes: {
|
|
13
|
+
id: import("../../index.js").NodoId;
|
|
14
|
+
status: string;
|
|
15
|
+
latency: number;
|
|
16
|
+
}[];
|
|
17
|
+
links: never[];
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Retorna el ranking de karma de la red.
|
|
21
|
+
*/
|
|
22
|
+
getKarmaLeaderboard(): Promise<{
|
|
23
|
+
id: import("../../index.js").NodoId;
|
|
24
|
+
karma: number;
|
|
25
|
+
}[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Retorna el estado de salud de todos los plugins/módulos.
|
|
28
|
+
*/
|
|
29
|
+
getPluginHealth(): Promise<{
|
|
30
|
+
core: string;
|
|
31
|
+
chat: string;
|
|
32
|
+
storage: string;
|
|
33
|
+
identity: string;
|
|
34
|
+
governance: string;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Retorna los nodos activos en este momento.
|
|
38
|
+
*/
|
|
39
|
+
getActiveNodes(): readonly import("../../index.js").NodoId[];
|
|
40
|
+
private getKarmaValue;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=dashboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/maloca/gateway/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AAEH,qBAAa,eAAe;IACf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,QAAQ,EAAI;IAE/C;;OAEG;IACG,eAAe;;;;;;;OAepB;IAED;;OAEG;IACG,mBAAmB;;;SAUxB;IAED;;OAEG;IACG,eAAe;;;;;;OAQpB;IAED;;OAEG;IACH,cAAc,+CAEb;YAEa,aAAa;CAQ3B"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard en tiempo real del estado de la red mesh.
|
|
3
|
+
*/
|
|
4
|
+
export class MalocaDashboard {
|
|
5
|
+
mesh;
|
|
6
|
+
constructor(mesh) {
|
|
7
|
+
this.mesh = mesh;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Retorna la topología actual de la red para visualización.
|
|
11
|
+
*/
|
|
12
|
+
async getNetworkGraph() {
|
|
13
|
+
const activeNodes = this.mesh.presence.obtenerNodosActivos();
|
|
14
|
+
const nodes = activeNodes.map((id) => {
|
|
15
|
+
const salud = this.mesh.presence.obtenerSalud(id);
|
|
16
|
+
return {
|
|
17
|
+
id,
|
|
18
|
+
status: salud?.estado ?? "online",
|
|
19
|
+
latency: salud?.latenciaMs ?? 0,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
nodes,
|
|
24
|
+
links: [], // En una implementación real, se deducen de los peers en MeshManager
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Retorna el ranking de karma de la red.
|
|
29
|
+
*/
|
|
30
|
+
async getKarmaLeaderboard() {
|
|
31
|
+
const activeNodes = this.mesh.presence.obtenerNodosActivos();
|
|
32
|
+
const leaderboard = [];
|
|
33
|
+
for (const id of activeNodes) {
|
|
34
|
+
const karma = await this.getKarmaValue(id);
|
|
35
|
+
leaderboard.push({ id, karma });
|
|
36
|
+
}
|
|
37
|
+
return leaderboard.sort((a, b) => b.karma - a.karma);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Retorna el estado de salud de todos los plugins/módulos.
|
|
41
|
+
*/
|
|
42
|
+
async getPluginHealth() {
|
|
43
|
+
return {
|
|
44
|
+
core: "healthy",
|
|
45
|
+
chat: "healthy",
|
|
46
|
+
storage: "healthy",
|
|
47
|
+
identity: "healthy",
|
|
48
|
+
governance: "healthy",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Retorna los nodos activos en este momento.
|
|
53
|
+
*/
|
|
54
|
+
getActiveNodes() {
|
|
55
|
+
return this.mesh.presence.obtenerNodosActivos();
|
|
56
|
+
}
|
|
57
|
+
async getKarmaValue(id) {
|
|
58
|
+
const karmaLogs = this.mesh.yjsAdapter.getArray("maloca:karma:txs");
|
|
59
|
+
let total = 100;
|
|
60
|
+
for (const tx of karmaLogs.toArray()) {
|
|
61
|
+
if (tx.to === id)
|
|
62
|
+
total += tx.amount;
|
|
63
|
+
}
|
|
64
|
+
return total;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/maloca/gateway/dashboard.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,MAAM,OAAO,eAAe;IACE,IAAI;IAAjC,YAA6B,IAAc;oBAAd,IAAI;IAAa,CAAC;IAE/C;;OAEG;IACH,KAAK,CAAC,eAAe;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAClD,OAAO;gBACN,EAAE;gBACF,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,QAAQ;gBACjC,OAAO,EAAE,KAAK,EAAE,UAAU,IAAI,CAAC;aAC/B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO;YACN,KAAK;YACL,KAAK,EAAE,EAAE,EAAE,qEAAqE;SAChF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QAC7D,MAAM,WAAW,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC3C,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACpB,OAAO;YACN,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,SAAS;YACnB,UAAU,EAAE,SAAS;SACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,EAAU;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QACpE,IAAI,KAAK,GAAG,GAAG,CAAC;QAChB,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,OAAO,EAAW,EAAE,CAAC;YAC/C,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE;gBAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC;QACtC,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;CACD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { EdgeMesh } from "../../edge-mesh.js";
|
|
2
|
+
/**
|
|
3
|
+
* WebSocket Gateway para tiempo real en el mesh Maloca.
|
|
4
|
+
* Simulación de manejador de WS.
|
|
5
|
+
*/
|
|
6
|
+
export declare class MalocaWSGateway extends EventTarget {
|
|
7
|
+
private readonly mesh;
|
|
8
|
+
private activeSubscriptions;
|
|
9
|
+
private readonly rateLimiter;
|
|
10
|
+
constructor(mesh: EdgeMesh);
|
|
11
|
+
/**
|
|
12
|
+
* Conecta un cliente WS al mesh.
|
|
13
|
+
*/
|
|
14
|
+
connectWS(profileId: string, clientIp?: string): Promise<{
|
|
15
|
+
connectionId: string;
|
|
16
|
+
profileId: string;
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* Suscribe al cliente a tipos específicos de eventos.
|
|
20
|
+
*/
|
|
21
|
+
subscribeToEvents(profileId: string, tipos: string[]): void;
|
|
22
|
+
/**
|
|
23
|
+
* Envía un evento desde el cliente externo al mesh.
|
|
24
|
+
*/
|
|
25
|
+
emitMessage(evento: {
|
|
26
|
+
type: string;
|
|
27
|
+
payload: any;
|
|
28
|
+
}): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Maneja mensajes recibidos del mesh y los filtra para el cliente.
|
|
31
|
+
*/
|
|
32
|
+
private handleMeshMessage;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=websocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../../src/maloca/gateway/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAInD;;;GAGG;AAEH,qBAAa,eAAgB,SAAQ,WAAW;IAQnC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPjC,OAAO,CAAC,mBAAmB,CAAuC;IAClE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAIzB;IAEH,YAA6B,IAAI,EAAE,QAAQ,EAE1C;IAED;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,SAAc;;;OAuBxD;IAED;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAMnD;IAED;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,iBAMvD;IAED;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAQzB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { TokenBucketRateLimiter } from "../../security/rate-limiter.js";
|
|
2
|
+
/**
|
|
3
|
+
* WebSocket Gateway para tiempo real en el mesh Maloca.
|
|
4
|
+
* Simulación de manejador de WS.
|
|
5
|
+
*/
|
|
6
|
+
export class MalocaWSGateway extends EventTarget {
|
|
7
|
+
mesh;
|
|
8
|
+
activeSubscriptions = new Map();
|
|
9
|
+
rateLimiter = new TokenBucketRateLimiter({
|
|
10
|
+
tokensPerInterval: 5,
|
|
11
|
+
intervalMs: 1000,
|
|
12
|
+
maxTokens: 10,
|
|
13
|
+
});
|
|
14
|
+
constructor(mesh) {
|
|
15
|
+
super();
|
|
16
|
+
this.mesh = mesh;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Conecta un cliente WS al mesh.
|
|
20
|
+
*/
|
|
21
|
+
async connectWS(profileId, clientIp = "127.0.0.1") {
|
|
22
|
+
if (!this.rateLimiter.consume(clientIp)) {
|
|
23
|
+
console.warn(`Rate limit exceeded for IP: ${clientIp} on Gateway WS connect`);
|
|
24
|
+
this.dispatchEvent(new CustomEvent("rate_limited", {
|
|
25
|
+
detail: { peerId: clientIp, resource: "websocket" },
|
|
26
|
+
}));
|
|
27
|
+
throw new Error("Rate limit exceeded: 429");
|
|
28
|
+
}
|
|
29
|
+
console.log(`WS Client connected: ${profileId}`);
|
|
30
|
+
// Iniciar escucha de eventos del mesh para reenviar al WS
|
|
31
|
+
this.mesh.on("mensajeRecibido", (ev) => {
|
|
32
|
+
this.handleMeshMessage(profileId, ev.detail.envolvente);
|
|
33
|
+
});
|
|
34
|
+
return {
|
|
35
|
+
connectionId: Math.random().toString(36).substring(7),
|
|
36
|
+
profileId,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Suscribe al cliente a tipos específicos de eventos.
|
|
41
|
+
*/
|
|
42
|
+
subscribeToEvents(profileId, tipos) {
|
|
43
|
+
const subs = this.activeSubscriptions.get(profileId) ?? new Set();
|
|
44
|
+
for (const t of tipos) {
|
|
45
|
+
subs.add(t);
|
|
46
|
+
}
|
|
47
|
+
this.activeSubscriptions.set(profileId, subs);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Envía un evento desde el cliente externo al mesh.
|
|
51
|
+
*/
|
|
52
|
+
async emitMessage(evento) {
|
|
53
|
+
await this.mesh.transmitir({
|
|
54
|
+
type: evento.type,
|
|
55
|
+
payload: evento.payload,
|
|
56
|
+
timestamp: Date.now(),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Maneja mensajes recibidos del mesh y los filtra para el cliente.
|
|
61
|
+
*/
|
|
62
|
+
handleMeshMessage(profileId, envolvente) {
|
|
63
|
+
const subs = this.activeSubscriptions.get(profileId);
|
|
64
|
+
if (subs && (subs.has("*") || subs.has(envolvente.tipo))) {
|
|
65
|
+
// En un entorno real, aquí se enviaría por el socket:
|
|
66
|
+
// socket.send(JSON.stringify(envolvente));
|
|
67
|
+
console.log(`WS [${profileId}] forwarding event: ${envolvente.tipo}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/maloca/gateway/websocket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGxE;;;GAGG;AAEH,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAQlB,IAAI;IAPzB,mBAAmB,GAA6B,IAAI,GAAG,EAAE,CAAC;IACjD,WAAW,GAAG,IAAI,sBAAsB,CAAC;QACzD,iBAAiB,EAAE,CAAC;QACpB,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,EAAE;KACb,CAAC,CAAC;IAEH,YAA6B,IAAc;QAC1C,KAAK,EAAE,CAAC;oBADoB,IAAI;IAEjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,QAAQ,GAAG,WAAW;QACxD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CACX,+BAA+B,QAAQ,wBAAwB,CAC/D,CAAC;YACF,IAAI,CAAC,aAAa,CACjB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC/B,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE;aACnD,CAAC,CACF,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;QAEjD,0DAA0D;QAC1D,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE;YACtC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,OAAO;YACN,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YACrD,SAAS;SACT,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,SAAiB,EAAE,KAAe;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAClE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACb,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAAsC;QACvD,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;YAC1B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,SAAiB,EAAE,UAAsB;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC1D,sDAAsD;YACtD,2CAA2C;YAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,SAAS,uBAAuB,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;IACF,CAAC;CACD"}
|