@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,61 @@
|
|
|
1
|
+
import type { EdgeMesh } from "../../edge-mesh.js";
|
|
2
|
+
export type GpuKernelType = "vector-sum" | "dot" | "matrix-scale";
|
|
3
|
+
export interface GpuTask {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly kernel: GpuKernelType;
|
|
6
|
+
readonly inputA: readonly number[];
|
|
7
|
+
readonly inputB?: readonly number[];
|
|
8
|
+
readonly scalar?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface GpuTaskResult {
|
|
11
|
+
readonly taskId: string;
|
|
12
|
+
readonly result: readonly number[] | number;
|
|
13
|
+
readonly durationMs: number;
|
|
14
|
+
readonly fallbackUsed: boolean;
|
|
15
|
+
readonly success: boolean;
|
|
16
|
+
readonly error?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function runCpuVectorSum(a: readonly number[], b: readonly number[]): number[];
|
|
19
|
+
export declare function runCpuDot(a: readonly number[], b: readonly number[]): number;
|
|
20
|
+
export declare function runCpuMatrixScale(matrix: readonly number[], scalar: number): number[];
|
|
21
|
+
export declare class GpuAgentPlugin {
|
|
22
|
+
private readonly edgeMesh?;
|
|
23
|
+
private readonly taskQueue;
|
|
24
|
+
private mockDevice;
|
|
25
|
+
constructor(edgeMesh?: EdgeMesh);
|
|
26
|
+
/**
|
|
27
|
+
* Obtiene la instancia asociada de EdgeMesh.
|
|
28
|
+
*/
|
|
29
|
+
getEdgeMesh(): EdgeMesh | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Configura un dispositivo mock de WebGPU para propósitos de prueba/depuración.
|
|
32
|
+
*/
|
|
33
|
+
setMockDevice(device: any): void;
|
|
34
|
+
/**
|
|
35
|
+
* Obtiene el tamaño de la cola de tareas.
|
|
36
|
+
*/
|
|
37
|
+
getQueueSize(): number;
|
|
38
|
+
/**
|
|
39
|
+
* Detecta si WebGPU está soportado y disponible.
|
|
40
|
+
*/
|
|
41
|
+
isWebGpuSupported(): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Ejecuta un kernel en CPU.
|
|
44
|
+
*/
|
|
45
|
+
executeOnCpu(task: GpuTask): readonly number[] | number;
|
|
46
|
+
/**
|
|
47
|
+
* Ejecuta una tarea en GPU usando WebGPU.
|
|
48
|
+
*/
|
|
49
|
+
executeOnGpu(task: GpuTask): Promise<readonly number[] | number>;
|
|
50
|
+
/**
|
|
51
|
+
* Encola y ejecuta una tarea. Si WebGPU está disponible e inicia correctamente,
|
|
52
|
+
* se ejecuta en GPU. De lo contrario, se activa automáticamente el CPU fallback.
|
|
53
|
+
*/
|
|
54
|
+
enqueueTask(task: GpuTask): Promise<GpuTaskResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Hook/Método de verificación para validar que el resultado de una tarea sea correcto.
|
|
57
|
+
* Ejecuta el cálculo correspondiente en CPU y lo compara con un margen de tolerancia (épsilon).
|
|
58
|
+
*/
|
|
59
|
+
verifyTask(task: GpuTask, resultToVerify: readonly number[] | number, tolerance?: number): boolean;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/gpu-agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAWnD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,KAAK,GAAG,cAAc,CAAC;AAElE,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,wBAAgB,eAAe,CAC9B,CAAC,EAAE,SAAS,MAAM,EAAE,EACpB,CAAC,EAAE,SAAS,MAAM,EAAE,GAClB,MAAM,EAAE,CAWV;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAW5E;AAED,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,MAAM,GACZ,MAAM,EAAE,CAMV;AAmDD,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAI3C,OAAO,CAAC,UAAU,CAAa;IAE/B,YAAY,QAAQ,CAAC,EAAE,QAAQ,EAE9B;IAED;;OAEG;IACH,WAAW,IAAI,QAAQ,GAAG,SAAS,CAElC;IAED;;OAEG;IAEH,aAAa,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAE/B;IAED;;OAEG;IACH,YAAY,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,iBAAiB,IAAI,OAAO,CAO3B;IAED;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,GAAG,MAAM,CAuBtD;IAED;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,CA6JrE;IAED;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAgDvD;IAED;;;OAGG;IACH,UAAU,CACT,IAAI,EAAE,OAAO,EACb,cAAc,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAC1C,SAAS,SAAO,GACd,OAAO,CA4BT;CACD"}
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
// ─── CPU FALLBACKS ─────────────────────────────────────────────────────────
|
|
2
|
+
export function runCpuVectorSum(a, b) {
|
|
3
|
+
if (a.length !== b.length) {
|
|
4
|
+
throw new Error(`Mismatched lengths for vector-sum: ${a.length} vs ${b.length}`);
|
|
5
|
+
}
|
|
6
|
+
const result = new Array(a.length);
|
|
7
|
+
for (let i = 0; i < a.length; i++) {
|
|
8
|
+
result[i] = a[i] + b[i];
|
|
9
|
+
}
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
export function runCpuDot(a, b) {
|
|
13
|
+
if (a.length !== b.length) {
|
|
14
|
+
throw new Error(`Mismatched lengths for dot product: ${a.length} vs ${b.length}`);
|
|
15
|
+
}
|
|
16
|
+
let sum = 0;
|
|
17
|
+
for (let i = 0; i < a.length; i++) {
|
|
18
|
+
sum += a[i] * b[i];
|
|
19
|
+
}
|
|
20
|
+
return sum;
|
|
21
|
+
}
|
|
22
|
+
export function runCpuMatrixScale(matrix, scalar) {
|
|
23
|
+
const result = new Array(matrix.length);
|
|
24
|
+
for (let i = 0; i < matrix.length; i++) {
|
|
25
|
+
result[i] = matrix[i] * scalar;
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
// ─── WGSL SHADERS ──────────────────────────────────────────────────────────
|
|
30
|
+
const SHADER_VECTOR_SUM = `
|
|
31
|
+
@group(0) @binding(0) var<storage, read> inputA: array<f32>;
|
|
32
|
+
@group(0) @binding(1) var<storage, read> inputB: array<f32>;
|
|
33
|
+
@group(0) @binding(2) var<storage, read_write> output: array<f32>;
|
|
34
|
+
|
|
35
|
+
@compute @workgroup_size(64)
|
|
36
|
+
fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
|
|
37
|
+
let index = global_id.x;
|
|
38
|
+
if (index >= arrayLength(&inputA)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
output[index] = inputA[index] + inputB[index];
|
|
42
|
+
}
|
|
43
|
+
`;
|
|
44
|
+
const SHADER_DOT_MULTIPLY = `
|
|
45
|
+
@group(0) @binding(0) var<storage, read> inputA: array<f32>;
|
|
46
|
+
@group(0) @binding(1) var<storage, read> inputB: array<f32>;
|
|
47
|
+
@group(0) @binding(2) var<storage, read_write> output: array<f32>;
|
|
48
|
+
|
|
49
|
+
@compute @workgroup_size(64)
|
|
50
|
+
fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
|
|
51
|
+
let index = global_id.x;
|
|
52
|
+
if (index >= arrayLength(&inputA)) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
output[index] = inputA[index] * inputB[index];
|
|
56
|
+
}
|
|
57
|
+
`;
|
|
58
|
+
const SHADER_MATRIX_SCALE = `
|
|
59
|
+
@group(0) @binding(0) var<storage, read> inputA: array<f32>;
|
|
60
|
+
@group(0) @binding(1) var<storage, read> scalar: array<f32>;
|
|
61
|
+
@group(0) @binding(2) var<storage, read_write> output: array<f32>;
|
|
62
|
+
|
|
63
|
+
@compute @workgroup_size(64)
|
|
64
|
+
fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
|
|
65
|
+
let index = global_id.x;
|
|
66
|
+
if (index >= arrayLength(&inputA)) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
output[index] = inputA[index] * scalar[0];
|
|
70
|
+
}
|
|
71
|
+
`;
|
|
72
|
+
// ─── GPU AGENT PLUGIN CLASS ────────────────────────────────────────────────
|
|
73
|
+
export class GpuAgentPlugin {
|
|
74
|
+
edgeMesh;
|
|
75
|
+
taskQueue = [];
|
|
76
|
+
// Permitir inyección de mock GPUDevice para facilitar pruebas en el futuro si es necesario
|
|
77
|
+
// biome-ignore lint/suspicious/noExplicitAny: Mock WebGPU device
|
|
78
|
+
mockDevice = null;
|
|
79
|
+
constructor(edgeMesh) {
|
|
80
|
+
this.edgeMesh = edgeMesh;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Obtiene la instancia asociada de EdgeMesh.
|
|
84
|
+
*/
|
|
85
|
+
getEdgeMesh() {
|
|
86
|
+
return this.edgeMesh;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Configura un dispositivo mock de WebGPU para propósitos de prueba/depuración.
|
|
90
|
+
*/
|
|
91
|
+
// biome-ignore lint/suspicious/noExplicitAny: Mock WebGPU device
|
|
92
|
+
setMockDevice(device) {
|
|
93
|
+
this.mockDevice = device;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Obtiene el tamaño de la cola de tareas.
|
|
97
|
+
*/
|
|
98
|
+
getQueueSize() {
|
|
99
|
+
return this.taskQueue.length;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Detecta si WebGPU está soportado y disponible.
|
|
103
|
+
*/
|
|
104
|
+
isWebGpuSupported() {
|
|
105
|
+
if (this.mockDevice)
|
|
106
|
+
return true;
|
|
107
|
+
return (typeof navigator !== "undefined" &&
|
|
108
|
+
// biome-ignore lint/suspicious/noExplicitAny: WebGPU navigator property
|
|
109
|
+
typeof navigator.gpu !== "undefined");
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Ejecuta un kernel en CPU.
|
|
113
|
+
*/
|
|
114
|
+
executeOnCpu(task) {
|
|
115
|
+
switch (task.kernel) {
|
|
116
|
+
case "vector-sum": {
|
|
117
|
+
if (!task.inputB) {
|
|
118
|
+
throw new Error("Missing inputB for vector-sum task");
|
|
119
|
+
}
|
|
120
|
+
return runCpuVectorSum(task.inputA, task.inputB);
|
|
121
|
+
}
|
|
122
|
+
case "dot": {
|
|
123
|
+
if (!task.inputB) {
|
|
124
|
+
throw new Error("Missing inputB for dot task");
|
|
125
|
+
}
|
|
126
|
+
return runCpuDot(task.inputA, task.inputB);
|
|
127
|
+
}
|
|
128
|
+
case "matrix-scale": {
|
|
129
|
+
if (task.scalar === undefined) {
|
|
130
|
+
throw new Error("Missing scalar for matrix-scale task");
|
|
131
|
+
}
|
|
132
|
+
return runCpuMatrixScale(task.inputA, task.scalar);
|
|
133
|
+
}
|
|
134
|
+
default:
|
|
135
|
+
throw new Error("Unknown kernel type");
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Ejecuta una tarea en GPU usando WebGPU.
|
|
140
|
+
*/
|
|
141
|
+
async executeOnGpu(task) {
|
|
142
|
+
if (!this.isWebGpuSupported()) {
|
|
143
|
+
throw new Error("WebGPU is not supported on this platform");
|
|
144
|
+
}
|
|
145
|
+
// 1. Obtener dispositivo (usar mock si existe)
|
|
146
|
+
let device = this.mockDevice;
|
|
147
|
+
if (!device) {
|
|
148
|
+
// biome-ignore lint/suspicious/noExplicitAny: WebGPU navigator property
|
|
149
|
+
const gpu = navigator.gpu;
|
|
150
|
+
const adapter = await gpu.requestAdapter();
|
|
151
|
+
if (!adapter) {
|
|
152
|
+
throw new Error("No WebGPU adapter found");
|
|
153
|
+
}
|
|
154
|
+
device = await adapter.requestDevice();
|
|
155
|
+
if (!device) {
|
|
156
|
+
throw new Error("No WebGPU device found");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// 2. Determinar el shader correcto
|
|
160
|
+
let shaderCode = "";
|
|
161
|
+
switch (task.kernel) {
|
|
162
|
+
case "vector-sum":
|
|
163
|
+
shaderCode = SHADER_VECTOR_SUM;
|
|
164
|
+
break;
|
|
165
|
+
case "dot":
|
|
166
|
+
shaderCode = SHADER_DOT_MULTIPLY;
|
|
167
|
+
break;
|
|
168
|
+
case "matrix-scale":
|
|
169
|
+
shaderCode = SHADER_MATRIX_SCALE;
|
|
170
|
+
break;
|
|
171
|
+
default:
|
|
172
|
+
throw new Error(`Unsupported kernel on GPU: ${task.kernel}`);
|
|
173
|
+
}
|
|
174
|
+
// 3. Crear buffers de entrada
|
|
175
|
+
const arrayA = new Float32Array(task.inputA);
|
|
176
|
+
const bufferA = device.createBuffer({
|
|
177
|
+
size: arrayA.byteLength,
|
|
178
|
+
// biome-ignore lint/suspicious/noExplicitAny: WebGPU type bypass
|
|
179
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
180
|
+
mappedAtCreation: true,
|
|
181
|
+
});
|
|
182
|
+
new Float32Array(bufferA.getMappedRange()).set(arrayA);
|
|
183
|
+
bufferA.unmap();
|
|
184
|
+
// biome-ignore lint/suspicious/noExplicitAny: WebGPU buffer type bypass
|
|
185
|
+
let bufferB = null;
|
|
186
|
+
if (task.kernel === "vector-sum" || task.kernel === "dot") {
|
|
187
|
+
if (!task.inputB) {
|
|
188
|
+
throw new Error(`Missing inputB for ${task.kernel}`);
|
|
189
|
+
}
|
|
190
|
+
const arrayB = new Float32Array(task.inputB);
|
|
191
|
+
bufferB = device.createBuffer({
|
|
192
|
+
size: arrayB.byteLength,
|
|
193
|
+
usage:
|
|
194
|
+
// biome-ignore lint/suspicious/noExplicitAny: WebGPU type bypass
|
|
195
|
+
GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
196
|
+
mappedAtCreation: true,
|
|
197
|
+
});
|
|
198
|
+
new Float32Array(bufferB.getMappedRange()).set(arrayB);
|
|
199
|
+
bufferB.unmap();
|
|
200
|
+
}
|
|
201
|
+
else if (task.kernel === "matrix-scale") {
|
|
202
|
+
if (task.scalar === undefined) {
|
|
203
|
+
throw new Error("Missing scalar for matrix-scale");
|
|
204
|
+
}
|
|
205
|
+
const arrayScalar = new Float32Array([task.scalar]);
|
|
206
|
+
bufferB = device.createBuffer({
|
|
207
|
+
size: arrayScalar.byteLength,
|
|
208
|
+
usage:
|
|
209
|
+
// biome-ignore lint/suspicious/noExplicitAny: WebGPU type bypass
|
|
210
|
+
GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
211
|
+
mappedAtCreation: true,
|
|
212
|
+
});
|
|
213
|
+
new Float32Array(bufferB.getMappedRange()).set(arrayScalar);
|
|
214
|
+
bufferB.unmap();
|
|
215
|
+
}
|
|
216
|
+
// Buffer de salida
|
|
217
|
+
const outputSize = arrayA.byteLength;
|
|
218
|
+
const bufferOutput = device.createBuffer({
|
|
219
|
+
size: outputSize,
|
|
220
|
+
// biome-ignore lint/suspicious/noExplicitAny: WebGPU type bypass
|
|
221
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
|
|
222
|
+
});
|
|
223
|
+
// Buffer para leer resultados en CPU
|
|
224
|
+
const bufferRead = device.createBuffer({
|
|
225
|
+
size: outputSize,
|
|
226
|
+
usage:
|
|
227
|
+
// biome-ignore lint/suspicious/noExplicitAny: WebGPU type bypass
|
|
228
|
+
GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
|
|
229
|
+
});
|
|
230
|
+
// 4. Configurar pipeline y bindgroups
|
|
231
|
+
const shaderModule = device.createShaderModule({ code: shaderCode });
|
|
232
|
+
const computePipeline = device.createComputePipeline({
|
|
233
|
+
layout: "auto",
|
|
234
|
+
compute: {
|
|
235
|
+
module: shaderModule,
|
|
236
|
+
entryPoint: "main",
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
const bindGroup = device.createBindGroup({
|
|
240
|
+
layout: computePipeline.getBindGroupLayout(0),
|
|
241
|
+
entries: [
|
|
242
|
+
{ binding: 0, resource: { buffer: bufferA } },
|
|
243
|
+
{ binding: 1, resource: { buffer: bufferB } },
|
|
244
|
+
{ binding: 2, resource: { buffer: bufferOutput } },
|
|
245
|
+
],
|
|
246
|
+
});
|
|
247
|
+
// 5. Grabar y enviar comandos
|
|
248
|
+
const commandEncoder = device.createCommandEncoder();
|
|
249
|
+
const passEncoder = commandEncoder.beginComputePass();
|
|
250
|
+
passEncoder.setPipeline(computePipeline);
|
|
251
|
+
passEncoder.setBindGroup(0, bindGroup);
|
|
252
|
+
const workgroupCount = Math.ceil(task.inputA.length / 64);
|
|
253
|
+
passEncoder.dispatchWorkgroups(workgroupCount);
|
|
254
|
+
passEncoder.end();
|
|
255
|
+
commandEncoder.copyBufferToBuffer(bufferOutput, 0, bufferRead, 0, outputSize);
|
|
256
|
+
device.queue.submit([commandEncoder.finish()]);
|
|
257
|
+
// 6. Leer resultados
|
|
258
|
+
// biome-ignore lint/suspicious/noExplicitAny: WebGPU type bypass
|
|
259
|
+
await bufferRead.mapAsync(GPUMapMode.READ);
|
|
260
|
+
const arrayBuffer = bufferRead.getMappedRange();
|
|
261
|
+
const outputArray = Array.from(new Float32Array(arrayBuffer));
|
|
262
|
+
bufferRead.unmap();
|
|
263
|
+
// Liberar buffers
|
|
264
|
+
bufferA.destroy();
|
|
265
|
+
bufferB.destroy();
|
|
266
|
+
bufferOutput.destroy();
|
|
267
|
+
bufferRead.destroy();
|
|
268
|
+
// 7. Procesar resultado final según tipo de kernel
|
|
269
|
+
if (task.kernel === "dot") {
|
|
270
|
+
// Reducción final en CPU de la multiplicación elemento por elemento
|
|
271
|
+
let sum = 0;
|
|
272
|
+
for (let i = 0; i < outputArray.length; i++) {
|
|
273
|
+
sum += outputArray[i];
|
|
274
|
+
}
|
|
275
|
+
return sum;
|
|
276
|
+
}
|
|
277
|
+
return outputArray;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Encola y ejecuta una tarea. Si WebGPU está disponible e inicia correctamente,
|
|
281
|
+
* se ejecuta en GPU. De lo contrario, se activa automáticamente el CPU fallback.
|
|
282
|
+
*/
|
|
283
|
+
async enqueueTask(task) {
|
|
284
|
+
this.taskQueue.push(task);
|
|
285
|
+
const startTime = Date.now();
|
|
286
|
+
let result = [];
|
|
287
|
+
let fallbackUsed = true;
|
|
288
|
+
let success = false;
|
|
289
|
+
let errorMsg;
|
|
290
|
+
try {
|
|
291
|
+
if (this.isWebGpuSupported()) {
|
|
292
|
+
try {
|
|
293
|
+
result = await this.executeOnGpu(task);
|
|
294
|
+
fallbackUsed = false;
|
|
295
|
+
success = true;
|
|
296
|
+
}
|
|
297
|
+
catch (gpuError) {
|
|
298
|
+
// Fallback silencioso a CPU si la ejecución en GPU falla
|
|
299
|
+
result = this.executeOnCpu(task);
|
|
300
|
+
fallbackUsed = true;
|
|
301
|
+
success = true;
|
|
302
|
+
errorMsg = `WebGPU execution failed, fell back to CPU: ${gpuError.message}`;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
result = this.executeOnCpu(task);
|
|
307
|
+
fallbackUsed = true;
|
|
308
|
+
success = true;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
success = false;
|
|
313
|
+
errorMsg = err.message;
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
// Quitar la tarea de la cola
|
|
317
|
+
const idx = this.taskQueue.findIndex((t) => t.id === task.id);
|
|
318
|
+
if (idx !== -1) {
|
|
319
|
+
this.taskQueue.splice(idx, 1);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const durationMs = Date.now() - startTime;
|
|
323
|
+
return {
|
|
324
|
+
taskId: task.id,
|
|
325
|
+
result,
|
|
326
|
+
durationMs,
|
|
327
|
+
fallbackUsed,
|
|
328
|
+
success,
|
|
329
|
+
error: errorMsg,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Hook/Método de verificación para validar que el resultado de una tarea sea correcto.
|
|
334
|
+
* Ejecuta el cálculo correspondiente en CPU y lo compara con un margen de tolerancia (épsilon).
|
|
335
|
+
*/
|
|
336
|
+
verifyTask(task, resultToVerify, tolerance = 1e-5) {
|
|
337
|
+
try {
|
|
338
|
+
const expected = this.executeOnCpu(task);
|
|
339
|
+
if (typeof expected === "number") {
|
|
340
|
+
if (typeof resultToVerify !== "number")
|
|
341
|
+
return false;
|
|
342
|
+
return Math.abs(expected - resultToVerify) <= tolerance;
|
|
343
|
+
}
|
|
344
|
+
if (Array.isArray(expected)) {
|
|
345
|
+
if (!Array.isArray(resultToVerify))
|
|
346
|
+
return false;
|
|
347
|
+
if (expected.length !== resultToVerify.length)
|
|
348
|
+
return false;
|
|
349
|
+
for (let i = 0; i < expected.length; i++) {
|
|
350
|
+
if (Math.abs(expected[i] - resultToVerify[i]) >
|
|
351
|
+
tolerance) {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
return false;
|
|
358
|
+
}
|
|
359
|
+
catch {
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/gpu-agent/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { EdgeMesh } from "../../edge-mesh.js";
|
|
2
|
+
import type { CitaInfo } from "./types.js";
|
|
3
|
+
export declare class CitaMeshAdapter {
|
|
4
|
+
private readonly mesh;
|
|
5
|
+
constructor(mesh: EdgeMesh);
|
|
6
|
+
/**
|
|
7
|
+
* Crea una cita médica replicada en el mesh.
|
|
8
|
+
*/
|
|
9
|
+
createCita(citaInfo: CitaInfo): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Sincroniza citas offline-first para un paciente.
|
|
12
|
+
*/
|
|
13
|
+
syncCitas(patientId: string): Promise<CitaInfo[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Consulta disponibilidad de un médico en una fecha específica vía mesh.
|
|
16
|
+
*/
|
|
17
|
+
getAvailability(doctorId: string, fecha: string): Promise<string[]>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=citas-distribuidas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"citas-distribuidas.d.ts","sourceRoot":"","sources":["../../../src/adapters/maloca-salud/citas-distribuidas.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAEhC,YAAY,IAAI,EAAE,QAAQ,EAEzB;IAED;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAMlD;IAED;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAItD;IAED;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA2BxE;CACD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as Y from "yjs";
|
|
2
|
+
export class CitaMeshAdapter {
|
|
3
|
+
mesh;
|
|
4
|
+
constructor(mesh) {
|
|
5
|
+
this.mesh = mesh;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Crea una cita médica replicada en el mesh.
|
|
9
|
+
*/
|
|
10
|
+
async createCita(citaInfo) {
|
|
11
|
+
const citas = this.mesh.yjsAdapter.getArray("maloca-salud:citas");
|
|
12
|
+
Y.transact(this.mesh.yjsAdapter.doc, () => {
|
|
13
|
+
citas.push([citaInfo]);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Sincroniza citas offline-first para un paciente.
|
|
18
|
+
*/
|
|
19
|
+
async syncCitas(patientId) {
|
|
20
|
+
const citas = this.mesh.yjsAdapter.getArray("maloca-salud:citas");
|
|
21
|
+
const allCitas = citas.toArray();
|
|
22
|
+
return allCitas.filter((c) => c.pacienteId === patientId);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Consulta disponibilidad de un médico en una fecha específica vía mesh.
|
|
26
|
+
*/
|
|
27
|
+
async getAvailability(doctorId, fecha) {
|
|
28
|
+
const citas = this.mesh.yjsAdapter.getArray("maloca-salud:citas");
|
|
29
|
+
const allCitas = citas.toArray();
|
|
30
|
+
// Suponemos horario de 8:00 a 17:00 cada hora
|
|
31
|
+
const horario = [
|
|
32
|
+
"08:00",
|
|
33
|
+
"09:00",
|
|
34
|
+
"10:00",
|
|
35
|
+
"11:00",
|
|
36
|
+
"12:00",
|
|
37
|
+
"13:00",
|
|
38
|
+
"14:00",
|
|
39
|
+
"15:00",
|
|
40
|
+
"16:00",
|
|
41
|
+
"17:00",
|
|
42
|
+
];
|
|
43
|
+
const ocupados = allCitas
|
|
44
|
+
.filter((c) => c.medicoId === doctorId &&
|
|
45
|
+
c.fecha === fecha &&
|
|
46
|
+
c.estado !== "cancelada")
|
|
47
|
+
.map((c) => c.hora);
|
|
48
|
+
return horario.filter((h) => !ocupados.includes(h));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=citas-distribuidas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"citas-distribuidas.js","sourceRoot":"","sources":["../../../src/adapters/maloca-salud/citas-distribuidas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAIzB,MAAM,OAAO,eAAe;IACV,IAAI,CAAW;IAEhC,YAAY,IAAc;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,QAAkB;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;QAElE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE;YACzC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,SAAiB;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAgB,CAAC;QAC/C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,KAAa;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAgB,CAAC;QAE/C,8CAA8C;QAC9C,MAAM,OAAO,GAAG;YACf,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;SACP,CAAC;QACF,MAAM,QAAQ,GAAG,QAAQ;aACvB,MAAM,CACN,CAAC,CAAC,EAAE,EAAE,CACL,CAAC,CAAC,QAAQ,KAAK,QAAQ;YACvB,CAAC,CAAC,KAAK,KAAK,KAAK;YACjB,CAAC,CAAC,MAAM,KAAK,WAAW,CACzB;aACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAErB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;CACD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { EdgeMesh } from "../../edge-mesh.js";
|
|
2
|
+
import type { EPSData } from "./types.js";
|
|
3
|
+
export declare class EPSBridge {
|
|
4
|
+
private readonly mesh;
|
|
5
|
+
constructor(mesh: EdgeMesh);
|
|
6
|
+
/**
|
|
7
|
+
* Sincroniza datos de la EPS al mesh.
|
|
8
|
+
*/
|
|
9
|
+
syncEPSData(epsData: EPSData): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Verifica afiliación EPS de un paciente vía mesh.
|
|
12
|
+
*/
|
|
13
|
+
verifyEPS(patientId: string, epsId: string): Promise<boolean>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=eps-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eps-bridge.d.ts","sourceRoot":"","sources":["../../../src/adapters/maloca-salud/eps-bridge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,qBAAa,SAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAEhC,YAAY,IAAI,EAAE,QAAQ,EAEzB;IAED;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjD;IAED;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOlE;CACD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as Y from "yjs";
|
|
2
|
+
export class EPSBridge {
|
|
3
|
+
mesh;
|
|
4
|
+
constructor(mesh) {
|
|
5
|
+
this.mesh = mesh;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Sincroniza datos de la EPS al mesh.
|
|
9
|
+
*/
|
|
10
|
+
async syncEPSData(epsData) {
|
|
11
|
+
const epsMap = this.mesh.yjsAdapter.getMap("maloca-salud:eps-data");
|
|
12
|
+
Y.transact(this.mesh.yjsAdapter.doc, () => {
|
|
13
|
+
epsMap.set(epsData.id, epsData);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Verifica afiliación EPS de un paciente vía mesh.
|
|
18
|
+
*/
|
|
19
|
+
async verifyEPS(patientId, epsId) {
|
|
20
|
+
const epsMap = this.mesh.yjsAdapter.getMap("maloca-salud:eps-data");
|
|
21
|
+
const epsData = epsMap.get(epsId);
|
|
22
|
+
if (epsData === undefined)
|
|
23
|
+
return false;
|
|
24
|
+
return epsData.pacientesAfiliados.includes(patientId);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=eps-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eps-bridge.js","sourceRoot":"","sources":["../../../src/adapters/maloca-salud/eps-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAIzB,MAAM,OAAO,SAAS;IACJ,IAAI,CAAW;IAEhC,YAAY,IAAc;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,OAAgB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAEpE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE;YACzC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,KAAa;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAwB,CAAC;QAEzD,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAExC,OAAO,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;CACD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EdgeMesh } from "../../edge-mesh.js";
|
|
2
|
+
import type { PostQuantumIdentity } from "../../identity/index.js";
|
|
3
|
+
import type { PacientePerfil } from "./types.js";
|
|
4
|
+
export declare class PerfilPacienteAdapter {
|
|
5
|
+
private readonly mesh;
|
|
6
|
+
constructor(mesh: EdgeMesh);
|
|
7
|
+
/**
|
|
8
|
+
* Registra un paciente como nodo mesh vinculando su perfil e identidad.
|
|
9
|
+
*/
|
|
10
|
+
registerPatient(perfil: PacientePerfil, _identidad: PostQuantumIdentity): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Obtiene el historial médico de un paciente vía sync mesh.
|
|
13
|
+
*/
|
|
14
|
+
getMedicalHistory(patientId: string): Promise<unknown[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Vincula paciente-médico en el mesh.
|
|
17
|
+
*/
|
|
18
|
+
linkDoctor(patientId: string, doctorId: string): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=patient-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patient-profile.d.ts","sourceRoot":"","sources":["../../../src/adapters/maloca-salud/patient-profile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAEhC,YAAY,IAAI,EAAE,QAAQ,EAEzB;IAED;;OAEG;IACG,eAAe,CACpB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,mBAAmB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAMf;IAED;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAK7D;IAED;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWnE;CACD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as Y from "yjs";
|
|
2
|
+
export class PerfilPacienteAdapter {
|
|
3
|
+
mesh;
|
|
4
|
+
constructor(mesh) {
|
|
5
|
+
this.mesh = mesh;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Registra un paciente como nodo mesh vinculando su perfil e identidad.
|
|
9
|
+
*/
|
|
10
|
+
async registerPatient(perfil, _identidad) {
|
|
11
|
+
const pacientes = this.mesh.yjsAdapter.getMap("maloca-salud:pacientes");
|
|
12
|
+
Y.transact(this.mesh.yjsAdapter.doc, () => {
|
|
13
|
+
pacientes.set(perfil.id, perfil);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Obtiene el historial médico de un paciente vía sync mesh.
|
|
18
|
+
*/
|
|
19
|
+
async getMedicalHistory(patientId) {
|
|
20
|
+
const historiales = this.mesh.yjsAdapter.getArray(`maloca-salud:historial:${patientId}`);
|
|
21
|
+
return historiales.toArray();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Vincula paciente-médico en el mesh.
|
|
25
|
+
*/
|
|
26
|
+
async linkDoctor(patientId, doctorId) {
|
|
27
|
+
const links = this.mesh.yjsAdapter.getMap("maloca-salud:links-paciente-medico");
|
|
28
|
+
Y.transact(this.mesh.yjsAdapter.doc, () => {
|
|
29
|
+
const existing = links.get(patientId) || [];
|
|
30
|
+
if (!existing.includes(doctorId)) {
|
|
31
|
+
links.set(patientId, [...existing, doctorId]);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=patient-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patient-profile.js","sourceRoot":"","sources":["../../../src/adapters/maloca-salud/patient-profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAKzB,MAAM,OAAO,qBAAqB;IAChB,IAAI,CAAW;IAEhC,YAAY,IAAc;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CACpB,MAAsB,EACtB,UAA+B;QAE/B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAExE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE;YACzC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAChD,0BAA0B,SAAS,EAAE,CACrC,CAAC;QACF,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,QAAgB;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CACxC,oCAAoC,CACpC,CAAC;QAEF,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE;YACzC,MAAM,QAAQ,GAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAc,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC/C,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;CACD"}
|