@swal/edge-mesh 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +128 -0
- package/NOTICE +37 -0
- package/README.md +470 -2
- package/dist/adapters/gpu-agent/index.d.ts +61 -0
- package/dist/adapters/gpu-agent/index.d.ts.map +1 -0
- package/dist/adapters/gpu-agent/index.js +364 -0
- package/dist/adapters/gpu-agent/index.js.map +1 -0
- package/dist/adapters/maloca-salud/citas-distribuidas.d.ts +19 -0
- package/dist/adapters/maloca-salud/citas-distribuidas.d.ts.map +1 -0
- package/dist/adapters/maloca-salud/citas-distribuidas.js +51 -0
- package/dist/adapters/maloca-salud/citas-distribuidas.js.map +1 -0
- package/dist/adapters/maloca-salud/eps-bridge.d.ts +15 -0
- package/dist/adapters/maloca-salud/eps-bridge.d.ts.map +1 -0
- package/dist/adapters/maloca-salud/eps-bridge.js +27 -0
- package/dist/adapters/maloca-salud/eps-bridge.js.map +1 -0
- package/dist/adapters/maloca-salud/patient-profile.d.ts +20 -0
- package/dist/adapters/maloca-salud/patient-profile.d.ts.map +1 -0
- package/dist/adapters/maloca-salud/patient-profile.js +36 -0
- package/dist/adapters/maloca-salud/patient-profile.js.map +1 -0
- package/dist/adapters/maloca-salud/types.d.ts +40 -0
- package/dist/adapters/maloca-salud/types.d.ts.map +1 -0
- package/dist/adapters/maloca-salud/types.js +2 -0
- package/dist/adapters/maloca-salud/types.js.map +1 -0
- package/dist/adapters/maloca-veeduria/contract-bridge.d.ts +31 -0
- package/dist/adapters/maloca-veeduria/contract-bridge.d.ts.map +1 -0
- package/dist/adapters/maloca-veeduria/contract-bridge.js +103 -0
- package/dist/adapters/maloca-veeduria/contract-bridge.js.map +1 -0
- package/dist/adapters/maloca-veeduria/evidentia-veeduria.d.ts +14 -0
- package/dist/adapters/maloca-veeduria/evidentia-veeduria.d.ts.map +1 -0
- package/dist/adapters/maloca-veeduria/evidentia-veeduria.js +40 -0
- package/dist/adapters/maloca-veeduria/evidentia-veeduria.js.map +1 -0
- package/dist/adapters/maloca-veeduria/licitante-profile.d.ts +21 -0
- package/dist/adapters/maloca-veeduria/licitante-profile.d.ts.map +1 -0
- package/dist/adapters/maloca-veeduria/licitante-profile.js +58 -0
- package/dist/adapters/maloca-veeduria/licitante-profile.js.map +1 -0
- package/dist/adapters/maloca-veeduria/types.d.ts +30 -0
- package/dist/adapters/maloca-veeduria/types.d.ts.map +1 -0
- package/dist/adapters/maloca-veeduria/types.js +2 -0
- package/dist/adapters/maloca-veeduria/types.js.map +1 -0
- package/dist/adapters/maloca-xavier/agent-profile.d.ts +32 -0
- package/dist/adapters/maloca-xavier/agent-profile.d.ts.map +1 -0
- package/dist/adapters/maloca-xavier/agent-profile.js +56 -0
- package/dist/adapters/maloca-xavier/agent-profile.js.map +1 -0
- package/dist/adapters/maloca-xavier/codegraph-bridge.d.ts +27 -0
- package/dist/adapters/maloca-xavier/codegraph-bridge.d.ts.map +1 -0
- package/dist/adapters/maloca-xavier/codegraph-bridge.js +58 -0
- package/dist/adapters/maloca-xavier/codegraph-bridge.js.map +1 -0
- package/dist/adapters/maloca-xavier/llm-router.d.ts +25 -0
- package/dist/adapters/maloca-xavier/llm-router.d.ts.map +1 -0
- package/dist/adapters/maloca-xavier/llm-router.js +58 -0
- package/dist/adapters/maloca-xavier/llm-router.js.map +1 -0
- package/dist/authz/index.d.ts +81 -0
- package/dist/authz/index.d.ts.map +1 -0
- package/dist/authz/index.js +271 -0
- package/dist/authz/index.js.map +1 -0
- package/dist/chat/index.d.ts +138 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +394 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/offline-queue.d.ts +32 -0
- package/dist/chat/offline-queue.d.ts.map +1 -0
- package/dist/chat/offline-queue.js +93 -0
- package/dist/chat/offline-queue.js.map +1 -0
- package/dist/core/DefaultEdgeMeshNode.d.ts +17 -0
- package/dist/core/DefaultEdgeMeshNode.d.ts.map +1 -0
- package/dist/core/DefaultEdgeMeshNode.js +57 -0
- package/dist/core/DefaultEdgeMeshNode.js.map +1 -0
- package/dist/core/node.d.ts +26 -0
- package/dist/core/node.d.ts.map +1 -0
- package/dist/core/node.js +16 -0
- package/dist/core/node.js.map +1 -0
- package/dist/edge-mesh.d.ts +139 -0
- package/dist/edge-mesh.d.ts.map +1 -0
- package/dist/edge-mesh.js +1146 -0
- package/dist/edge-mesh.js.map +1 -0
- package/dist/gos/GosBridge.d.ts +49 -0
- package/dist/gos/GosBridge.d.ts.map +1 -0
- package/dist/gos/GosBridge.js +133 -0
- package/dist/gos/GosBridge.js.map +1 -0
- package/dist/governance/authority.d.ts +44 -0
- package/dist/governance/authority.d.ts.map +1 -0
- package/dist/governance/authority.js +123 -0
- package/dist/governance/authority.js.map +1 -0
- package/dist/governance/index.d.ts +66 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/index.js +210 -0
- package/dist/governance/index.js.map +1 -0
- package/dist/governance/merge.d.ts +31 -0
- package/dist/governance/merge.d.ts.map +1 -0
- package/dist/governance/merge.js +167 -0
- package/dist/governance/merge.js.map +1 -0
- package/dist/identity/index.d.ts +199 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +415 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/maloca/backoffice.d.ts +31 -0
- package/dist/maloca/backoffice.d.ts.map +1 -0
- package/dist/maloca/backoffice.js +40 -0
- package/dist/maloca/backoffice.js.map +1 -0
- package/dist/maloca/event-bus.d.ts +60 -0
- package/dist/maloca/event-bus.d.ts.map +1 -0
- package/dist/maloca/event-bus.js +175 -0
- package/dist/maloca/event-bus.js.map +1 -0
- package/dist/maloca/evidentia.d.ts +136 -0
- package/dist/maloca/evidentia.d.ts.map +1 -0
- package/dist/maloca/evidentia.js +447 -0
- package/dist/maloca/evidentia.js.map +1 -0
- package/dist/maloca/gateway/api.d.ts +146 -0
- package/dist/maloca/gateway/api.d.ts.map +1 -0
- package/dist/maloca/gateway/api.js +228 -0
- package/dist/maloca/gateway/api.js.map +1 -0
- package/dist/maloca/gateway/auth.d.ts +20 -0
- package/dist/maloca/gateway/auth.d.ts.map +1 -0
- package/dist/maloca/gateway/auth.js +115 -0
- package/dist/maloca/gateway/auth.js.map +1 -0
- package/dist/maloca/gateway/dashboard.d.ts +42 -0
- package/dist/maloca/gateway/dashboard.d.ts.map +1 -0
- package/dist/maloca/gateway/dashboard.js +67 -0
- package/dist/maloca/gateway/dashboard.js.map +1 -0
- package/dist/maloca/gateway/websocket.d.ts +34 -0
- package/dist/maloca/gateway/websocket.d.ts.map +1 -0
- package/dist/maloca/gateway/websocket.js +71 -0
- package/dist/maloca/gateway/websocket.js.map +1 -0
- package/dist/maloca/karma.d.ts +165 -0
- package/dist/maloca/karma.d.ts.map +1 -0
- package/dist/maloca/karma.js +307 -0
- package/dist/maloca/karma.js.map +1 -0
- package/dist/maloca/kernel.d.ts +20 -0
- package/dist/maloca/kernel.d.ts.map +1 -0
- package/dist/maloca/kernel.js +76 -0
- package/dist/maloca/kernel.js.map +1 -0
- package/dist/maloca/metadata.d.ts +30 -0
- package/dist/maloca/metadata.d.ts.map +1 -0
- package/dist/maloca/metadata.js +80 -0
- package/dist/maloca/metadata.js.map +1 -0
- package/dist/maloca/perfil.d.ts +57 -0
- package/dist/maloca/perfil.d.ts.map +1 -0
- package/dist/maloca/perfil.js +113 -0
- package/dist/maloca/perfil.js.map +1 -0
- package/dist/maloca/plugin-registry.d.ts +27 -0
- package/dist/maloca/plugin-registry.d.ts.map +1 -0
- package/dist/maloca/plugin-registry.js +76 -0
- package/dist/maloca/plugin-registry.js.map +1 -0
- package/dist/maloca/polygon-bridge.d.ts +63 -0
- package/dist/maloca/polygon-bridge.d.ts.map +1 -0
- package/dist/maloca/polygon-bridge.js +198 -0
- package/dist/maloca/polygon-bridge.js.map +1 -0
- package/dist/maloca/types.d.ts +44 -0
- package/dist/maloca/types.d.ts.map +1 -0
- package/dist/maloca/types.js +2 -0
- package/dist/maloca/types.js.map +1 -0
- package/dist/medico/aval.d.ts +149 -0
- package/dist/medico/aval.d.ts.map +1 -0
- package/dist/medico/aval.js +281 -0
- package/dist/medico/aval.js.map +1 -0
- package/dist/medico/canonica.d.ts +96 -0
- package/dist/medico/canonica.d.ts.map +1 -0
- package/dist/medico/canonica.js +148 -0
- package/dist/medico/canonica.js.map +1 -0
- package/dist/medico/credencial.d.ts +160 -0
- package/dist/medico/credencial.d.ts.map +1 -0
- package/dist/medico/credencial.js +240 -0
- package/dist/medico/credencial.js.map +1 -0
- package/dist/medico/index.d.ts +36 -0
- package/dist/medico/index.d.ts.map +1 -0
- package/dist/medico/index.js +39 -0
- package/dist/medico/index.js.map +1 -0
- package/dist/medico/malla.d.ts +218 -0
- package/dist/medico/malla.d.ts.map +1 -0
- package/dist/medico/malla.js +347 -0
- package/dist/medico/malla.js.map +1 -0
- package/dist/medico/registro-profesional.d.ts +84 -0
- package/dist/medico/registro-profesional.d.ts.map +1 -0
- package/dist/medico/registro-profesional.js +135 -0
- package/dist/medico/registro-profesional.js.map +1 -0
- package/dist/medico/registro.d.ts +149 -0
- package/dist/medico/registro.d.ts.map +1 -0
- package/dist/medico/registro.js +173 -0
- package/dist/medico/registro.js.map +1 -0
- package/dist/medico/types.d.ts +287 -0
- package/dist/medico/types.d.ts.map +1 -0
- package/dist/medico/types.js +135 -0
- package/dist/medico/types.js.map +1 -0
- package/dist/medico/verificacion-registro.d.ts +300 -0
- package/dist/medico/verificacion-registro.d.ts.map +1 -0
- package/dist/medico/verificacion-registro.js +319 -0
- package/dist/medico/verificacion-registro.js.map +1 -0
- package/dist/mesh/index.d.ts +457 -0
- package/dist/mesh/index.d.ts.map +1 -0
- package/dist/mesh/index.js +929 -0
- package/dist/mesh/index.js.map +1 -0
- package/dist/namespaces/encrypted-plugin.d.ts +56 -0
- package/dist/namespaces/encrypted-plugin.d.ts.map +1 -0
- package/dist/namespaces/encrypted-plugin.js +173 -0
- package/dist/namespaces/encrypted-plugin.js.map +1 -0
- package/dist/namespaces/index.d.ts +52 -0
- package/dist/namespaces/index.d.ts.map +1 -0
- package/dist/namespaces/index.js +134 -0
- package/dist/namespaces/index.js.map +1 -0
- package/dist/namespaces/ivn-proofs.d.ts +54 -0
- package/dist/namespaces/ivn-proofs.d.ts.map +1 -0
- package/dist/namespaces/ivn-proofs.js +162 -0
- package/dist/namespaces/ivn-proofs.js.map +1 -0
- package/dist/namespaces/offers-gossip.d.ts +95 -0
- package/dist/namespaces/offers-gossip.d.ts.map +1 -0
- package/dist/namespaces/offers-gossip.js +213 -0
- package/dist/namespaces/offers-gossip.js.map +1 -0
- package/dist/node-memory/idb-store.d.ts +22 -0
- package/dist/node-memory/idb-store.d.ts.map +1 -0
- package/dist/node-memory/idb-store.js +154 -0
- package/dist/node-memory/idb-store.js.map +1 -0
- package/dist/node-memory/index.d.ts +14 -0
- package/dist/node-memory/index.d.ts.map +1 -0
- package/dist/node-memory/index.js +159 -0
- package/dist/node-memory/index.js.map +1 -0
- package/dist/node-memory/sync-flush.d.ts +11 -0
- package/dist/node-memory/sync-flush.d.ts.map +1 -0
- package/dist/node-memory/sync-flush.js +37 -0
- package/dist/node-memory/sync-flush.js.map +1 -0
- package/dist/node-memory/types.d.ts +34 -0
- package/dist/node-memory/types.d.ts.map +1 -0
- package/dist/node-memory/types.js +2 -0
- package/dist/node-memory/types.js.map +1 -0
- package/dist/node-memory/xavier-store.d.ts +12 -0
- package/dist/node-memory/xavier-store.d.ts.map +1 -0
- package/dist/node-memory/xavier-store.js +75 -0
- package/dist/node-memory/xavier-store.js.map +1 -0
- package/dist/op-log/index.d.ts +49 -0
- package/dist/op-log/index.d.ts.map +1 -0
- package/dist/op-log/index.js +190 -0
- package/dist/op-log/index.js.map +1 -0
- package/dist/presence/health.d.ts +54 -0
- package/dist/presence/health.d.ts.map +1 -0
- package/dist/presence/health.js +139 -0
- package/dist/presence/health.js.map +1 -0
- package/dist/presence/index.d.ts +85 -0
- package/dist/presence/index.d.ts.map +1 -0
- package/dist/presence/index.js +255 -0
- package/dist/presence/index.js.map +1 -0
- package/dist/presence/peer-health.d.ts +40 -0
- package/dist/presence/peer-health.d.ts.map +1 -0
- package/dist/presence/peer-health.js +118 -0
- package/dist/presence/peer-health.js.map +1 -0
- package/dist/protocol/canonical.d.ts +10 -0
- package/dist/protocol/canonical.d.ts.map +1 -0
- package/dist/protocol/canonical.js +32 -0
- package/dist/protocol/canonical.js.map +1 -0
- package/dist/protocol/crypto.d.ts +299 -0
- package/dist/protocol/crypto.d.ts.map +1 -0
- package/dist/protocol/crypto.js +739 -0
- package/dist/protocol/crypto.js.map +1 -0
- package/dist/protocol/index.d.ts +30 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +116 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/utils.d.ts +5 -0
- package/dist/protocol/utils.d.ts.map +1 -0
- package/dist/protocol/utils.js +27 -0
- package/dist/protocol/utils.js.map +1 -0
- package/dist/salones/manager.d.ts +100 -0
- package/dist/salones/manager.d.ts.map +1 -0
- package/dist/salones/manager.js +240 -0
- package/dist/salones/manager.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +13 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +32 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/snapshot/index.d.ts +90 -0
- package/dist/snapshot/index.d.ts.map +1 -0
- package/dist/snapshot/index.js +189 -0
- package/dist/snapshot/index.js.map +1 -0
- package/dist/storage/index.d.ts +49 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +176 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/optimizer.d.ts +28 -0
- package/dist/storage/optimizer.d.ts.map +1 -0
- package/dist/storage/optimizer.js +50 -0
- package/dist/storage/optimizer.js.map +1 -0
- package/dist/storage/ydoc-persistence.d.ts +27 -0
- package/dist/storage/ydoc-persistence.d.ts.map +1 -0
- package/dist/storage/ydoc-persistence.js +128 -0
- package/dist/storage/ydoc-persistence.js.map +1 -0
- package/dist/sync/ChunkSyncManager.d.ts +41 -0
- package/dist/sync/ChunkSyncManager.d.ts.map +1 -0
- package/dist/sync/ChunkSyncManager.js +115 -0
- package/dist/sync/ChunkSyncManager.js.map +1 -0
- package/dist/sync/conflict-resolver.d.ts +33 -0
- package/dist/sync/conflict-resolver.d.ts.map +1 -0
- package/dist/sync/conflict-resolver.js +54 -0
- package/dist/sync/conflict-resolver.js.map +1 -0
- package/dist/sync/engine.d.ts +168 -0
- package/dist/sync/engine.d.ts.map +1 -0
- package/dist/sync/engine.js +315 -0
- package/dist/sync/engine.js.map +1 -0
- package/dist/sync/index.d.ts +3 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +3 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/transport/TorTransportAdapter.d.ts +70 -0
- package/dist/transport/TorTransportAdapter.d.ts.map +1 -0
- package/dist/transport/TorTransportAdapter.js +192 -0
- package/dist/transport/TorTransportAdapter.js.map +1 -0
- package/dist/transport/memory.d.ts +31 -0
- package/dist/transport/memory.d.ts.map +1 -0
- package/dist/transport/memory.js +114 -0
- package/dist/transport/memory.js.map +1 -0
- package/dist/transport/peerjs.d.ts +45 -0
- package/dist/transport/peerjs.d.ts.map +1 -0
- package/dist/transport/peerjs.js +301 -0
- package/dist/transport/peerjs.js.map +1 -0
- package/dist/transport/pqc-handshake.d.ts +72 -0
- package/dist/transport/pqc-handshake.d.ts.map +1 -0
- package/dist/transport/pqc-handshake.js +129 -0
- package/dist/transport/pqc-handshake.js.map +1 -0
- package/dist/transport/relay-config.d.ts +11 -0
- package/dist/transport/relay-config.d.ts.map +1 -0
- package/dist/transport/relay-config.js +48 -0
- package/dist/transport/relay-config.js.map +1 -0
- package/dist/transport/relay-server.d.ts +37 -0
- package/dist/transport/relay-server.d.ts.map +1 -0
- package/dist/transport/relay-server.js +230 -0
- package/dist/transport/relay-server.js.map +1 -0
- package/dist/transport/tor.d.ts +47 -0
- package/dist/transport/tor.d.ts.map +1 -0
- package/dist/transport/tor.js +158 -0
- package/dist/transport/tor.js.map +1 -0
- package/dist/transport/types.d.ts +34 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +2 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/types/index.d.ts +293 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +73 -0
- package/dist/types/index.js.map +1 -0
- package/dist/web/admission.d.ts +24 -0
- package/dist/web/admission.d.ts.map +1 -0
- package/dist/web/admission.js +41 -0
- package/dist/web/admission.js.map +1 -0
- package/dist/web/crypto.d.ts +18 -0
- package/dist/web/crypto.d.ts.map +1 -0
- package/dist/web/crypto.js +78 -0
- package/dist/web/crypto.js.map +1 -0
- package/dist/web/exchange.d.ts +23 -0
- package/dist/web/exchange.d.ts.map +1 -0
- package/dist/web/exchange.js +54 -0
- package/dist/web/exchange.js.map +1 -0
- package/dist/web/fragment.d.ts +58 -0
- package/dist/web/fragment.d.ts.map +1 -0
- package/dist/web/fragment.js +198 -0
- package/dist/web/fragment.js.map +1 -0
- package/dist/web/index.d.ts +25 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +14 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/merge/index.d.ts +104 -0
- package/dist/web/merge/index.d.ts.map +1 -0
- package/dist/web/merge/index.js +236 -0
- package/dist/web/merge/index.js.map +1 -0
- package/dist/web/oplog/hlc.d.ts +19 -0
- package/dist/web/oplog/hlc.d.ts.map +1 -0
- package/dist/web/oplog/hlc.js +39 -0
- package/dist/web/oplog/hlc.js.map +1 -0
- package/dist/web/oplog/index.d.ts +10 -0
- package/dist/web/oplog/index.d.ts.map +1 -0
- package/dist/web/oplog/index.js +6 -0
- package/dist/web/oplog/index.js.map +1 -0
- package/dist/web/oplog/log.d.ts +182 -0
- package/dist/web/oplog/log.d.ts.map +1 -0
- package/dist/web/oplog/log.js +693 -0
- package/dist/web/oplog/log.js.map +1 -0
- package/dist/web/oplog/store.d.ts +40 -0
- package/dist/web/oplog/store.d.ts.map +1 -0
- package/dist/web/oplog/store.js +85 -0
- package/dist/web/oplog/store.js.map +1 -0
- package/dist/web/oplog/sync.d.ts +54 -0
- package/dist/web/oplog/sync.d.ts.map +1 -0
- package/dist/web/oplog/sync.js +162 -0
- package/dist/web/oplog/sync.js.map +1 -0
- package/dist/web/oplog/types.d.ts +119 -0
- package/dist/web/oplog/types.d.ts.map +1 -0
- package/dist/web/oplog/types.js +2 -0
- package/dist/web/oplog/types.js.map +1 -0
- package/dist/web/pairing.d.ts +186 -0
- package/dist/web/pairing.d.ts.map +1 -0
- package/dist/web/pairing.js +395 -0
- package/dist/web/pairing.js.map +1 -0
- package/dist/web/pq.d.ts +36 -0
- package/dist/web/pq.d.ts.map +1 -0
- package/dist/web/pq.js +59 -0
- package/dist/web/pq.js.map +1 -0
- package/dist/web/provider.d.ts +188 -0
- package/dist/web/provider.d.ts.map +1 -0
- package/dist/web/provider.js +2042 -0
- package/dist/web/provider.js.map +1 -0
- package/dist/web/rooms.d.ts +20 -0
- package/dist/web/rooms.d.ts.map +1 -0
- package/dist/web/rooms.js +51 -0
- package/dist/web/rooms.js.map +1 -0
- package/dist/web/rotation.d.ts +73 -0
- package/dist/web/rotation.d.ts.map +1 -0
- package/dist/web/rotation.js +130 -0
- package/dist/web/rotation.js.map +1 -0
- package/dist/web/secstate.d.ts +213 -0
- package/dist/web/secstate.d.ts.map +1 -0
- package/dist/web/secstate.js +789 -0
- package/dist/web/secstate.js.map +1 -0
- package/dist/web/store.d.ts +9 -0
- package/dist/web/store.d.ts.map +1 -0
- package/dist/web/store.js +32 -0
- package/dist/web/store.js.map +1 -0
- package/dist/web/transports/loopback.d.ts +11 -0
- package/dist/web/transports/loopback.d.ts.map +1 -0
- package/dist/web/transports/loopback.js +97 -0
- package/dist/web/transports/loopback.js.map +1 -0
- package/dist/web/transports/qr-sdp.d.ts +27 -0
- package/dist/web/transports/qr-sdp.d.ts.map +1 -0
- package/dist/web/transports/qr-sdp.js +131 -0
- package/dist/web/transports/qr-sdp.js.map +1 -0
- package/dist/web/transports/ws.d.ts +12 -0
- package/dist/web/transports/ws.d.ts.map +1 -0
- package/dist/web/transports/ws.js +139 -0
- package/dist/web/transports/ws.js.map +1 -0
- package/dist/web/trust/canonical.d.ts +8 -0
- package/dist/web/trust/canonical.d.ts.map +1 -0
- package/dist/web/trust/canonical.js +27 -0
- package/dist/web/trust/canonical.js.map +1 -0
- package/dist/web/trust/docs.d.ts +51 -0
- package/dist/web/trust/docs.d.ts.map +1 -0
- package/dist/web/trust/docs.js +170 -0
- package/dist/web/trust/docs.js.map +1 -0
- package/dist/web/trust/index.d.ts +10 -0
- package/dist/web/trust/index.d.ts.map +1 -0
- package/dist/web/trust/index.js +7 -0
- package/dist/web/trust/index.js.map +1 -0
- package/dist/web/trust/keys.d.ts +37 -0
- package/dist/web/trust/keys.d.ts.map +1 -0
- package/dist/web/trust/keys.js +75 -0
- package/dist/web/trust/keys.js.map +1 -0
- package/dist/web/trust/store.d.ts +150 -0
- package/dist/web/trust/store.d.ts.map +1 -0
- package/dist/web/trust/store.js +587 -0
- package/dist/web/trust/store.js.map +1 -0
- package/dist/web/trust/types.d.ts +134 -0
- package/dist/web/trust/types.d.ts.map +1 -0
- package/dist/web/trust/types.js +4 -0
- package/dist/web/trust/types.js.map +1 -0
- package/dist/web/types.d.ts +115 -0
- package/dist/web/types.d.ts.map +1 -0
- package/dist/web/types.js +2 -0
- package/dist/web/types.js.map +1 -0
- package/dist/web/util.d.ts +12 -0
- package/dist/web/util.d.ts.map +1 -0
- package/dist/web/util.js +54 -0
- package/dist/web/util.js.map +1 -0
- package/dist/web/webrtc.d.ts +35 -0
- package/dist/web/webrtc.d.ts.map +1 -0
- package/dist/web/webrtc.js +304 -0
- package/dist/web/webrtc.js.map +1 -0
- package/package.json +138 -4
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Identity of mesh devices and the trust anchor. Membership and authority themselves live in web/trust (signed
|
|
2
|
+
// grants and revocations, see `secstate.ts`): this module only keeps what every layer shares.
|
|
3
|
+
import { deviceIdOf } from "./pq.js";
|
|
4
|
+
import { b64uDecode, isCanonicalB64u } from "./util.js";
|
|
5
|
+
/** A deviceId is the fingerprint of the device's ML-DSA-65 identity key (`deviceIdOf`): 43 base64url characters. */
|
|
6
|
+
export const DEVICE_ID_RE = /^[A-Za-z0-9_-]{43}$/;
|
|
7
|
+
export const isDeviceId = (x) => typeof x === "string" && DEVICE_ID_RE.test(x);
|
|
8
|
+
const fpCache = new Map();
|
|
9
|
+
/** True iff `deviceId` is the fingerprint of the base64url identity key `pub` (the binding every check relies on). */
|
|
10
|
+
export async function idMatchesPub(deviceId, pub) {
|
|
11
|
+
// R4-N3: a key is accepted only in its canonical encoding (the string is what web/trust documents carry)
|
|
12
|
+
if (!isDeviceId(deviceId) || typeof pub !== "string" || !isCanonicalB64u(pub))
|
|
13
|
+
return false;
|
|
14
|
+
let fp = fpCache.get(pub);
|
|
15
|
+
if (fp === undefined) {
|
|
16
|
+
try {
|
|
17
|
+
fp = await deviceIdOf(b64uDecode(pub));
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
if (fpCache.size >= 4096)
|
|
23
|
+
fpCache.clear();
|
|
24
|
+
fpCache.set(pub, fp);
|
|
25
|
+
}
|
|
26
|
+
return fp === deviceId;
|
|
27
|
+
}
|
|
28
|
+
/** SF1: epochs stay far below any integer edge (u32 on the wire, safe integers in JS). */
|
|
29
|
+
export const MAX_EPOCH = 2 ** 31 - 1;
|
|
30
|
+
/** SF1: a received rotation may skip at most this many epochs ahead of the local one. */
|
|
31
|
+
export const MAX_EPOCH_SKIP = 8;
|
|
32
|
+
export const isEpoch = (x) => typeof x === "number" && Number.isSafeInteger(x) && x >= 0 && x <= MAX_EPOCH;
|
|
33
|
+
/** Who may admit whom: the owner admits admins and members, an admin admits members, members admit nobody. */
|
|
34
|
+
export function canIssue(issuer, subject) {
|
|
35
|
+
if (subject === "owner")
|
|
36
|
+
return false;
|
|
37
|
+
if (issuer === "owner")
|
|
38
|
+
return true;
|
|
39
|
+
return issuer === "admin" && subject === "member";
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=admission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admission.js","sourceRoot":"","sources":["../../src/web/admission.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,8FAA8F;AAC9F,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAExD,oHAAoH;AACpH,MAAM,CAAC,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAU,EAAe,EAAE,CACrD,OAAO,CAAC,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC1C,sHAAsH;AACtH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,QAAgB,EAChB,GAAW;IAEX,yGAAyG;IACzG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QAC5E,OAAO,KAAK,CAAC;IACd,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC;YACJ,EAAE,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI;YAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,EAAE,KAAK,QAAQ,CAAC;AACxB,CAAC;AAeD,0FAA0F;AAC1F,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACrC,yFAAyF;AACzF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAChC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAU,EAAe,EAAE,CAClD,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;AAE9E,8GAA8G;AAC9G,MAAM,UAAU,QAAQ,CAAC,MAAY,EAAE,OAAa;IACnD,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,MAAM,KAAK,OAAO,IAAI,OAAO,KAAK,QAAQ,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { equalBytes } from "./util.js";
|
|
2
|
+
export declare const NONCE_LEN = 12;
|
|
3
|
+
export declare function hkdf(ikm: Uint8Array, info: string, salt?: Uint8Array): Promise<Uint8Array>;
|
|
4
|
+
export declare function importAesKey(raw: Uint8Array): Promise<CryptoKey>;
|
|
5
|
+
/** Doc material = HKDF(meshKey, "swal-doc/v1|" + topic) (32 raw bytes). Never used directly to seal. */
|
|
6
|
+
export declare function deriveDocMaterial(meshKey: Uint8Array, topicName: string): Promise<Uint8Array>;
|
|
7
|
+
/** Sender key = HKDF(docMaterial, "swal-doc/v1|" + topic + "|sender|" + deviceId) -> AES-256-GCM. Each sender seals under its own key. */
|
|
8
|
+
export declare function deriveSenderKey(docMaterial: Uint8Array, topicName: string, deviceId: string): Promise<CryptoKey>;
|
|
9
|
+
/** Convenience (single-writer use / tests): the topic-level key without a sender component. */
|
|
10
|
+
export declare function deriveDocKey(meshKey: Uint8Array, topicName: string): Promise<CryptoKey>;
|
|
11
|
+
/** Test hook: position the counter of `key` (e.g. right before the wrap). */
|
|
12
|
+
export declare function __setNonceCounter(key: CryptoKey, n: number): void;
|
|
13
|
+
/** Returns nonce(12) | ciphertext+tag. */
|
|
14
|
+
export declare function sealUpdate(docKey: CryptoKey, bytes: Uint8Array, aad?: Uint8Array | string): Promise<Uint8Array>;
|
|
15
|
+
/** Throws on tampering / wrong key / wrong aad. */
|
|
16
|
+
export declare function openUpdate(docKey: CryptoKey, sealed: Uint8Array, aad?: Uint8Array | string): Promise<Uint8Array>;
|
|
17
|
+
export { equalBytes };
|
|
18
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/web/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,UAAU,EAAqB,MAAM,WAAW,CAAC;AAEtE,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,wBAAsB,IAAI,CACzB,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,UAA+B,GACnC,OAAO,CAAC,UAAU,CAAC,CAUrB;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAKtE;AAED,wGAAwG;AACxG,wBAAsB,iBAAiB,CACtC,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAErB;AAED,0IAA0I;AAC1I,wBAAsB,eAAe,CACpC,WAAW,EAAE,UAAU,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,CAAC,CAIpB;AAED,+FAA+F;AAC/F,wBAAsB,YAAY,CACjC,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,SAAS,CAAC,CAEpB;AAwBD,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAOjE;AAED,0CAA0C;AAC1C,wBAAsB,UAAU,CAC/B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,UAAU,EACjB,GAAG,GAAE,UAAU,GAAG,MAA0B,GAC1C,OAAO,CAAC,UAAU,CAAC,CASrB;AAED,mDAAmD;AACnD,wBAAsB,UAAU,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,EAClB,GAAG,GAAE,UAAU,GAAG,MAA0B,GAC1C,OAAO,CAAC,UAAU,CAAC,CAcrB;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { bs, concat, equalBytes, randomBytes, utf8 } from "./util.js";
|
|
2
|
+
export const NONCE_LEN = 12;
|
|
3
|
+
export async function hkdf(ikm, info, salt = new Uint8Array(32)) {
|
|
4
|
+
const k = await crypto.subtle.importKey("raw", bs(ikm), "HKDF", false, [
|
|
5
|
+
"deriveBits",
|
|
6
|
+
]);
|
|
7
|
+
const bits = await crypto.subtle.deriveBits({ name: "HKDF", hash: "SHA-256", salt: bs(salt), info: bs(utf8(info)) }, k, 256);
|
|
8
|
+
return new Uint8Array(bits);
|
|
9
|
+
}
|
|
10
|
+
export async function importAesKey(raw) {
|
|
11
|
+
return crypto.subtle.importKey("raw", bs(raw), "AES-GCM", false, [
|
|
12
|
+
"encrypt",
|
|
13
|
+
"decrypt",
|
|
14
|
+
]);
|
|
15
|
+
}
|
|
16
|
+
/** Doc material = HKDF(meshKey, "swal-doc/v1|" + topic) (32 raw bytes). Never used directly to seal. */
|
|
17
|
+
export async function deriveDocMaterial(meshKey, topicName) {
|
|
18
|
+
return hkdf(meshKey, `swal-doc/v1|${topicName}`);
|
|
19
|
+
}
|
|
20
|
+
/** Sender key = HKDF(docMaterial, "swal-doc/v1|" + topic + "|sender|" + deviceId) -> AES-256-GCM. Each sender seals under its own key. */
|
|
21
|
+
export async function deriveSenderKey(docMaterial, topicName, deviceId) {
|
|
22
|
+
return importAesKey(await hkdf(docMaterial, `swal-doc/v1|${topicName}|sender|${deviceId}`));
|
|
23
|
+
}
|
|
24
|
+
/** Convenience (single-writer use / tests): the topic-level key without a sender component. */
|
|
25
|
+
export async function deriveDocKey(meshKey, topicName) {
|
|
26
|
+
return importAesKey(await deriveDocMaterial(meshKey, topicName));
|
|
27
|
+
}
|
|
28
|
+
// Nonce = 8B random prefix | 4B big-endian counter. A sealing key is already unique per
|
|
29
|
+
// sender (see deriveSenderKey); the random prefix additionally separates sessions/reloads
|
|
30
|
+
// of the same sender, and the prefix is regenerated before the 32-bit counter can wrap.
|
|
31
|
+
const COUNTER_MAX = 0xffffffff;
|
|
32
|
+
const counters = new WeakMap();
|
|
33
|
+
function nextNonce(key) {
|
|
34
|
+
let st = counters.get(key);
|
|
35
|
+
if (!st) {
|
|
36
|
+
st = { prefix: randomBytes(8), n: 0 };
|
|
37
|
+
counters.set(key, st);
|
|
38
|
+
}
|
|
39
|
+
if (st.n >= COUNTER_MAX) {
|
|
40
|
+
st.prefix = randomBytes(8);
|
|
41
|
+
st.n = 0;
|
|
42
|
+
}
|
|
43
|
+
st.n += 1;
|
|
44
|
+
const nonce = new Uint8Array(NONCE_LEN);
|
|
45
|
+
nonce.set(st.prefix, 0);
|
|
46
|
+
new DataView(nonce.buffer).setUint32(8, st.n, false);
|
|
47
|
+
return nonce;
|
|
48
|
+
}
|
|
49
|
+
/** Test hook: position the counter of `key` (e.g. right before the wrap). */
|
|
50
|
+
export function __setNonceCounter(key, n) {
|
|
51
|
+
let st = counters.get(key);
|
|
52
|
+
if (!st) {
|
|
53
|
+
st = { prefix: randomBytes(8), n: 0 };
|
|
54
|
+
counters.set(key, st);
|
|
55
|
+
}
|
|
56
|
+
st.n = n;
|
|
57
|
+
}
|
|
58
|
+
/** Returns nonce(12) | ciphertext+tag. */
|
|
59
|
+
export async function sealUpdate(docKey, bytes, aad = new Uint8Array(0)) {
|
|
60
|
+
const nonce = nextNonce(docKey);
|
|
61
|
+
const additionalData = typeof aad === "string" ? utf8(aad) : aad;
|
|
62
|
+
const ct = await crypto.subtle.encrypt({ name: "AES-GCM", iv: bs(nonce), additionalData: bs(additionalData) }, docKey, bs(bytes));
|
|
63
|
+
return concat(nonce, new Uint8Array(ct));
|
|
64
|
+
}
|
|
65
|
+
/** Throws on tampering / wrong key / wrong aad. */
|
|
66
|
+
export async function openUpdate(docKey, sealed, aad = new Uint8Array(0)) {
|
|
67
|
+
if (sealed.length < NONCE_LEN + 16)
|
|
68
|
+
throw new Error("sealed payload too short");
|
|
69
|
+
const additionalData = typeof aad === "string" ? utf8(aad) : aad;
|
|
70
|
+
const pt = await crypto.subtle.decrypt({
|
|
71
|
+
name: "AES-GCM",
|
|
72
|
+
iv: bs(sealed.subarray(0, NONCE_LEN)),
|
|
73
|
+
additionalData: bs(additionalData),
|
|
74
|
+
}, docKey, bs(sealed.subarray(NONCE_LEN)));
|
|
75
|
+
return new Uint8Array(pt);
|
|
76
|
+
}
|
|
77
|
+
export { equalBytes };
|
|
78
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/web/crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Mesh } from "./provider.js";
|
|
2
|
+
export declare const HEALTH_SCHEMA_PREFIX = "swal.health/v1";
|
|
3
|
+
export interface HealthRecord {
|
|
4
|
+
/** e.g. "swal.health/v1" or "swal.health/v1.weight" */
|
|
5
|
+
schema: string;
|
|
6
|
+
[k: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
export declare function isHealthRecord(r: unknown): r is HealthRecord;
|
|
9
|
+
/** Topic carrying cross-app health records for one subject (`subj_<ULID>`). */
|
|
10
|
+
export declare const exchangeTopic: (subject: string) => string;
|
|
11
|
+
export interface Exchange {
|
|
12
|
+
topic: string;
|
|
13
|
+
send(record: HealthRecord): string;
|
|
14
|
+
onReceive(cb: (record: HealthRecord) => void): () => void;
|
|
15
|
+
destroy(): void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Cross-app exchange over a dedicated mesh (created with topic = exchangeTopic(subject)).
|
|
19
|
+
* Records live in an append-only Y.Array 'records'; receivers see only entries added remotely
|
|
20
|
+
* (or by any writer after subscription), de-duplicated by record id.
|
|
21
|
+
*/
|
|
22
|
+
export declare function exchange(mesh: Mesh, doc: import("yjs").Doc, subject: string): Exchange;
|
|
23
|
+
//# sourceMappingURL=exchange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange.d.ts","sourceRoot":"","sources":["../../src/web/exchange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAErD,MAAM,WAAW,YAAY;IAC5B,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,YAAY,CAO5D;AAED,+EAA+E;AAC/E,eAAO,MAAM,aAAa,YAAa,MAAM,WACR,CAAC;AAEtC,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC;IACnC,SAAS,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC1D,OAAO,IAAI,IAAI,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACvB,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,OAAO,KAAK,EAAE,GAAG,EACtB,OAAO,EAAE,MAAM,GACb,QAAQ,CAyCV"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { topic } from "./rooms.js";
|
|
2
|
+
export const HEALTH_SCHEMA_PREFIX = "swal.health/v1";
|
|
3
|
+
export function isHealthRecord(r) {
|
|
4
|
+
return (typeof r === "object" &&
|
|
5
|
+
r !== null &&
|
|
6
|
+
typeof r.schema === "string" &&
|
|
7
|
+
r.schema.startsWith(HEALTH_SCHEMA_PREFIX));
|
|
8
|
+
}
|
|
9
|
+
/** Topic carrying cross-app health records for one subject (`subj_<ULID>`). */
|
|
10
|
+
export const exchangeTopic = (subject) => topic("health", "exchange", subject);
|
|
11
|
+
/**
|
|
12
|
+
* Cross-app exchange over a dedicated mesh (created with topic = exchangeTopic(subject)).
|
|
13
|
+
* Records live in an append-only Y.Array 'records'; receivers see only entries added remotely
|
|
14
|
+
* (or by any writer after subscription), de-duplicated by record id.
|
|
15
|
+
*/
|
|
16
|
+
export function exchange(mesh, doc, subject) {
|
|
17
|
+
const arr = doc.getArray("records");
|
|
18
|
+
const cbs = new Set();
|
|
19
|
+
const seen = new Set();
|
|
20
|
+
const obs = (ev) => {
|
|
21
|
+
if (ev.transaction.local)
|
|
22
|
+
return;
|
|
23
|
+
for (const item of ev.changes.added) {
|
|
24
|
+
for (const e of item.content.getContent()) {
|
|
25
|
+
if (seen.has(e.id) || !isHealthRecord(e.record))
|
|
26
|
+
continue;
|
|
27
|
+
seen.add(e.id);
|
|
28
|
+
for (const cb of cbs)
|
|
29
|
+
cb(e.record);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
arr.observe(obs);
|
|
34
|
+
return {
|
|
35
|
+
topic: exchangeTopic(subject),
|
|
36
|
+
send(record) {
|
|
37
|
+
if (!isHealthRecord(record))
|
|
38
|
+
throw new Error(`record.schema must start with "${HEALTH_SCHEMA_PREFIX}"`);
|
|
39
|
+
const id = crypto.randomUUID();
|
|
40
|
+
seen.add(id);
|
|
41
|
+
arr.push([{ id, record }]);
|
|
42
|
+
return id;
|
|
43
|
+
},
|
|
44
|
+
onReceive(cb) {
|
|
45
|
+
cbs.add(cb);
|
|
46
|
+
return () => void cbs.delete(cb);
|
|
47
|
+
},
|
|
48
|
+
destroy() {
|
|
49
|
+
arr.unobserve(obs);
|
|
50
|
+
cbs.clear();
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=exchange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../src/web/exchange.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAQrD,MAAM,UAAU,cAAc,CAAC,CAAU;IACxC,OAAO,CACN,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACV,OAAQ,CAAkB,CAAC,MAAM,KAAK,QAAQ;QAC7C,CAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAC3D,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,EAAE,CAChD,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAStC;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CACvB,IAAU,EACV,GAAsB,EACtB,OAAe;IAEf,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAuC,SAAS,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,IAAI,GAAG,EAA6B,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAG,CACX,EAAmE,EAClE,EAAE;QACH,IAAI,EAAE,CAAC,WAAW,CAAC,KAAK;YAAE,OAAO;QACjC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAGrC,EAAE,CAAC;gBACJ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC;oBAAE,SAAS;gBAC1D,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,MAAM,EAAE,IAAI,GAAG;oBAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IACF,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO;QACN,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,MAAM;YACV,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;gBAC1B,MAAM,IAAI,KAAK,CACd,kCAAkC,oBAAoB,GAAG,CACzD,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC3B,OAAO,EAAE,CAAC;QACX,CAAC;QACD,SAAS,CAAC,EAAE;YACX,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACZ,OAAO,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,OAAO;YACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export declare const F_FRAG = 4;
|
|
2
|
+
export declare const FRAG_HEADER: number;
|
|
3
|
+
export declare const DEFAULT_MAX_FRAME: number;
|
|
4
|
+
export declare const DEFAULT_MAX_MESSAGE: number;
|
|
5
|
+
/** Split `msg` into frames of at most `maxFrame` bytes; a message that already fits is returned as is. */
|
|
6
|
+
export declare function fragment(msg: Uint8Array, maxFrame?: number): Promise<Uint8Array[]>;
|
|
7
|
+
/** A byte budget shared by several reassemblers (e.g. every not-yet-authenticated link of a mesh). */
|
|
8
|
+
export interface ByteBudget {
|
|
9
|
+
used: number;
|
|
10
|
+
readonly max: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ReassemblerOptions {
|
|
13
|
+
/** Largest message accepted (declared length). Default 64 MiB. */
|
|
14
|
+
maxMessageBytes?: number;
|
|
15
|
+
/** Sum of declared lengths of all partial messages; the oldest partials are evicted beyond it. Default = maxMessageBytes. */
|
|
16
|
+
maxPendingBytes?: number;
|
|
17
|
+
/** A partial message older than this is dropped. Default 30 s. */
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
now?: () => number;
|
|
20
|
+
onDrop?: (reason: string) => void;
|
|
21
|
+
/** Also charge every partial message to this shared budget (dropped when it would overflow). */
|
|
22
|
+
shared?: ByteBudget;
|
|
23
|
+
}
|
|
24
|
+
/** Reassembles fragments arriving on ONE link. Not shared between links (a peer cannot complete another's message). */
|
|
25
|
+
export declare class Reassembler {
|
|
26
|
+
private o;
|
|
27
|
+
private partials;
|
|
28
|
+
private declared;
|
|
29
|
+
private timer;
|
|
30
|
+
private maxMessage;
|
|
31
|
+
private maxPendingBytes;
|
|
32
|
+
private shared?;
|
|
33
|
+
private readonly timeoutMs;
|
|
34
|
+
private readonly now;
|
|
35
|
+
constructor(o?: ReassemblerOptions);
|
|
36
|
+
/**
|
|
37
|
+
* Change the limits (e.g. once the link is authenticated). `shared: null` stops charging NEW partials to the
|
|
38
|
+
* shared budget; partials already charged release it when they complete or are dropped.
|
|
39
|
+
*/
|
|
40
|
+
setLimits(o: {
|
|
41
|
+
maxMessageBytes?: number;
|
|
42
|
+
maxPendingBytes?: number;
|
|
43
|
+
shared?: ByteBudget | null;
|
|
44
|
+
}): void;
|
|
45
|
+
get pending(): number;
|
|
46
|
+
get pendingBytes(): number;
|
|
47
|
+
/** Returns the whole message once its last fragment arrives and the hash matches; null otherwise. */
|
|
48
|
+
push(frame: Uint8Array): Promise<Uint8Array | null>;
|
|
49
|
+
/** Drop partial messages older than the timeout. */
|
|
50
|
+
sweep(): void;
|
|
51
|
+
clear(): void;
|
|
52
|
+
private evictOldest;
|
|
53
|
+
private remove;
|
|
54
|
+
private drop;
|
|
55
|
+
/** Free memory of stalled partials even if no further fragment ever arrives. */
|
|
56
|
+
private arm;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=fragment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fragment.d.ts","sourceRoot":"","sources":["../../src/web/fragment.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,MAAM,IAAI,CAAC;AACxB,eAAO,MAAM,WAAW,QAAyB,CAAC;AAClD,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAC3C,eAAO,MAAM,mBAAmB,QAAmB,CAAC;AAMpD,0GAA0G;AAC1G,wBAAsB,QAAQ,CAC7B,GAAG,EAAE,UAAU,EACf,QAAQ,SAAoB,GAC1B,OAAO,CAAC,UAAU,EAAE,CAAC,CAsBvB;AAED,sGAAsG;AACtG,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IAClC,kEAAkE;IAClE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6HAA6H;IAC7H,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gGAAgG;IAChG,MAAM,CAAC,EAAE,UAAU,CAAC;CACpB;AAaD,uHAAuH;AACvH,qBAAa,WAAW;IAUX,OAAO,CAAC,CAAC;IATrB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IAEnC,YAAoB,CAAC,GAAE,kBAAuB,EAM7C;IAED;;;OAGG;IACH,SAAS,CAAC,CAAC,EAAE;QACZ,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;KAC3B,GAAG,IAAI,CAKP;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IACD,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,qGAAqG;IAC/F,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA8DxD;IAED,oDAAoD;IACpD,KAAK,IAAI,IAAI,CAIZ;IAED,KAAK,IAAI,IAAI,CAOZ;IAED,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,IAAI;IAMZ,gFAAgF;IAChF,OAAO,CAAC,GAAG;CASX"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// Transport-independent fragmentation of mesh messages (H5). Browsers cap a DataChannel message
|
|
2
|
+
// (RTCSctpTransport.maxMessageSize, ~256 KiB in Chrome) and other link transports may cap lower, while an
|
|
3
|
+
// initial sync or a pairing grant can be megabytes. Messages above `maxFrame` are split into self-describing
|
|
4
|
+
// fragments and reassembled with integrity (sequence + total + length + SHA-256), bounded memory and a timeout.
|
|
5
|
+
//
|
|
6
|
+
// Fragment: F_FRAG | msgId(8) | seq(u32) | total(u32) | len(u32) | sha256(32) | chunk
|
|
7
|
+
import { bs, concat, equalBytes, randomBytes } from "./util.js";
|
|
8
|
+
export const F_FRAG = 4;
|
|
9
|
+
export const FRAG_HEADER = 1 + 8 + 4 + 4 + 4 + 32;
|
|
10
|
+
export const DEFAULT_MAX_FRAME = 64 * 1024;
|
|
11
|
+
export const DEFAULT_MAX_MESSAGE = 64 * 1024 * 1024;
|
|
12
|
+
const MAX_FRAGMENTS = 1 << 20;
|
|
13
|
+
const sha256 = async (b) => new Uint8Array(await crypto.subtle.digest("SHA-256", bs(b)));
|
|
14
|
+
/** Split `msg` into frames of at most `maxFrame` bytes; a message that already fits is returned as is. */
|
|
15
|
+
export async function fragment(msg, maxFrame = DEFAULT_MAX_FRAME) {
|
|
16
|
+
if (msg.length <= maxFrame)
|
|
17
|
+
return [msg];
|
|
18
|
+
const chunk = maxFrame - FRAG_HEADER;
|
|
19
|
+
if (chunk < 1)
|
|
20
|
+
throw new Error("maxFrame too small");
|
|
21
|
+
const total = Math.ceil(msg.length / chunk);
|
|
22
|
+
const id = randomBytes(8);
|
|
23
|
+
const hash = await sha256(msg);
|
|
24
|
+
const out = [];
|
|
25
|
+
for (let seq = 0; seq < total; seq++) {
|
|
26
|
+
const body = msg.subarray(seq * chunk, (seq + 1) * chunk);
|
|
27
|
+
const f = new Uint8Array(FRAG_HEADER + body.length);
|
|
28
|
+
const dv = new DataView(f.buffer);
|
|
29
|
+
f[0] = F_FRAG;
|
|
30
|
+
f.set(id, 1);
|
|
31
|
+
dv.setUint32(9, seq);
|
|
32
|
+
dv.setUint32(13, total);
|
|
33
|
+
dv.setUint32(17, msg.length);
|
|
34
|
+
f.set(hash, 21);
|
|
35
|
+
f.set(body, FRAG_HEADER);
|
|
36
|
+
out.push(f);
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
/** Reassembles fragments arriving on ONE link. Not shared between links (a peer cannot complete another's message). */
|
|
41
|
+
export class Reassembler {
|
|
42
|
+
o;
|
|
43
|
+
partials = new Map();
|
|
44
|
+
declared = 0;
|
|
45
|
+
timer = null;
|
|
46
|
+
maxMessage;
|
|
47
|
+
maxPendingBytes;
|
|
48
|
+
shared;
|
|
49
|
+
timeoutMs;
|
|
50
|
+
now;
|
|
51
|
+
constructor(o = {}) {
|
|
52
|
+
this.o = o;
|
|
53
|
+
this.maxMessage = o.maxMessageBytes ?? DEFAULT_MAX_MESSAGE;
|
|
54
|
+
this.maxPendingBytes = o.maxPendingBytes ?? this.maxMessage;
|
|
55
|
+
this.shared = o.shared;
|
|
56
|
+
this.timeoutMs = o.timeoutMs ?? 30_000;
|
|
57
|
+
this.now = o.now ?? (() => Date.now());
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Change the limits (e.g. once the link is authenticated). `shared: null` stops charging NEW partials to the
|
|
61
|
+
* shared budget; partials already charged release it when they complete or are dropped.
|
|
62
|
+
*/
|
|
63
|
+
setLimits(o) {
|
|
64
|
+
if (o.maxMessageBytes !== undefined)
|
|
65
|
+
this.maxMessage = o.maxMessageBytes;
|
|
66
|
+
if (o.maxPendingBytes !== undefined)
|
|
67
|
+
this.maxPendingBytes = o.maxPendingBytes;
|
|
68
|
+
if (o.shared !== undefined)
|
|
69
|
+
this.shared = o.shared ?? undefined;
|
|
70
|
+
}
|
|
71
|
+
get pending() {
|
|
72
|
+
return this.partials.size;
|
|
73
|
+
}
|
|
74
|
+
get pendingBytes() {
|
|
75
|
+
return this.declared;
|
|
76
|
+
}
|
|
77
|
+
/** Returns the whole message once its last fragment arrives and the hash matches; null otherwise. */
|
|
78
|
+
async push(frame) {
|
|
79
|
+
this.sweep();
|
|
80
|
+
if (frame.length <= FRAG_HEADER || frame[0] !== F_FRAG)
|
|
81
|
+
return this.drop(null, "malformed fragment");
|
|
82
|
+
const dv = new DataView(frame.buffer, frame.byteOffset, frame.byteLength);
|
|
83
|
+
const key = Array.from(frame.subarray(1, 9)).join(",");
|
|
84
|
+
const seq = dv.getUint32(9);
|
|
85
|
+
const total = dv.getUint32(13);
|
|
86
|
+
const len = dv.getUint32(17);
|
|
87
|
+
const hash = frame.subarray(21, FRAG_HEADER);
|
|
88
|
+
const body = frame.subarray(FRAG_HEADER);
|
|
89
|
+
let p = this.partials.get(key);
|
|
90
|
+
if (!p) {
|
|
91
|
+
if (len > this.maxMessage)
|
|
92
|
+
return this.drop(null, "message too large");
|
|
93
|
+
if (total < 2 || total > MAX_FRAGMENTS || total > len || seq >= total)
|
|
94
|
+
return this.drop(null, "malformed fragment");
|
|
95
|
+
while (this.partials.size > 0 &&
|
|
96
|
+
this.declared + len > this.maxPendingBytes)
|
|
97
|
+
this.evictOldest();
|
|
98
|
+
const shared = this.shared;
|
|
99
|
+
if (shared) {
|
|
100
|
+
while (this.partials.size > 0 && shared.used + len > shared.max)
|
|
101
|
+
this.evictOldest();
|
|
102
|
+
if (shared.used + len > shared.max)
|
|
103
|
+
return this.drop(null, "shared budget exhausted");
|
|
104
|
+
shared.used += len;
|
|
105
|
+
}
|
|
106
|
+
p = {
|
|
107
|
+
total,
|
|
108
|
+
len,
|
|
109
|
+
hash: hash.slice(),
|
|
110
|
+
parts: new Map(),
|
|
111
|
+
got: 0,
|
|
112
|
+
started: this.now(),
|
|
113
|
+
shared,
|
|
114
|
+
};
|
|
115
|
+
this.partials.set(key, p);
|
|
116
|
+
this.declared += len;
|
|
117
|
+
this.arm();
|
|
118
|
+
}
|
|
119
|
+
else if (p.total !== total ||
|
|
120
|
+
p.len !== len ||
|
|
121
|
+
!equalBytes(p.hash, hash) ||
|
|
122
|
+
seq >= total) {
|
|
123
|
+
return this.drop(key, "inconsistent fragment");
|
|
124
|
+
}
|
|
125
|
+
if (p.parts.has(seq))
|
|
126
|
+
return null; // duplicate
|
|
127
|
+
if (p.got + body.length > p.len)
|
|
128
|
+
return this.drop(key, "fragment overflow");
|
|
129
|
+
p.parts.set(seq, body.slice());
|
|
130
|
+
p.got += body.length;
|
|
131
|
+
if (p.parts.size < p.total)
|
|
132
|
+
return null;
|
|
133
|
+
this.remove(key);
|
|
134
|
+
if (p.got !== p.len)
|
|
135
|
+
return this.drop(null, "length mismatch");
|
|
136
|
+
const parts = [];
|
|
137
|
+
for (let i = 0; i < p.total; i++)
|
|
138
|
+
parts.push(p.parts.get(i));
|
|
139
|
+
const msg = concat(...parts);
|
|
140
|
+
if (!equalBytes(await sha256(msg), p.hash))
|
|
141
|
+
return this.drop(null, "hash mismatch");
|
|
142
|
+
return msg;
|
|
143
|
+
}
|
|
144
|
+
/** Drop partial messages older than the timeout. */
|
|
145
|
+
sweep() {
|
|
146
|
+
const limit = this.now() - this.timeoutMs;
|
|
147
|
+
for (const [k, p] of this.partials)
|
|
148
|
+
if (p.started <= limit)
|
|
149
|
+
this.drop(k, "timeout");
|
|
150
|
+
}
|
|
151
|
+
clear() {
|
|
152
|
+
for (const p of this.partials.values())
|
|
153
|
+
if (p.shared)
|
|
154
|
+
p.shared.used -= p.len;
|
|
155
|
+
this.partials.clear();
|
|
156
|
+
this.declared = 0;
|
|
157
|
+
if (this.timer)
|
|
158
|
+
clearTimeout(this.timer);
|
|
159
|
+
this.timer = null;
|
|
160
|
+
}
|
|
161
|
+
evictOldest() {
|
|
162
|
+
const first = this.partials.keys().next();
|
|
163
|
+
if (!first.done)
|
|
164
|
+
this.drop(first.value, "evicted");
|
|
165
|
+
}
|
|
166
|
+
remove(key) {
|
|
167
|
+
const p = this.partials.get(key);
|
|
168
|
+
if (!p)
|
|
169
|
+
return;
|
|
170
|
+
this.partials.delete(key);
|
|
171
|
+
this.declared -= p.len;
|
|
172
|
+
if (p.shared)
|
|
173
|
+
p.shared.used -= p.len;
|
|
174
|
+
if (this.partials.size === 0 && this.timer) {
|
|
175
|
+
clearTimeout(this.timer);
|
|
176
|
+
this.timer = null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
drop(key, reason) {
|
|
180
|
+
if (key !== null)
|
|
181
|
+
this.remove(key);
|
|
182
|
+
this.o.onDrop?.(reason);
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
/** Free memory of stalled partials even if no further fragment ever arrives. */
|
|
186
|
+
arm() {
|
|
187
|
+
if (this.timer || this.o.now)
|
|
188
|
+
return; // an injected clock means the caller sweeps
|
|
189
|
+
this.timer = setTimeout(() => {
|
|
190
|
+
this.timer = null;
|
|
191
|
+
this.sweep();
|
|
192
|
+
if (this.partials.size > 0)
|
|
193
|
+
this.arm();
|
|
194
|
+
}, this.timeoutMs);
|
|
195
|
+
this.timer.unref?.();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=fragment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fragment.js","sourceRoot":"","sources":["../../src/web/fragment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type { Role, TrustRoot } from "./admission.js";
|
|
2
|
+
export { canIssue, idMatchesPub, isDeviceId } from "./admission.js";
|
|
3
|
+
export { deriveDocKey, openUpdate, sealUpdate } from "./crypto.js";
|
|
4
|
+
export type { Exchange, HealthRecord } from "./exchange.js";
|
|
5
|
+
export { exchange, exchangeTopic, HEALTH_SCHEMA_PREFIX, isHealthRecord, } from "./exchange.js";
|
|
6
|
+
export type { PairPayload } from "./pairing.js";
|
|
7
|
+
export { decodePairPayload } from "./pairing.js";
|
|
8
|
+
export { deviceIdOf, IDENTITY_ALG, identityKeygen, identitySign, identityVerify, KEM_ALG, kemKeygen, ML_DSA_PUBLIC_KEY_BYTES, ML_DSA_SIGNATURE_BYTES, ML_KEM_CIPHERTEXT_BYTES, ML_KEM_PUBLIC_KEY_BYTES, } from "./pq.js";
|
|
9
|
+
export type { Mesh, MeshChannel, MeshEvent, MeshOptions, MeshSecurity, MeshStatus, PairHostOptions, PairJoinResult, PairOffer, } from "./provider.js";
|
|
10
|
+
export { createMesh } from "./provider.js";
|
|
11
|
+
export type { TopicScope } from "./rooms.js";
|
|
12
|
+
export { derivePairRoomId, deriveRoomId, fingerprint, legacyNamespace, meshNamespace, topic, } from "./rooms.js";
|
|
13
|
+
export type { RotDoc } from "./rotation.js";
|
|
14
|
+
export { isRotDoc, MAX_ROT_MEMBERS } from "./rotation.js";
|
|
15
|
+
export type { KexDoc, SecDoc } from "./secstate.js";
|
|
16
|
+
export { MAX_MEMBERS_PER_ADMIN, MESH_MODULE, MESH_SCHEMA, SecurityState, } from "./secstate.js";
|
|
17
|
+
export type { MeshStore } from "./store.js";
|
|
18
|
+
export { idbStore, memoryStore } from "./store.js";
|
|
19
|
+
export type { LoopbackHub } from "./transports/loopback.js";
|
|
20
|
+
export { createLoopbackHub } from "./transports/loopback.js";
|
|
21
|
+
export type { QrSdpTransport } from "./transports/qr-sdp.js";
|
|
22
|
+
export { qrSdpTransport } from "./transports/qr-sdp.js";
|
|
23
|
+
export { wsTransport } from "./transports/ws.js";
|
|
24
|
+
export type { Device, LinkTransport, PeerLink, RtcOptions, SigMessage, SignalingChannel, SigTransport, VaultClient, } from "./types.js";
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACnE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EACN,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,cAAc,GACd,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACN,UAAU,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,cAAc,EACd,OAAO,EACP,SAAS,EACT,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,GACvB,MAAM,SAAS,CAAC;AACjB,YAAY,EACX,IAAI,EACJ,WAAW,EACX,SAAS,EACT,WAAW,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,cAAc,EACd,SAAS,GACT,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EACN,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,aAAa,EACb,KAAK,GACL,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACN,qBAAqB,EACrB,WAAW,EACX,WAAW,EACX,aAAa,GACb,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EACX,MAAM,EACN,aAAa,EACb,QAAQ,EACR,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,WAAW,GACX,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { canIssue, idMatchesPub, isDeviceId } from "./admission.js";
|
|
2
|
+
export { deriveDocKey, openUpdate, sealUpdate } from "./crypto.js";
|
|
3
|
+
export { exchange, exchangeTopic, HEALTH_SCHEMA_PREFIX, isHealthRecord, } from "./exchange.js";
|
|
4
|
+
export { decodePairPayload } from "./pairing.js";
|
|
5
|
+
export { deviceIdOf, IDENTITY_ALG, identityKeygen, identitySign, identityVerify, KEM_ALG, kemKeygen, ML_DSA_PUBLIC_KEY_BYTES, ML_DSA_SIGNATURE_BYTES, ML_KEM_CIPHERTEXT_BYTES, ML_KEM_PUBLIC_KEY_BYTES, } from "./pq.js";
|
|
6
|
+
export { createMesh } from "./provider.js";
|
|
7
|
+
export { derivePairRoomId, deriveRoomId, fingerprint, legacyNamespace, meshNamespace, topic, } from "./rooms.js";
|
|
8
|
+
export { isRotDoc, MAX_ROT_MEMBERS } from "./rotation.js";
|
|
9
|
+
export { MAX_MEMBERS_PER_ADMIN, MESH_MODULE, MESH_SCHEMA, SecurityState, } from "./secstate.js";
|
|
10
|
+
export { idbStore, memoryStore } from "./store.js";
|
|
11
|
+
export { createLoopbackHub } from "./transports/loopback.js";
|
|
12
|
+
export { qrSdpTransport } from "./transports/qr-sdp.js";
|
|
13
|
+
export { wsTransport } from "./transports/ws.js";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,EACN,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,cAAc,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACN,UAAU,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,cAAc,EACd,OAAO,EACP,SAAS,EACT,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,GACvB,MAAM,SAAS,CAAC;AAYjB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EACN,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,aAAa,EACb,KAAK,GACL,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EACN,qBAAqB,EACrB,WAAW,EACX,WAAW,EACX,aAAa,GACb,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|