@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,236 @@
|
|
|
1
|
+
// @iberi22/edge-mesh/web/merge — deterministic per-module projections of accepted ops.
|
|
2
|
+
//
|
|
3
|
+
// Every strategy is a pure function of the SET of ops it receives: ops are de-duplicated by id and folded in the
|
|
4
|
+
// total order (hlc, author, seq), so any delivery order gives the same state. Feed it `OpLog.accepted(module)` and
|
|
5
|
+
// recompute the module on `OpLog` "change" events (late grants/revocations/forks can retract ops).
|
|
6
|
+
import { compareHlc } from "../oplog/hlc.js";
|
|
7
|
+
export const toMergeOp = (s) => ({
|
|
8
|
+
id: s.id,
|
|
9
|
+
author: s.op.author,
|
|
10
|
+
seq: s.op.seq,
|
|
11
|
+
hlc: s.op.hlc,
|
|
12
|
+
entityId: s.op.entityId,
|
|
13
|
+
action: s.op.action,
|
|
14
|
+
payload: s.op.payload,
|
|
15
|
+
base: s.op.base,
|
|
16
|
+
});
|
|
17
|
+
export const compareMergeOps = (a, b) => compareHlc(a.hlc, b.hlc) ||
|
|
18
|
+
(a.author < b.author ? -1 : a.author > b.author ? 1 : 0) ||
|
|
19
|
+
a.seq - b.seq;
|
|
20
|
+
/** De-duplicate by id, sort by (hlc, author, seq), group by entity (groups in first-op order). */
|
|
21
|
+
function prepare(ops) {
|
|
22
|
+
const byId = new Map();
|
|
23
|
+
for (const o of ops)
|
|
24
|
+
if (!byId.has(o.id))
|
|
25
|
+
byId.set(o.id, o);
|
|
26
|
+
const sorted = [...byId.values()].sort(compareMergeOps);
|
|
27
|
+
const groups = new Map();
|
|
28
|
+
for (const o of sorted) {
|
|
29
|
+
const g = groups.get(o.entityId);
|
|
30
|
+
g ? g.push(o) : groups.set(o.entityId, [o]);
|
|
31
|
+
}
|
|
32
|
+
return groups;
|
|
33
|
+
}
|
|
34
|
+
const isObj = (x) => !!x && typeof x === "object" && !Array.isArray(x);
|
|
35
|
+
/**
|
|
36
|
+
* Per-field last-writer-wins. Causality comes from `base` (id of the latest op on the entity the author had seen)
|
|
37
|
+
* plus the author's own earlier ops: a causally later write always beats an earlier one; concurrent writes are
|
|
38
|
+
* resolved by `rank` then (hlc, author, seq). Delete = tombstone that wins over concurrent edits; only a `restore`
|
|
39
|
+
* that saw the delete brings the entity back.
|
|
40
|
+
*/
|
|
41
|
+
export function lwwField(opts = {}) {
|
|
42
|
+
const rank = opts.rank;
|
|
43
|
+
return {
|
|
44
|
+
kind: "lww-field",
|
|
45
|
+
project(ops) {
|
|
46
|
+
const out = new Map();
|
|
47
|
+
for (const [entityId, list] of prepare(ops)) {
|
|
48
|
+
const index = new Map(list.map((o) => [o.id, o]));
|
|
49
|
+
// anc(o) = ops o causally follows (base link + same author's previous op on this entity)
|
|
50
|
+
const anc = new Map();
|
|
51
|
+
const lastOfAuthor = new Map();
|
|
52
|
+
for (const o of list) {
|
|
53
|
+
const a = new Set();
|
|
54
|
+
const links = [];
|
|
55
|
+
const prevSame = lastOfAuthor.get(o.author);
|
|
56
|
+
if (prevSame)
|
|
57
|
+
links.push(prevSame);
|
|
58
|
+
const b = o.base ? index.get(o.base) : undefined;
|
|
59
|
+
if (b && compareMergeOps(b, o) < 0)
|
|
60
|
+
links.push(b);
|
|
61
|
+
for (const l of links) {
|
|
62
|
+
a.add(l.id);
|
|
63
|
+
for (const x of anc.get(l.id) ?? [])
|
|
64
|
+
a.add(x);
|
|
65
|
+
}
|
|
66
|
+
anc.set(o.id, a);
|
|
67
|
+
lastOfAuthor.set(o.author, o);
|
|
68
|
+
}
|
|
69
|
+
const before = (x, y) => anc.get(y.id)?.has(x.id) === true;
|
|
70
|
+
const better = (x, y) => {
|
|
71
|
+
if (rank) {
|
|
72
|
+
const d = rank(x.author) - rank(y.author);
|
|
73
|
+
if (d !== 0)
|
|
74
|
+
return d > 0;
|
|
75
|
+
}
|
|
76
|
+
return compareMergeOps(x, y) > 0;
|
|
77
|
+
};
|
|
78
|
+
const candidates = new Map();
|
|
79
|
+
const deletes = [];
|
|
80
|
+
const restores = [];
|
|
81
|
+
for (const o of list) {
|
|
82
|
+
const p = isObj(o.payload) ? o.payload : {};
|
|
83
|
+
if (isObj(p.set))
|
|
84
|
+
for (const f of Object.keys(p.set))
|
|
85
|
+
push(candidates, f, o);
|
|
86
|
+
if (Array.isArray(p.unset))
|
|
87
|
+
for (const f of p.unset)
|
|
88
|
+
if (typeof f === "string")
|
|
89
|
+
push(candidates, f, o);
|
|
90
|
+
if (p.delete === true)
|
|
91
|
+
deletes.push(o);
|
|
92
|
+
if (p.restore === true)
|
|
93
|
+
restores.push(o);
|
|
94
|
+
}
|
|
95
|
+
// null-prototype: field names come from payloads ("__proto__", "constructor" are plain keys here)
|
|
96
|
+
const fields = Object.create(null);
|
|
97
|
+
const winners = Object.create(null);
|
|
98
|
+
for (const [f, cs] of [...candidates.entries()].sort(([a], [b]) => a < b ? -1 : 1)) {
|
|
99
|
+
const heads = cs.filter((c) => !cs.some((d) => d !== c && before(c, d)));
|
|
100
|
+
let w = heads[0];
|
|
101
|
+
for (const h of heads)
|
|
102
|
+
if (better(h, w))
|
|
103
|
+
w = h;
|
|
104
|
+
winners[f] = w.id;
|
|
105
|
+
const p = w.payload;
|
|
106
|
+
// a single op both setting and unsetting a field: set wins
|
|
107
|
+
if (isObj(p.set) && Object.hasOwn(p.set, f))
|
|
108
|
+
fields[f] = p.set[f];
|
|
109
|
+
}
|
|
110
|
+
const deleted = deletes.some((d) => !restores.some((r) => before(d, r)));
|
|
111
|
+
out.set(entityId, {
|
|
112
|
+
id: entityId,
|
|
113
|
+
fields,
|
|
114
|
+
deleted,
|
|
115
|
+
winners,
|
|
116
|
+
latest: list[list.length - 1].id,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return out;
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function push(m, k, v) {
|
|
124
|
+
const l = m.get(k);
|
|
125
|
+
l ? l.push(v) : m.set(k, [v]);
|
|
126
|
+
}
|
|
127
|
+
/** Append-only events folded per entity by an app reducer, in (hlc, author, seq) order. */
|
|
128
|
+
export function eventLog(reducer) {
|
|
129
|
+
return {
|
|
130
|
+
kind: "event-log",
|
|
131
|
+
project(ops) {
|
|
132
|
+
const out = new Map();
|
|
133
|
+
for (const [entityId, list] of prepare(ops)) {
|
|
134
|
+
const e = {
|
|
135
|
+
id: entityId,
|
|
136
|
+
state: reducer.init(entityId),
|
|
137
|
+
applied: [],
|
|
138
|
+
conflicts: [],
|
|
139
|
+
};
|
|
140
|
+
for (const o of list) {
|
|
141
|
+
let r;
|
|
142
|
+
try {
|
|
143
|
+
r = reducer.apply(e.state, o);
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
r = {
|
|
147
|
+
reject: err instanceof Error ? err.message : "reducer error",
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
if ("reject" in r)
|
|
151
|
+
e.conflicts.push({
|
|
152
|
+
opId: o.id,
|
|
153
|
+
author: o.author,
|
|
154
|
+
reason: r.reject,
|
|
155
|
+
});
|
|
156
|
+
else {
|
|
157
|
+
e.state = r.state;
|
|
158
|
+
e.applied.push(o.id);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
out.set(entityId, e);
|
|
162
|
+
}
|
|
163
|
+
return out;
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/** Signed movements summed per account (entityId). No conflicts: stock/balance = sum. */
|
|
168
|
+
export function ledger(opts = {}) {
|
|
169
|
+
const amountOf = opts.amount ??
|
|
170
|
+
((o) => isObj(o.payload) ? o.payload.amount : undefined);
|
|
171
|
+
const policy = (acc) => typeof opts.negative === "function"
|
|
172
|
+
? opts.negative(acc)
|
|
173
|
+
: (opts.negative ?? "reject");
|
|
174
|
+
return {
|
|
175
|
+
kind: "ledger",
|
|
176
|
+
project(ops) {
|
|
177
|
+
const out = new Map();
|
|
178
|
+
for (const [account, list] of prepare(ops)) {
|
|
179
|
+
const a = {
|
|
180
|
+
id: account,
|
|
181
|
+
balance: 0,
|
|
182
|
+
movements: [],
|
|
183
|
+
rejected: [],
|
|
184
|
+
wentNegative: false,
|
|
185
|
+
};
|
|
186
|
+
const mode = policy(account);
|
|
187
|
+
for (const o of list) {
|
|
188
|
+
const amt = amountOf(o);
|
|
189
|
+
if (typeof amt !== "number" || !Number.isFinite(amt)) {
|
|
190
|
+
a.rejected.push({
|
|
191
|
+
opId: o.id,
|
|
192
|
+
author: o.author,
|
|
193
|
+
reason: "bad amount",
|
|
194
|
+
});
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
const next = a.balance + amt;
|
|
198
|
+
if (!Number.isFinite(next)) {
|
|
199
|
+
a.rejected.push({
|
|
200
|
+
opId: o.id,
|
|
201
|
+
author: o.author,
|
|
202
|
+
reason: "overflow",
|
|
203
|
+
});
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
if (next < 0 && mode === "reject") {
|
|
207
|
+
a.rejected.push({
|
|
208
|
+
opId: o.id,
|
|
209
|
+
author: o.author,
|
|
210
|
+
reason: "would go negative",
|
|
211
|
+
});
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (next < 0 && mode === "flag")
|
|
215
|
+
a.wentNegative = true;
|
|
216
|
+
a.balance = next;
|
|
217
|
+
a.movements.push(o.id);
|
|
218
|
+
}
|
|
219
|
+
out.set(account, a);
|
|
220
|
+
}
|
|
221
|
+
return out;
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
// ─── registry ───────────────────────────────────────────────────────────────
|
|
226
|
+
/** module -> strategy. `project(module, ops)` folds accepted ops of that module. */
|
|
227
|
+
export function createProjector(modules) {
|
|
228
|
+
return {
|
|
229
|
+
modules,
|
|
230
|
+
project(module, ops) {
|
|
231
|
+
const norm = ops.map((o) => ("op" in o ? toMergeOp(o) : o));
|
|
232
|
+
return modules[module].project(norm);
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/merge/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface HlcParts {
|
|
2
|
+
wall: number;
|
|
3
|
+
counter: number;
|
|
4
|
+
}
|
|
5
|
+
export declare const formatHlc: (wall: number, counter: number) => string;
|
|
6
|
+
export declare function parseHlc(s: unknown): HlcParts | null;
|
|
7
|
+
export declare const isHlc: (s: unknown) => s is string;
|
|
8
|
+
/** Wall-clock ms part (what grant notBefore/expiresAt are compared with). */
|
|
9
|
+
export declare const hlcWall: (s: string) => number;
|
|
10
|
+
export declare const compareHlc: (a: string, b: string) => number;
|
|
11
|
+
export interface HlcClock {
|
|
12
|
+
/** next timestamp, strictly greater than every timestamp issued or observed */
|
|
13
|
+
now(): string;
|
|
14
|
+
/** merge a timestamp seen from another device (call only for accepted, non-future ops) */
|
|
15
|
+
observe(remote: string): void;
|
|
16
|
+
last(): string;
|
|
17
|
+
}
|
|
18
|
+
export declare function createHlc(physical?: () => number, start?: string): HlcClock;
|
|
19
|
+
//# sourceMappingURL=hlc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hlc.d.ts","sourceRoot":"","sources":["../../../src/web/oplog/hlc.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,SAAS,SAAU,MAAM,WAAW,MAAM,KAAG,MACkB,CAAC;AAE7E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,CAGpD;AAED,eAAO,MAAM,KAAK,MAAO,OAAO,KAAG,CAAC,IAAI,MACJ,CAAC;AAErC,6EAA6E;AAC7E,eAAO,MAAM,OAAO,MAAO,MAAM,KAAG,MAAkC,CAAC;AAEvE,eAAO,MAAM,UAAU,MAAO,MAAM,KAAK,MAAM,KAAG,MACvB,CAAC;AAE5B,MAAM,WAAW,QAAQ;IACxB,+EAA+E;IAC/E,GAAG,IAAI,MAAM,CAAC;IACd,0FAA0F;IAC1F,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,IAAI,IAAI,MAAM,CAAC;CACf;AAED,wBAAgB,SAAS,CACxB,QAAQ,GAAE,MAAM,MAAiB,EACjC,KAAK,CAAC,EAAE,MAAM,GACZ,QAAQ,CAmBV"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Hybrid logical clock. Wire format: 15-digit wall ms + "-" + 5-digit counter, so string order == causal order.
|
|
2
|
+
const WALL = 15;
|
|
3
|
+
const CTR = 5;
|
|
4
|
+
const CTR_MAX = 99_999;
|
|
5
|
+
const RE = /^\d{15}-\d{5}$/;
|
|
6
|
+
export const formatHlc = (wall, counter) => `${String(wall).padStart(WALL, "0")}-${String(counter).padStart(CTR, "0")}`;
|
|
7
|
+
export function parseHlc(s) {
|
|
8
|
+
if (typeof s !== "string" || !RE.test(s))
|
|
9
|
+
return null;
|
|
10
|
+
return { wall: Number(s.slice(0, WALL)), counter: Number(s.slice(WALL + 1)) };
|
|
11
|
+
}
|
|
12
|
+
export const isHlc = (s) => typeof s === "string" && RE.test(s);
|
|
13
|
+
/** Wall-clock ms part (what grant notBefore/expiresAt are compared with). */
|
|
14
|
+
export const hlcWall = (s) => Number(s.slice(0, WALL));
|
|
15
|
+
export const compareHlc = (a, b) => a < b ? -1 : a > b ? 1 : 0;
|
|
16
|
+
export function createHlc(physical = Date.now, start) {
|
|
17
|
+
let last = start && isHlc(start) ? start : formatHlc(0, 0);
|
|
18
|
+
return {
|
|
19
|
+
now() {
|
|
20
|
+
const p = parseHlc(last);
|
|
21
|
+
const pt = Math.floor(physical());
|
|
22
|
+
let next;
|
|
23
|
+
if (pt > p.wall)
|
|
24
|
+
next = { wall: pt, counter: 0 };
|
|
25
|
+
else if (p.counter < CTR_MAX)
|
|
26
|
+
next = { wall: p.wall, counter: p.counter + 1 };
|
|
27
|
+
else
|
|
28
|
+
next = { wall: p.wall + 1, counter: 0 };
|
|
29
|
+
last = formatHlc(next.wall, next.counter);
|
|
30
|
+
return last;
|
|
31
|
+
},
|
|
32
|
+
observe(remote) {
|
|
33
|
+
if (isHlc(remote) && remote > last)
|
|
34
|
+
last = remote;
|
|
35
|
+
},
|
|
36
|
+
last: () => last,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=hlc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hlc.js","sourceRoot":"","sources":["../../../src/web/oplog/hlc.ts"],"names":[],"mappings":"AAAA,gHAAgH;AAEhH,MAAM,IAAI,GAAG,EAAE,CAAC;AAChB,MAAM,GAAG,GAAG,CAAC,CAAC;AACd,MAAM,OAAO,GAAG,MAAM,CAAC;AACvB,MAAM,EAAE,GAAG,gBAAgB,CAAC;AAO5B,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,OAAe,EAAU,EAAE,CAClE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;AAE7E,MAAM,UAAU,QAAQ,CAAC,CAAU;IAClC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAU,EAAe,EAAE,CAChD,OAAO,CAAC,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAErC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAEvE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE,CAC1D,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAU5B,MAAM,UAAU,SAAS,CACxB,QAAQ,GAAiB,IAAI,CAAC,GAAG,EACjC,KAAc;IAEd,IAAI,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,OAAO;QACN,GAAG;YACF,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAa,CAAC;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClC,IAAI,IAAc,CAAC;YACnB,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI;gBAAE,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;iBAC5C,IAAI,CAAC,CAAC,OAAO,GAAG,OAAO;gBAC3B,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;;gBAC5C,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YAC7C,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,CAAC,MAAM;YACb,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,IAAI;gBAAE,IAAI,GAAG,MAAM,CAAC;QACnD,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI;KAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type { HlcClock, HlcParts } from "./hlc.js";
|
|
2
|
+
export { compareHlc, createHlc, formatHlc, hlcWall, isHlc, parseHlc, } from "./hlc.js";
|
|
3
|
+
export type { OpLogEvents, OpLogOptions, OpVerdict } from "./log.js";
|
|
4
|
+
export { compareOps, OpLog, OpLogError, openOpLog } from "./log.js";
|
|
5
|
+
export type { OpStore, QuarantineStore } from "./store.js";
|
|
6
|
+
export { MemoryOpStore, MemoryQuarantineStore } from "./store.js";
|
|
7
|
+
export type { OpLogChannel, OpLogSync, ServeOptions, SyncRateLimit, } from "./sync.js";
|
|
8
|
+
export { attachOpLogSync, decodeMessage, encodeMessage, haveMessage, serve, wantFor, } from "./sync.js";
|
|
9
|
+
export type { Checkpoint, CheckpointHook, HaveMsg, IngestResult, IngestStatus, Op, OpBody, OpInput, OpLogMessage, OpRange, OpsMsg, PendingReason, QuarantineEntry, QuarantineReason, StoredOp, WantMsg, } from "./types.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/web/oplog/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EACN,UAAU,EACV,SAAS,EACT,SAAS,EACT,OAAO,EACP,KAAK,EACL,QAAQ,GACR,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACpE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAClE,YAAY,EACX,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,aAAa,GACb,MAAM,WAAW,CAAC;AACnB,OAAO,EACN,eAAe,EACf,aAAa,EACb,aAAa,EACb,WAAW,EACX,KAAK,EACL,OAAO,GACP,MAAM,WAAW,CAAC;AACnB,YAAY,EACX,UAAU,EACV,cAAc,EACd,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,EAAE,EACF,MAAM,EACN,OAAO,EACP,YAAY,EACZ,OAAO,EACP,MAAM,EACN,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,OAAO,GACP,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @iberi22/edge-mesh/web/oplog — signed, hash-chained per-device operation logs gated by web/trust.
|
|
2
|
+
export { compareHlc, createHlc, formatHlc, hlcWall, isHlc, parseHlc, } from "./hlc.js";
|
|
3
|
+
export { compareOps, OpLog, OpLogError, openOpLog } from "./log.js";
|
|
4
|
+
export { MemoryOpStore, MemoryQuarantineStore } from "./store.js";
|
|
5
|
+
export { attachOpLogSync, decodeMessage, encodeMessage, haveMessage, serve, wantFor, } from "./sync.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/oplog/index.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAGpG,OAAO,EACN,UAAU,EACV,SAAS,EACT,SAAS,EACT,OAAO,EACP,KAAK,EACL,QAAQ,GACR,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAOlE,OAAO,EACN,eAAe,EACf,aAAa,EACb,aAAa,EACb,WAAW,EACX,KAAK,EACL,OAAO,GACP,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { type Signer } from "../trust/keys.js";
|
|
2
|
+
import type { TrustStore } from "../trust/store.js";
|
|
3
|
+
import { type OpStore, type QuarantineStore } from "./store.js";
|
|
4
|
+
import type { IngestResult, Op, OpInput, PendingReason, QuarantineEntry, QuarantineReason, StoredOp } from "./types.js";
|
|
5
|
+
export interface OpLogOptions {
|
|
6
|
+
trust: TrustStore;
|
|
7
|
+
/** local device key; required for `append` */
|
|
8
|
+
signer?: Signer;
|
|
9
|
+
store?: OpStore;
|
|
10
|
+
quarantine?: QuarantineStore;
|
|
11
|
+
/** stateless business check of a single op (payload schema...). Return true or a reason. Must be pure. */
|
|
12
|
+
validate?: (op: Op) => true | string;
|
|
13
|
+
/** physical clock (ms). Default Date.now */
|
|
14
|
+
now?: () => number;
|
|
15
|
+
/** ops whose HLC is further in the future wait as pending. Default 10 min */
|
|
16
|
+
maxSkewMs?: number;
|
|
17
|
+
/** max pending ops held in memory. Default 10 000 */
|
|
18
|
+
maxPending?: number;
|
|
19
|
+
/** max canonical bytes of all pending ops. Default 16 MiB */
|
|
20
|
+
maxPendingBytes?: number;
|
|
21
|
+
/** max pending ops of one author. Default 1024 */
|
|
22
|
+
maxPendingPerAuthor?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Budget for ops whose author has no known grant yet (signature not checkable, so anyone can produce them):
|
|
25
|
+
* count (default maxPending / 10) and bytes (default 1 MiB). When full, the OLDEST unknown-author op is dropped
|
|
26
|
+
* (it comes back with catch-up); pending ops of known authors are never evicted for them (S4).
|
|
27
|
+
*/
|
|
28
|
+
maxPendingUnknown?: number;
|
|
29
|
+
maxPendingUnknownBytes?: number;
|
|
30
|
+
/** max canonical size of one op. Default 32 KiB (fits a 64 KiB catch-up frame) */
|
|
31
|
+
maxOpBytes?: number;
|
|
32
|
+
}
|
|
33
|
+
export type OpVerdict = {
|
|
34
|
+
ok: true;
|
|
35
|
+
} | {
|
|
36
|
+
ok: false;
|
|
37
|
+
reason: QuarantineReason;
|
|
38
|
+
detail?: string;
|
|
39
|
+
};
|
|
40
|
+
export interface OpLogEvents {
|
|
41
|
+
/** local append (signed + stored); transports broadcast it */
|
|
42
|
+
appended: StoredOp;
|
|
43
|
+
/** a remote op entered its author's chain (applied or held); transports may relay it */
|
|
44
|
+
stored: StoredOp;
|
|
45
|
+
/** op became part of the accepted set */
|
|
46
|
+
applied: StoredOp;
|
|
47
|
+
/** previously accepted op left the accepted set (late revocation, fork evidence): rebuild its module */
|
|
48
|
+
retracted: {
|
|
49
|
+
entry: StoredOp;
|
|
50
|
+
reason: QuarantineReason;
|
|
51
|
+
detail?: string;
|
|
52
|
+
};
|
|
53
|
+
quarantined: QuarantineEntry;
|
|
54
|
+
pending: {
|
|
55
|
+
op: Op;
|
|
56
|
+
reason: PendingReason;
|
|
57
|
+
};
|
|
58
|
+
equivocation: {
|
|
59
|
+
author: string;
|
|
60
|
+
forkSeq: number;
|
|
61
|
+
};
|
|
62
|
+
/** accepted set changed for these modules (fired once per ingest batch / re-evaluation) */
|
|
63
|
+
change: {
|
|
64
|
+
modules: string[];
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
type Listener<K extends keyof OpLogEvents> = (e: OpLogEvents[K]) => void;
|
|
68
|
+
export declare class OpLogError extends Error {
|
|
69
|
+
readonly code: "no-signer" | "unauthorized" | "invalid" | "too-large";
|
|
70
|
+
constructor(code: "no-signer" | "unauthorized" | "invalid" | "too-large", message: string);
|
|
71
|
+
}
|
|
72
|
+
/** Total order used by projections: (hlc, author, seq). */
|
|
73
|
+
export declare const compareOps: (a: Op, b: Op) => number;
|
|
74
|
+
export declare function openOpLog(opts: OpLogOptions): Promise<OpLog>;
|
|
75
|
+
export declare class OpLog {
|
|
76
|
+
readonly trust: TrustStore;
|
|
77
|
+
readonly inst: string;
|
|
78
|
+
readonly store: OpStore;
|
|
79
|
+
readonly quarantine: QuarantineStore;
|
|
80
|
+
private readonly signer?;
|
|
81
|
+
private readonly validateFn?;
|
|
82
|
+
private readonly now;
|
|
83
|
+
private readonly maxSkewMs;
|
|
84
|
+
private readonly maxPending;
|
|
85
|
+
private readonly maxPendingBytes;
|
|
86
|
+
private readonly maxPendingPerAuthor;
|
|
87
|
+
private readonly maxPendingUnknown;
|
|
88
|
+
private readonly maxPendingUnknownBytes;
|
|
89
|
+
private pendingBytes;
|
|
90
|
+
private unknownCount;
|
|
91
|
+
private unknownBytes;
|
|
92
|
+
private readonly pendingPerAuthor;
|
|
93
|
+
/** BL2: op id -> pending key of ops parked for an anchor (backward resolution walks `prev` ids) */
|
|
94
|
+
private readonly anchorIds;
|
|
95
|
+
/** finding 6: pending keys of ops parked for an anchor, per `author:seq` (at most 2 per seq) */
|
|
96
|
+
private readonly anchorBySeq;
|
|
97
|
+
private readonly maxOpBytes;
|
|
98
|
+
private readonly clock;
|
|
99
|
+
private readonly verdicts;
|
|
100
|
+
private readonly modulesOf;
|
|
101
|
+
private readonly equiv;
|
|
102
|
+
private readonly pendingOps;
|
|
103
|
+
/** S3: author -> highest anchored seq whose STORED op is not the anchored one (its history <= that seq is void) */
|
|
104
|
+
private offAnchor;
|
|
105
|
+
private readonly listeners;
|
|
106
|
+
private queue;
|
|
107
|
+
private changed;
|
|
108
|
+
private readonly unsubscribeTrust;
|
|
109
|
+
constructor(opts: OpLogOptions);
|
|
110
|
+
/** Rebuild in-memory indexes from the stores (no events). */
|
|
111
|
+
load(): Promise<void>;
|
|
112
|
+
close(): void;
|
|
113
|
+
on<K extends keyof OpLogEvents>(event: K, cb: Listener<K>): () => void;
|
|
114
|
+
private emit;
|
|
115
|
+
private serial;
|
|
116
|
+
private flushChange;
|
|
117
|
+
levelFor(module: string, action: string): import("../trust/types.js").Level;
|
|
118
|
+
/** Pure function of (op, trust docs, equivocation evidence, validate). */
|
|
119
|
+
verdict(s: StoredOp): OpVerdict;
|
|
120
|
+
private setVerdict;
|
|
121
|
+
private rejectOp;
|
|
122
|
+
/** Sign and append a local op. Throws OpLogError if the local device is not allowed (nothing is signed). */
|
|
123
|
+
append(input: OpInput): Promise<StoredOp>;
|
|
124
|
+
ingest(op: unknown): Promise<IngestResult>;
|
|
125
|
+
ingestMany(ops: readonly unknown[]): Promise<IngestResult[]>;
|
|
126
|
+
private takePending;
|
|
127
|
+
/** Drop the oldest unknown-author pending op (insertion order). False if there is none. */
|
|
128
|
+
private evictUnknown;
|
|
129
|
+
/**
|
|
130
|
+
* S4: bounded pending set. Known authors (gap/future/anchor) only take free room (or room held by unknown authors);
|
|
131
|
+
* unknown authors live in a small FIFO budget of their own and never displace a known author's op.
|
|
132
|
+
*/
|
|
133
|
+
private park;
|
|
134
|
+
/** Highest anchor of `author` covering `seq` (S3), if any. */
|
|
135
|
+
private anchorFor;
|
|
136
|
+
/**
|
|
137
|
+
* S3: ops of a revoked author at or below an anchor wait as pending until a chain from our stored head up to the
|
|
138
|
+
* anchored op is complete (walked backwards from the anchor id through `prev`); then exactly that chain is
|
|
139
|
+
* ingested and every other pending op of the author at or below the anchor is rejected as a forgery.
|
|
140
|
+
*/
|
|
141
|
+
private resolveAnchor;
|
|
142
|
+
/** finding 6: pending keys on the (partial) chain walked back from the anchor id through `prev`. */
|
|
143
|
+
private anchoredChainKeys;
|
|
144
|
+
/** Is our stored op of `author` at `seq` on an anchored chain (an anchor >= seq whose op we store)? */
|
|
145
|
+
private storedAnchored;
|
|
146
|
+
/** Recompute which authors' STORED history contradicts an anchor (sync verdicts read the result). */
|
|
147
|
+
private refreshAnchors;
|
|
148
|
+
private ingestOne;
|
|
149
|
+
/** Retry pending ops (of one author, or all) in seq order. */
|
|
150
|
+
private drain;
|
|
151
|
+
private equivocate;
|
|
152
|
+
private reevaluateAuthor;
|
|
153
|
+
/** Recompute every verdict (trust changed) and retry pending ops. Called automatically on trust changes. */
|
|
154
|
+
reevaluate(): Promise<void>;
|
|
155
|
+
/** Retry pending ops (e.g. on a timer so future-dated ops are picked up once the clock reaches them). */
|
|
156
|
+
retryPending(): Promise<void>;
|
|
157
|
+
isAccepted(author: string, seq: number): boolean;
|
|
158
|
+
verdictOf(author: string, seq: number): OpVerdict | undefined;
|
|
159
|
+
/** Accepted ops (optionally of one module), in projection order (hlc, author, seq). */
|
|
160
|
+
accepted(module?: string): Promise<StoredOp[]>;
|
|
161
|
+
heads(): Promise<Record<string, number>>;
|
|
162
|
+
/** Head seq AND op id per author: pass it to `TrustStore.prepareRevocation` to anchor a revocation (S3). */
|
|
163
|
+
headIds(): Promise<Record<string, {
|
|
164
|
+
seq: number;
|
|
165
|
+
id: string;
|
|
166
|
+
}>>;
|
|
167
|
+
pending(): {
|
|
168
|
+
author: string;
|
|
169
|
+
seq: number;
|
|
170
|
+
reason: PendingReason;
|
|
171
|
+
}[];
|
|
172
|
+
equivocations(): {
|
|
173
|
+
author: string;
|
|
174
|
+
forkSeq: number;
|
|
175
|
+
}[];
|
|
176
|
+
quarantined(): Promise<QuarantineEntry[]>;
|
|
177
|
+
/** Local clock helper (e.g. to stamp UI checks). */
|
|
178
|
+
hlcNow(): string;
|
|
179
|
+
get deviceFp(): string | undefined;
|
|
180
|
+
}
|
|
181
|
+
export {};
|
|
182
|
+
//# sourceMappingURL=log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../src/web/oplog/log.ts"],"names":[],"mappings":"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"}
|