agentic-qe 2.7.4 → 2.8.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/CHANGELOG.md +104 -0
- package/README.md +67 -2
- package/dist/cli/commands/agent/spawn.d.ts +12 -1
- package/dist/cli/commands/agent/spawn.d.ts.map +1 -1
- package/dist/cli/commands/agent/spawn.js +95 -8
- package/dist/cli/commands/agent/spawn.js.map +1 -1
- package/dist/cli/index.js +91 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/memory/HNSWVectorMemory.js +1 -1
- package/dist/edge/adapters/BrowserHNSWAdapter.d.ts +134 -0
- package/dist/edge/adapters/BrowserHNSWAdapter.d.ts.map +1 -0
- package/dist/edge/adapters/BrowserHNSWAdapter.js +484 -0
- package/dist/edge/adapters/BrowserHNSWAdapter.js.map +1 -0
- package/dist/edge/adapters/IndexedDBStorage.d.ts +114 -0
- package/dist/edge/adapters/IndexedDBStorage.d.ts.map +1 -0
- package/dist/edge/adapters/IndexedDBStorage.js +478 -0
- package/dist/edge/adapters/IndexedDBStorage.js.map +1 -0
- package/dist/edge/adapters/index.d.ts +12 -0
- package/dist/edge/adapters/index.d.ts.map +1 -0
- package/dist/edge/adapters/index.js +22 -0
- package/dist/edge/adapters/index.js.map +1 -0
- package/dist/edge/browser/BrowserAgent.d.ts +241 -0
- package/dist/edge/browser/BrowserAgent.d.ts.map +1 -0
- package/dist/edge/browser/BrowserAgent.js +743 -0
- package/dist/edge/browser/BrowserAgent.js.map +1 -0
- package/dist/edge/index.d.ts +34 -0
- package/dist/edge/index.d.ts.map +1 -0
- package/dist/edge/index.js +114 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/edge/p2p/coordination/CoordinationManager.d.ts +181 -0
- package/dist/edge/p2p/coordination/CoordinationManager.d.ts.map +1 -0
- package/dist/edge/p2p/coordination/CoordinationManager.js +851 -0
- package/dist/edge/p2p/coordination/CoordinationManager.js.map +1 -0
- package/dist/edge/p2p/coordination/HealthMonitor.d.ts +143 -0
- package/dist/edge/p2p/coordination/HealthMonitor.d.ts.map +1 -0
- package/dist/edge/p2p/coordination/HealthMonitor.js +432 -0
- package/dist/edge/p2p/coordination/HealthMonitor.js.map +1 -0
- package/dist/edge/p2p/coordination/SyncOrchestrator.d.ts +146 -0
- package/dist/edge/p2p/coordination/SyncOrchestrator.d.ts.map +1 -0
- package/dist/edge/p2p/coordination/SyncOrchestrator.js +783 -0
- package/dist/edge/p2p/coordination/SyncOrchestrator.js.map +1 -0
- package/dist/edge/p2p/coordination/index.d.ts +70 -0
- package/dist/edge/p2p/coordination/index.d.ts.map +1 -0
- package/dist/edge/p2p/coordination/index.js +107 -0
- package/dist/edge/p2p/coordination/index.js.map +1 -0
- package/dist/edge/p2p/coordination/types.d.ts +572 -0
- package/dist/edge/p2p/coordination/types.d.ts.map +1 -0
- package/dist/edge/p2p/coordination/types.js +366 -0
- package/dist/edge/p2p/coordination/types.js.map +1 -0
- package/dist/edge/p2p/crdt/CRDTStore.d.ts +324 -0
- package/dist/edge/p2p/crdt/CRDTStore.d.ts.map +1 -0
- package/dist/edge/p2p/crdt/CRDTStore.js +839 -0
- package/dist/edge/p2p/crdt/CRDTStore.js.map +1 -0
- package/dist/edge/p2p/crdt/GCounter.d.ts +173 -0
- package/dist/edge/p2p/crdt/GCounter.d.ts.map +1 -0
- package/dist/edge/p2p/crdt/GCounter.js +394 -0
- package/dist/edge/p2p/crdt/GCounter.js.map +1 -0
- package/dist/edge/p2p/crdt/LWWRegister.d.ts +200 -0
- package/dist/edge/p2p/crdt/LWWRegister.d.ts.map +1 -0
- package/dist/edge/p2p/crdt/LWWRegister.js +456 -0
- package/dist/edge/p2p/crdt/LWWRegister.js.map +1 -0
- package/dist/edge/p2p/crdt/ORSet.d.ts +232 -0
- package/dist/edge/p2p/crdt/ORSet.d.ts.map +1 -0
- package/dist/edge/p2p/crdt/ORSet.js +723 -0
- package/dist/edge/p2p/crdt/ORSet.js.map +1 -0
- package/dist/edge/p2p/crdt/PatternCRDT.d.ts +366 -0
- package/dist/edge/p2p/crdt/PatternCRDT.d.ts.map +1 -0
- package/dist/edge/p2p/crdt/PatternCRDT.js +838 -0
- package/dist/edge/p2p/crdt/PatternCRDT.js.map +1 -0
- package/dist/edge/p2p/crdt/VectorClock.d.ts +274 -0
- package/dist/edge/p2p/crdt/VectorClock.d.ts.map +1 -0
- package/dist/edge/p2p/crdt/VectorClock.js +499 -0
- package/dist/edge/p2p/crdt/VectorClock.js.map +1 -0
- package/dist/edge/p2p/crdt/index.d.ts +87 -0
- package/dist/edge/p2p/crdt/index.d.ts.map +1 -0
- package/dist/edge/p2p/crdt/index.js +120 -0
- package/dist/edge/p2p/crdt/index.js.map +1 -0
- package/dist/edge/p2p/crdt/types.d.ts +667 -0
- package/dist/edge/p2p/crdt/types.d.ts.map +1 -0
- package/dist/edge/p2p/crdt/types.js +208 -0
- package/dist/edge/p2p/crdt/types.js.map +1 -0
- package/dist/edge/p2p/crypto/Identity.d.ts +139 -0
- package/dist/edge/p2p/crypto/Identity.d.ts.map +1 -0
- package/dist/edge/p2p/crypto/Identity.js +449 -0
- package/dist/edge/p2p/crypto/Identity.js.map +1 -0
- package/dist/edge/p2p/crypto/KeyManager.d.ts +196 -0
- package/dist/edge/p2p/crypto/KeyManager.d.ts.map +1 -0
- package/dist/edge/p2p/crypto/KeyManager.js +576 -0
- package/dist/edge/p2p/crypto/KeyManager.js.map +1 -0
- package/dist/edge/p2p/crypto/Signer.d.ts +164 -0
- package/dist/edge/p2p/crypto/Signer.d.ts.map +1 -0
- package/dist/edge/p2p/crypto/Signer.js +357 -0
- package/dist/edge/p2p/crypto/Signer.js.map +1 -0
- package/dist/edge/p2p/crypto/index.d.ts +90 -0
- package/dist/edge/p2p/crypto/index.d.ts.map +1 -0
- package/dist/edge/p2p/crypto/index.js +158 -0
- package/dist/edge/p2p/crypto/index.js.map +1 -0
- package/dist/edge/p2p/crypto/types.d.ts +217 -0
- package/dist/edge/p2p/crypto/types.d.ts.map +1 -0
- package/dist/edge/p2p/crypto/types.js +42 -0
- package/dist/edge/p2p/crypto/types.js.map +1 -0
- package/dist/edge/p2p/federated/FederatedCoordinator.d.ts +270 -0
- package/dist/edge/p2p/federated/FederatedCoordinator.d.ts.map +1 -0
- package/dist/edge/p2p/federated/FederatedCoordinator.js +824 -0
- package/dist/edge/p2p/federated/FederatedCoordinator.js.map +1 -0
- package/dist/edge/p2p/federated/FederatedRound.d.ts +295 -0
- package/dist/edge/p2p/federated/FederatedRound.d.ts.map +1 -0
- package/dist/edge/p2p/federated/FederatedRound.js +819 -0
- package/dist/edge/p2p/federated/FederatedRound.js.map +1 -0
- package/dist/edge/p2p/federated/GradientAggregator.d.ts +226 -0
- package/dist/edge/p2p/federated/GradientAggregator.d.ts.map +1 -0
- package/dist/edge/p2p/federated/GradientAggregator.js +826 -0
- package/dist/edge/p2p/federated/GradientAggregator.js.map +1 -0
- package/dist/edge/p2p/federated/ModelManager.d.ts +248 -0
- package/dist/edge/p2p/federated/ModelManager.d.ts.map +1 -0
- package/dist/edge/p2p/federated/ModelManager.js +724 -0
- package/dist/edge/p2p/federated/ModelManager.js.map +1 -0
- package/dist/edge/p2p/federated/index.d.ts +65 -0
- package/dist/edge/p2p/federated/index.d.ts.map +1 -0
- package/dist/edge/p2p/federated/index.js +110 -0
- package/dist/edge/p2p/federated/index.js.map +1 -0
- package/dist/edge/p2p/federated/types.d.ts +905 -0
- package/dist/edge/p2p/federated/types.d.ts.map +1 -0
- package/dist/edge/p2p/federated/types.js +339 -0
- package/dist/edge/p2p/federated/types.js.map +1 -0
- package/dist/edge/p2p/index.d.ts +156 -0
- package/dist/edge/p2p/index.d.ts.map +1 -0
- package/dist/edge/p2p/index.js +242 -0
- package/dist/edge/p2p/index.js.map +1 -0
- package/dist/edge/p2p/nat/ConnectivityTester.d.ts +128 -0
- package/dist/edge/p2p/nat/ConnectivityTester.d.ts.map +1 -0
- package/dist/edge/p2p/nat/ConnectivityTester.js +560 -0
- package/dist/edge/p2p/nat/ConnectivityTester.js.map +1 -0
- package/dist/edge/p2p/nat/HolePuncher.d.ts +159 -0
- package/dist/edge/p2p/nat/HolePuncher.d.ts.map +1 -0
- package/dist/edge/p2p/nat/HolePuncher.js +569 -0
- package/dist/edge/p2p/nat/HolePuncher.js.map +1 -0
- package/dist/edge/p2p/nat/NATDetector.d.ts +109 -0
- package/dist/edge/p2p/nat/NATDetector.d.ts.map +1 -0
- package/dist/edge/p2p/nat/NATDetector.js +472 -0
- package/dist/edge/p2p/nat/NATDetector.js.map +1 -0
- package/dist/edge/p2p/nat/TURNManager.d.ts +158 -0
- package/dist/edge/p2p/nat/TURNManager.d.ts.map +1 -0
- package/dist/edge/p2p/nat/TURNManager.js +547 -0
- package/dist/edge/p2p/nat/TURNManager.js.map +1 -0
- package/dist/edge/p2p/nat/index.d.ts +74 -0
- package/dist/edge/p2p/nat/index.d.ts.map +1 -0
- package/dist/edge/p2p/nat/index.js +104 -0
- package/dist/edge/p2p/nat/index.js.map +1 -0
- package/dist/edge/p2p/nat/types.d.ts +583 -0
- package/dist/edge/p2p/nat/types.d.ts.map +1 -0
- package/dist/edge/p2p/nat/types.js +267 -0
- package/dist/edge/p2p/nat/types.js.map +1 -0
- package/dist/edge/p2p/protocol/AgentChannel.d.ts +333 -0
- package/dist/edge/p2p/protocol/AgentChannel.d.ts.map +1 -0
- package/dist/edge/p2p/protocol/AgentChannel.js +914 -0
- package/dist/edge/p2p/protocol/AgentChannel.js.map +1 -0
- package/dist/edge/p2p/protocol/MessageEncoder.d.ts +147 -0
- package/dist/edge/p2p/protocol/MessageEncoder.d.ts.map +1 -0
- package/dist/edge/p2p/protocol/MessageEncoder.js +738 -0
- package/dist/edge/p2p/protocol/MessageEncoder.js.map +1 -0
- package/dist/edge/p2p/protocol/MessageRouter.d.ts +266 -0
- package/dist/edge/p2p/protocol/MessageRouter.d.ts.map +1 -0
- package/dist/edge/p2p/protocol/MessageRouter.js +808 -0
- package/dist/edge/p2p/protocol/MessageRouter.js.map +1 -0
- package/dist/edge/p2p/protocol/ProtocolHandler.d.ts +309 -0
- package/dist/edge/p2p/protocol/ProtocolHandler.d.ts.map +1 -0
- package/dist/edge/p2p/protocol/ProtocolHandler.js +930 -0
- package/dist/edge/p2p/protocol/ProtocolHandler.js.map +1 -0
- package/dist/edge/p2p/protocol/index.d.ts +114 -0
- package/dist/edge/p2p/protocol/index.d.ts.map +1 -0
- package/dist/edge/p2p/protocol/index.js +206 -0
- package/dist/edge/p2p/protocol/index.js.map +1 -0
- package/dist/edge/p2p/protocol/types.d.ts +737 -0
- package/dist/edge/p2p/protocol/types.d.ts.map +1 -0
- package/dist/edge/p2p/protocol/types.js +490 -0
- package/dist/edge/p2p/protocol/types.js.map +1 -0
- package/dist/edge/p2p/sharing/PatternBroadcaster.d.ts +284 -0
- package/dist/edge/p2p/sharing/PatternBroadcaster.d.ts.map +1 -0
- package/dist/edge/p2p/sharing/PatternBroadcaster.js +644 -0
- package/dist/edge/p2p/sharing/PatternBroadcaster.js.map +1 -0
- package/dist/edge/p2p/sharing/PatternIndex.d.ts +168 -0
- package/dist/edge/p2p/sharing/PatternIndex.d.ts.map +1 -0
- package/dist/edge/p2p/sharing/PatternIndex.js +781 -0
- package/dist/edge/p2p/sharing/PatternIndex.js.map +1 -0
- package/dist/edge/p2p/sharing/PatternSerializer.d.ts +163 -0
- package/dist/edge/p2p/sharing/PatternSerializer.d.ts.map +1 -0
- package/dist/edge/p2p/sharing/PatternSerializer.js +696 -0
- package/dist/edge/p2p/sharing/PatternSerializer.js.map +1 -0
- package/dist/edge/p2p/sharing/PatternSyncManager.d.ts +242 -0
- package/dist/edge/p2p/sharing/PatternSyncManager.d.ts.map +1 -0
- package/dist/edge/p2p/sharing/PatternSyncManager.js +859 -0
- package/dist/edge/p2p/sharing/PatternSyncManager.js.map +1 -0
- package/dist/edge/p2p/sharing/index.d.ts +90 -0
- package/dist/edge/p2p/sharing/index.d.ts.map +1 -0
- package/dist/edge/p2p/sharing/index.js +152 -0
- package/dist/edge/p2p/sharing/index.js.map +1 -0
- package/dist/edge/p2p/sharing/types.d.ts +796 -0
- package/dist/edge/p2p/sharing/types.d.ts.map +1 -0
- package/dist/edge/p2p/sharing/types.js +264 -0
- package/dist/edge/p2p/sharing/types.js.map +1 -0
- package/dist/edge/p2p/webrtc/ConnectionPool.d.ts +218 -0
- package/dist/edge/p2p/webrtc/ConnectionPool.d.ts.map +1 -0
- package/dist/edge/p2p/webrtc/ConnectionPool.js +562 -0
- package/dist/edge/p2p/webrtc/ConnectionPool.js.map +1 -0
- package/dist/edge/p2p/webrtc/ICEManager.d.ts +171 -0
- package/dist/edge/p2p/webrtc/ICEManager.d.ts.map +1 -0
- package/dist/edge/p2p/webrtc/ICEManager.js +490 -0
- package/dist/edge/p2p/webrtc/ICEManager.js.map +1 -0
- package/dist/edge/p2p/webrtc/PeerConnectionManager.d.ts +159 -0
- package/dist/edge/p2p/webrtc/PeerConnectionManager.d.ts.map +1 -0
- package/dist/edge/p2p/webrtc/PeerConnectionManager.js +735 -0
- package/dist/edge/p2p/webrtc/PeerConnectionManager.js.map +1 -0
- package/dist/edge/p2p/webrtc/SignalingClient.d.ts +191 -0
- package/dist/edge/p2p/webrtc/SignalingClient.d.ts.map +1 -0
- package/dist/edge/p2p/webrtc/SignalingClient.js +608 -0
- package/dist/edge/p2p/webrtc/SignalingClient.js.map +1 -0
- package/dist/edge/p2p/webrtc/index.d.ts +158 -0
- package/dist/edge/p2p/webrtc/index.d.ts.map +1 -0
- package/dist/edge/p2p/webrtc/index.js +164 -0
- package/dist/edge/p2p/webrtc/index.js.map +1 -0
- package/dist/edge/p2p/webrtc/types.d.ts +665 -0
- package/dist/edge/p2p/webrtc/types.d.ts.map +1 -0
- package/dist/edge/p2p/webrtc/types.js +245 -0
- package/dist/edge/p2p/webrtc/types.js.map +1 -0
- package/dist/edge/server/AgentSpawnAPI.d.ts +98 -0
- package/dist/edge/server/AgentSpawnAPI.d.ts.map +1 -0
- package/dist/edge/server/AgentSpawnAPI.js +264 -0
- package/dist/edge/server/AgentSpawnAPI.js.map +1 -0
- package/dist/edge/server/SignalingServer.d.ts +71 -0
- package/dist/edge/server/SignalingServer.d.ts.map +1 -0
- package/dist/edge/server/SignalingServer.js +429 -0
- package/dist/edge/server/SignalingServer.js.map +1 -0
- package/dist/edge/server/index.d.ts +64 -0
- package/dist/edge/server/index.d.ts.map +1 -0
- package/dist/edge/server/index.js +318 -0
- package/dist/edge/server/index.js.map +1 -0
- package/dist/edge/types/browser-agent.types.d.ts +455 -0
- package/dist/edge/types/browser-agent.types.d.ts.map +1 -0
- package/dist/edge/types/browser-agent.types.js +116 -0
- package/dist/edge/types/browser-agent.types.js.map +1 -0
- package/dist/edge/types/index.d.ts +11 -0
- package/dist/edge/types/index.d.ts.map +1 -0
- package/dist/edge/types/index.js +17 -0
- package/dist/edge/types/index.js.map +1 -0
- package/dist/edge/types/storage.types.d.ts +207 -0
- package/dist/edge/types/storage.types.d.ts.map +1 -0
- package/dist/edge/types/storage.types.js +47 -0
- package/dist/edge/types/storage.types.js.map +1 -0
- package/dist/edge/wasm/shims.d.ts +224 -0
- package/dist/edge/wasm/shims.d.ts.map +1 -0
- package/dist/edge/wasm/shims.js +667 -0
- package/dist/edge/wasm/shims.js.map +1 -0
- package/dist/mcp/handlers/NewDomainToolsHandler.d.ts +33 -0
- package/dist/mcp/handlers/NewDomainToolsHandler.d.ts.map +1 -0
- package/dist/mcp/handlers/NewDomainToolsHandler.js +305 -0
- package/dist/mcp/handlers/NewDomainToolsHandler.js.map +1 -0
- package/dist/mcp/handlers/filtered/index.d.ts +15 -19
- package/dist/mcp/handlers/filtered/index.d.ts.map +1 -1
- package/dist/mcp/handlers/filtered/index.js +16 -27
- package/dist/mcp/handlers/filtered/index.js.map +1 -1
- package/dist/mcp/handlers/integration/index.d.ts +5 -4
- package/dist/mcp/handlers/integration/index.d.ts.map +1 -1
- package/dist/mcp/handlers/integration/index.js +7 -7
- package/dist/mcp/handlers/integration/index.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +14 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +8 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +412 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/planning/GOAPPlanner.d.ts +1 -0
- package/dist/planning/GOAPPlanner.d.ts.map +1 -1
- package/dist/planning/GOAPPlanner.js +12 -0
- package/dist/planning/GOAPPlanner.js.map +1 -1
- package/package.json +29 -8
- package/dist/alerting/AlertManager.d.ts +0 -120
- package/dist/alerting/AlertManager.d.ts.map +0 -1
- package/dist/alerting/AlertManager.js +0 -345
- package/dist/alerting/AlertManager.js.map +0 -1
- package/dist/alerting/FeedbackRouter.d.ts +0 -98
- package/dist/alerting/FeedbackRouter.d.ts.map +0 -1
- package/dist/alerting/FeedbackRouter.js +0 -331
- package/dist/alerting/FeedbackRouter.js.map +0 -1
- package/dist/alerting/StrategyApplicator.d.ts +0 -120
- package/dist/alerting/StrategyApplicator.d.ts.map +0 -1
- package/dist/alerting/StrategyApplicator.js +0 -299
- package/dist/alerting/StrategyApplicator.js.map +0 -1
- package/dist/alerting/index.d.ts +0 -68
- package/dist/alerting/index.d.ts.map +0 -1
- package/dist/alerting/index.js +0 -112
- package/dist/alerting/index.js.map +0 -1
- package/dist/alerting/types.d.ts +0 -118
- package/dist/alerting/types.d.ts.map +0 -1
- package/dist/alerting/types.js +0 -11
- package/dist/alerting/types.js.map +0 -1
- package/dist/cli/commands/fleet/backup.d.ts +0 -49
- package/dist/cli/commands/fleet/backup.d.ts.map +0 -1
- package/dist/cli/commands/fleet/backup.js +0 -88
- package/dist/cli/commands/fleet/backup.js.map +0 -1
- package/dist/cli/commands/fleet/health.d.ts +0 -154
- package/dist/cli/commands/fleet/health.d.ts.map +0 -1
- package/dist/cli/commands/fleet/health.js +0 -483
- package/dist/cli/commands/fleet/health.js.map +0 -1
- package/dist/cli/commands/fleet/init.d.ts +0 -11
- package/dist/cli/commands/fleet/init.d.ts.map +0 -1
- package/dist/cli/commands/fleet/init.js +0 -91
- package/dist/cli/commands/fleet/init.js.map +0 -1
- package/dist/cli/commands/fleet/logs.d.ts +0 -21
- package/dist/cli/commands/fleet/logs.d.ts.map +0 -1
- package/dist/cli/commands/fleet/logs.js +0 -267
- package/dist/cli/commands/fleet/logs.js.map +0 -1
- package/dist/cli/commands/fleet/metrics.d.ts +0 -27
- package/dist/cli/commands/fleet/metrics.d.ts.map +0 -1
- package/dist/cli/commands/fleet/metrics.js +0 -369
- package/dist/cli/commands/fleet/metrics.js.map +0 -1
- package/dist/cli/commands/fleet/monitor.d.ts +0 -18
- package/dist/cli/commands/fleet/monitor.d.ts.map +0 -1
- package/dist/cli/commands/fleet/monitor.js +0 -237
- package/dist/cli/commands/fleet/monitor.js.map +0 -1
- package/dist/cli/commands/fleet/optimize.d.ts +0 -42
- package/dist/cli/commands/fleet/optimize.d.ts.map +0 -1
- package/dist/cli/commands/fleet/optimize.js +0 -135
- package/dist/cli/commands/fleet/optimize.js.map +0 -1
- package/dist/cli/commands/fleet/recover.d.ts +0 -22
- package/dist/cli/commands/fleet/recover.d.ts.map +0 -1
- package/dist/cli/commands/fleet/recover.js +0 -99
- package/dist/cli/commands/fleet/recover.js.map +0 -1
- package/dist/cli/commands/fleet/restart.d.ts +0 -18
- package/dist/cli/commands/fleet/restart.d.ts.map +0 -1
- package/dist/cli/commands/fleet/restart.js +0 -290
- package/dist/cli/commands/fleet/restart.js.map +0 -1
- package/dist/cli/commands/fleet/scale.d.ts +0 -9
- package/dist/cli/commands/fleet/scale.d.ts.map +0 -1
- package/dist/cli/commands/fleet/scale.js +0 -77
- package/dist/cli/commands/fleet/scale.js.map +0 -1
- package/dist/cli/commands/fleet/shutdown.d.ts +0 -19
- package/dist/cli/commands/fleet/shutdown.d.ts.map +0 -1
- package/dist/cli/commands/fleet/shutdown.js +0 -307
- package/dist/cli/commands/fleet/shutdown.js.map +0 -1
- package/dist/cli/commands/fleet/status.d.ts +0 -10
- package/dist/cli/commands/fleet/status.d.ts.map +0 -1
- package/dist/cli/commands/fleet/status.js +0 -97
- package/dist/cli/commands/fleet/status.js.map +0 -1
- package/dist/cli/commands/fleet/topology.d.ts +0 -23
- package/dist/cli/commands/fleet/topology.d.ts.map +0 -1
- package/dist/cli/commands/fleet/topology.js +0 -376
- package/dist/cli/commands/fleet/topology.js.map +0 -1
- package/dist/cli/commands/monitor/alerts.d.ts +0 -45
- package/dist/cli/commands/monitor/alerts.d.ts.map +0 -1
- package/dist/cli/commands/monitor/alerts.js +0 -168
- package/dist/cli/commands/monitor/alerts.js.map +0 -1
- package/dist/cli/commands/monitor/analyze.d.ts +0 -49
- package/dist/cli/commands/monitor/analyze.d.ts.map +0 -1
- package/dist/cli/commands/monitor/analyze.js +0 -209
- package/dist/cli/commands/monitor/analyze.js.map +0 -1
- package/dist/cli/commands/monitor/compare.d.ts +0 -38
- package/dist/cli/commands/monitor/compare.d.ts.map +0 -1
- package/dist/cli/commands/monitor/compare.js +0 -177
- package/dist/cli/commands/monitor/compare.js.map +0 -1
- package/dist/cli/commands/monitor/dashboard.d.ts +0 -34
- package/dist/cli/commands/monitor/dashboard.d.ts.map +0 -1
- package/dist/cli/commands/monitor/dashboard.js +0 -157
- package/dist/cli/commands/monitor/dashboard.js.map +0 -1
- package/dist/cli/commands/monitor/export.d.ts +0 -36
- package/dist/cli/commands/monitor/export.d.ts.map +0 -1
- package/dist/cli/commands/monitor/export.js +0 -157
- package/dist/cli/commands/monitor/export.js.map +0 -1
- package/dist/cli/commands/monitor/index.d.ts +0 -11
- package/dist/cli/commands/monitor/index.d.ts.map +0 -1
- package/dist/cli/commands/monitor/index.js +0 -14
- package/dist/cli/commands/monitor/index.js.map +0 -1
- package/dist/cli/commands/quality/baseline.d.ts +0 -27
- package/dist/cli/commands/quality/baseline.d.ts.map +0 -1
- package/dist/cli/commands/quality/baseline.js +0 -124
- package/dist/cli/commands/quality/baseline.js.map +0 -1
- package/dist/cli/commands/quality/compare.d.ts +0 -36
- package/dist/cli/commands/quality/compare.d.ts.map +0 -1
- package/dist/cli/commands/quality/compare.js +0 -136
- package/dist/cli/commands/quality/compare.js.map +0 -1
- package/dist/cli/commands/quality/decision.d.ts +0 -81
- package/dist/cli/commands/quality/decision.d.ts.map +0 -1
- package/dist/cli/commands/quality/decision.js +0 -319
- package/dist/cli/commands/quality/decision.js.map +0 -1
- package/dist/cli/commands/quality/gate.d.ts +0 -47
- package/dist/cli/commands/quality/gate.d.ts.map +0 -1
- package/dist/cli/commands/quality/gate.js +0 -205
- package/dist/cli/commands/quality/gate.js.map +0 -1
- package/dist/cli/commands/quality/index.d.ts +0 -17
- package/dist/cli/commands/quality/index.d.ts.map +0 -1
- package/dist/cli/commands/quality/index.js +0 -41
- package/dist/cli/commands/quality/index.js.map +0 -1
- package/dist/cli/commands/quality/policy.d.ts +0 -57
- package/dist/cli/commands/quality/policy.d.ts.map +0 -1
- package/dist/cli/commands/quality/policy.js +0 -359
- package/dist/cli/commands/quality/policy.js.map +0 -1
- package/dist/cli/commands/quality/risk.d.ts +0 -41
- package/dist/cli/commands/quality/risk.d.ts.map +0 -1
- package/dist/cli/commands/quality/risk.js +0 -255
- package/dist/cli/commands/quality/risk.js.map +0 -1
- package/dist/cli/commands/quality/trends.d.ts +0 -40
- package/dist/cli/commands/quality/trends.d.ts.map +0 -1
- package/dist/cli/commands/quality/trends.js +0 -122
- package/dist/cli/commands/quality/trends.js.map +0 -1
- package/dist/cli/commands/quality/validate.d.ts +0 -44
- package/dist/cli/commands/quality/validate.d.ts.map +0 -1
- package/dist/cli/commands/quality/validate.js +0 -234
- package/dist/cli/commands/quality/validate.js.map +0 -1
- package/dist/cli/commands/test/analyze-failures.d.ts +0 -39
- package/dist/cli/commands/test/analyze-failures.d.ts.map +0 -1
- package/dist/cli/commands/test/analyze-failures.js +0 -113
- package/dist/cli/commands/test/analyze-failures.js.map +0 -1
- package/dist/cli/commands/test/clean.d.ts +0 -3
- package/dist/cli/commands/test/clean.d.ts.map +0 -1
- package/dist/cli/commands/test/clean.js +0 -148
- package/dist/cli/commands/test/clean.js.map +0 -1
- package/dist/cli/commands/test/debug.d.ts +0 -3
- package/dist/cli/commands/test/debug.d.ts.map +0 -1
- package/dist/cli/commands/test/debug.js +0 -167
- package/dist/cli/commands/test/debug.js.map +0 -1
- package/dist/cli/commands/test/diff.d.ts +0 -3
- package/dist/cli/commands/test/diff.d.ts.map +0 -1
- package/dist/cli/commands/test/diff.js +0 -195
- package/dist/cli/commands/test/diff.js.map +0 -1
- package/dist/cli/commands/test/flakiness.d.ts +0 -32
- package/dist/cli/commands/test/flakiness.d.ts.map +0 -1
- package/dist/cli/commands/test/flakiness.js +0 -121
- package/dist/cli/commands/test/flakiness.js.map +0 -1
- package/dist/cli/commands/test/index.d.ts +0 -17
- package/dist/cli/commands/test/index.d.ts.map +0 -1
- package/dist/cli/commands/test/index.js +0 -45
- package/dist/cli/commands/test/index.js.map +0 -1
- package/dist/cli/commands/test/mutate.d.ts +0 -29
- package/dist/cli/commands/test/mutate.d.ts.map +0 -1
- package/dist/cli/commands/test/mutate.js +0 -163
- package/dist/cli/commands/test/mutate.js.map +0 -1
- package/dist/cli/commands/test/parallel.d.ts +0 -3
- package/dist/cli/commands/test/parallel.d.ts.map +0 -1
- package/dist/cli/commands/test/parallel.js +0 -117
- package/dist/cli/commands/test/parallel.js.map +0 -1
- package/dist/cli/commands/test/profile.d.ts +0 -3
- package/dist/cli/commands/test/profile.d.ts.map +0 -1
- package/dist/cli/commands/test/profile.js +0 -156
- package/dist/cli/commands/test/profile.js.map +0 -1
- package/dist/cli/commands/test/queue.d.ts +0 -3
- package/dist/cli/commands/test/queue.d.ts.map +0 -1
- package/dist/cli/commands/test/queue.js +0 -140
- package/dist/cli/commands/test/queue.js.map +0 -1
- package/dist/cli/commands/test/retry.d.ts +0 -3
- package/dist/cli/commands/test/retry.d.ts.map +0 -1
- package/dist/cli/commands/test/retry.js +0 -105
- package/dist/cli/commands/test/retry.js.map +0 -1
- package/dist/cli/commands/test/snapshot.d.ts +0 -3
- package/dist/cli/commands/test/snapshot.d.ts.map +0 -1
- package/dist/cli/commands/test/snapshot.js +0 -176
- package/dist/cli/commands/test/snapshot.js.map +0 -1
- package/dist/cli/commands/test/trace.d.ts +0 -3
- package/dist/cli/commands/test/trace.d.ts.map +0 -1
- package/dist/cli/commands/test/trace.js +0 -137
- package/dist/cli/commands/test/trace.js.map +0 -1
- package/dist/cli/commands/test/watch.d.ts +0 -3
- package/dist/cli/commands/test/watch.d.ts.map +0 -1
- package/dist/cli/commands/test/watch.js +0 -130
- package/dist/cli/commands/test/watch.js.map +0 -1
- package/dist/cli/index-spec.d.ts +0 -3
- package/dist/cli/index-spec.d.ts.map +0 -1
- package/dist/cli/index-spec.js +0 -154
- package/dist/cli/index-spec.js.map +0 -1
- package/dist/cli/index-working.d.ts +0 -7
- package/dist/cli/index-working.d.ts.map +0 -1
- package/dist/cli/index-working.js +0 -617
- package/dist/cli/index-working.js.map +0 -1
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.d.ts +0 -83
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.d.ts.map +0 -1
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.js +0 -130
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.js.map +0 -1
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.d.ts +0 -58
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.d.ts.map +0 -1
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.js +0 -84
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.js.map +0 -1
- package/dist/mcp/handlers/filtered/security-scanner-filtered.d.ts +0 -54
- package/dist/mcp/handlers/filtered/security-scanner-filtered.d.ts.map +0 -1
- package/dist/mcp/handlers/filtered/security-scanner-filtered.js +0 -73
- package/dist/mcp/handlers/filtered/security-scanner-filtered.js.map +0 -1
- package/dist/mcp/handlers/integration/contract-validate.d.ts +0 -10
- package/dist/mcp/handlers/integration/contract-validate.d.ts.map +0 -1
- package/dist/mcp/handlers/integration/contract-validate.js +0 -348
- package/dist/mcp/handlers/integration/contract-validate.js.map +0 -1
- package/dist/reporting/ResultAggregator.d.ts +0 -107
- package/dist/reporting/ResultAggregator.d.ts.map +0 -1
- package/dist/reporting/ResultAggregator.js +0 -435
- package/dist/reporting/ResultAggregator.js.map +0 -1
- package/dist/reporting/index.d.ts +0 -48
- package/dist/reporting/index.d.ts.map +0 -1
- package/dist/reporting/index.js +0 -154
- package/dist/reporting/index.js.map +0 -1
- package/dist/reporting/reporters/ControlLoopReporter.d.ts +0 -128
- package/dist/reporting/reporters/ControlLoopReporter.d.ts.map +0 -1
- package/dist/reporting/reporters/ControlLoopReporter.js +0 -417
- package/dist/reporting/reporters/ControlLoopReporter.js.map +0 -1
- package/dist/reporting/reporters/HumanReadableReporter.d.ts +0 -140
- package/dist/reporting/reporters/HumanReadableReporter.d.ts.map +0 -1
- package/dist/reporting/reporters/HumanReadableReporter.js +0 -524
- package/dist/reporting/reporters/HumanReadableReporter.js.map +0 -1
- package/dist/reporting/reporters/JSONReporter.d.ts +0 -251
- package/dist/reporting/reporters/JSONReporter.d.ts.map +0 -1
- package/dist/reporting/reporters/JSONReporter.js +0 -325
- package/dist/reporting/reporters/JSONReporter.js.map +0 -1
- package/dist/reporting/reporters/index.d.ts +0 -14
- package/dist/reporting/reporters/index.d.ts.map +0 -1
- package/dist/reporting/reporters/index.js +0 -19
- package/dist/reporting/reporters/index.js.map +0 -1
- package/dist/reporting/types.d.ts +0 -427
- package/dist/reporting/types.d.ts.map +0 -1
- package/dist/reporting/types.js +0 -12
- package/dist/reporting/types.js.map +0 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NAT Detector for @ruvector/edge P2P
|
|
3
|
+
*
|
|
4
|
+
* Detects NAT type using STUN servers with multiple testing strategies.
|
|
5
|
+
* Implements RFC 3489/5389 compliant NAT classification with caching
|
|
6
|
+
* and parallel server testing for reliable detection.
|
|
7
|
+
*
|
|
8
|
+
* @module edge/p2p/nat/NATDetector
|
|
9
|
+
* @version 1.0.0
|
|
10
|
+
*/
|
|
11
|
+
import { NATClassification, NATDetectionResult, NATDetectorConfig, NATEventType, NATEventHandler } from './types';
|
|
12
|
+
/**
|
|
13
|
+
* NAT Detector - Detects NAT type using STUN
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const detector = new NATDetector({
|
|
18
|
+
* stunServers: [
|
|
19
|
+
* { urls: 'stun:stun.l.google.com:19302' },
|
|
20
|
+
* { urls: 'stun:stun1.l.google.com:19302' },
|
|
21
|
+
* ],
|
|
22
|
+
* timeout: 10000,
|
|
23
|
+
* enableCache: true,
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* const result = await detector.detect();
|
|
27
|
+
* console.log('NAT Type:', result.natType);
|
|
28
|
+
* console.log('External IP:', result.externalAddress);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare class NATDetector {
|
|
32
|
+
private readonly config;
|
|
33
|
+
private cachedResult;
|
|
34
|
+
private cacheTimestamp;
|
|
35
|
+
private eventHandlers;
|
|
36
|
+
private isDetecting;
|
|
37
|
+
private detectionPromise;
|
|
38
|
+
/**
|
|
39
|
+
* Create a new NAT Detector
|
|
40
|
+
*
|
|
41
|
+
* @param config - Detector configuration
|
|
42
|
+
*/
|
|
43
|
+
constructor(config?: Partial<NATDetectorConfig>);
|
|
44
|
+
/**
|
|
45
|
+
* Detect NAT type using configured STUN servers
|
|
46
|
+
*
|
|
47
|
+
* @returns Promise resolving to NAT detection result
|
|
48
|
+
*/
|
|
49
|
+
detect(): Promise<NATDetectionResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Force re-detection, ignoring cache
|
|
52
|
+
*
|
|
53
|
+
* @returns Promise resolving to fresh NAT detection result
|
|
54
|
+
*/
|
|
55
|
+
forceDetect(): Promise<NATDetectionResult>;
|
|
56
|
+
/**
|
|
57
|
+
* Get cached detection result if available and valid
|
|
58
|
+
*
|
|
59
|
+
* @returns Cached result or null
|
|
60
|
+
*/
|
|
61
|
+
getCachedResult(): NATDetectionResult | null;
|
|
62
|
+
/**
|
|
63
|
+
* Invalidate cached detection result
|
|
64
|
+
*/
|
|
65
|
+
invalidateCache(): void;
|
|
66
|
+
/**
|
|
67
|
+
* Estimate connectivity probability between two NAT types
|
|
68
|
+
*
|
|
69
|
+
* @param localNat - Local NAT type
|
|
70
|
+
* @param remoteNat - Remote NAT type
|
|
71
|
+
* @returns Probability (0-1) of successful direct connection
|
|
72
|
+
*/
|
|
73
|
+
estimateConnectivity(localNat: NATClassification, remoteNat: NATClassification): number;
|
|
74
|
+
/**
|
|
75
|
+
* Check if TURN relay is recommended based on NAT types
|
|
76
|
+
*
|
|
77
|
+
* @param localNat - Local NAT type
|
|
78
|
+
* @param remoteNat - Remote NAT type
|
|
79
|
+
* @param threshold - Probability threshold (default 0.5)
|
|
80
|
+
* @returns True if TURN is recommended
|
|
81
|
+
*/
|
|
82
|
+
shouldUseTurn(localNat: NATClassification, remoteNat: NATClassification, threshold?: number): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Register event handler
|
|
85
|
+
*
|
|
86
|
+
* @param type - Event type to handle
|
|
87
|
+
* @param handler - Event handler function
|
|
88
|
+
* @returns Unsubscribe function
|
|
89
|
+
*/
|
|
90
|
+
on<T>(type: NATEventType, handler: NATEventHandler<T>): () => void;
|
|
91
|
+
/**
|
|
92
|
+
* Get current configuration
|
|
93
|
+
*/
|
|
94
|
+
getConfig(): NATDetectorConfig;
|
|
95
|
+
private isCacheValid;
|
|
96
|
+
private performDetection;
|
|
97
|
+
private queryStunServers;
|
|
98
|
+
private queryStunServer;
|
|
99
|
+
private performStunBinding;
|
|
100
|
+
private parseCandidate;
|
|
101
|
+
private analyzeResponses;
|
|
102
|
+
private classifyConsistentMapping;
|
|
103
|
+
private isPrivateIP;
|
|
104
|
+
private createFailedResult;
|
|
105
|
+
private getServerUrl;
|
|
106
|
+
private emitEvent;
|
|
107
|
+
}
|
|
108
|
+
export default NATDetector;
|
|
109
|
+
//# sourceMappingURL=NATDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NATDetector.d.ts","sourceRoot":"","sources":["../../../../src/edge/p2p/nat/NATDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EAGjB,YAAY,EAEZ,eAAe,EAEhB,MAAM,SAAS,CAAC;AAiBjB;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,aAAa,CAAsD;IAC3E,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,gBAAgB,CAA4C;IAEpE;;;;OAIG;gBACS,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAQnD;;;;OAIG;IACU,MAAM,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAuBlD;;;;OAIG;IACU,WAAW,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAKvD;;;;OAIG;IACI,eAAe,IAAI,kBAAkB,GAAG,IAAI;IAInD;;OAEG;IACI,eAAe,IAAI,IAAI;IAK9B;;;;;;OAMG;IACI,oBAAoB,CACzB,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,iBAAiB,GAC3B,MAAM;IAIT;;;;;;;OAOG;IACI,aAAa,CAClB,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,iBAAiB,EAC5B,SAAS,GAAE,MAAY,GACtB,OAAO;IAKV;;;;;;OAMG;IACI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAQzE;;OAEG;IACI,SAAS,IAAI,iBAAiB;IAQrC,OAAO,CAAC,YAAY;YAQN,gBAAgB;YA0ChB,gBAAgB;YAkChB,eAAe;YAwCf,kBAAkB;IA6EhC,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,gBAAgB;IA2DxB,OAAO,CAAC,yBAAyB;IAyBjC,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,SAAS;CAiBlB;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NAT Detector for @ruvector/edge P2P
|
|
4
|
+
*
|
|
5
|
+
* Detects NAT type using STUN servers with multiple testing strategies.
|
|
6
|
+
* Implements RFC 3489/5389 compliant NAT classification with caching
|
|
7
|
+
* and parallel server testing for reliable detection.
|
|
8
|
+
*
|
|
9
|
+
* @module edge/p2p/nat/NATDetector
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.NATDetector = void 0;
|
|
14
|
+
const types_1 = require("./types");
|
|
15
|
+
/**
|
|
16
|
+
* STUN message type constants
|
|
17
|
+
*/
|
|
18
|
+
const STUN_BINDING_REQUEST = 0x0001;
|
|
19
|
+
const STUN_BINDING_RESPONSE = 0x0101;
|
|
20
|
+
const STUN_MAGIC_COOKIE = 0x2112a442;
|
|
21
|
+
const STUN_HEADER_SIZE = 20;
|
|
22
|
+
/**
|
|
23
|
+
* STUN attribute types
|
|
24
|
+
*/
|
|
25
|
+
const STUN_ATTR_MAPPED_ADDRESS = 0x0001;
|
|
26
|
+
const STUN_ATTR_XOR_MAPPED_ADDRESS = 0x0020;
|
|
27
|
+
const STUN_ATTR_RESPONSE_ORIGIN = 0x802b;
|
|
28
|
+
/**
|
|
29
|
+
* NAT Detector - Detects NAT type using STUN
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const detector = new NATDetector({
|
|
34
|
+
* stunServers: [
|
|
35
|
+
* { urls: 'stun:stun.l.google.com:19302' },
|
|
36
|
+
* { urls: 'stun:stun1.l.google.com:19302' },
|
|
37
|
+
* ],
|
|
38
|
+
* timeout: 10000,
|
|
39
|
+
* enableCache: true,
|
|
40
|
+
* });
|
|
41
|
+
*
|
|
42
|
+
* const result = await detector.detect();
|
|
43
|
+
* console.log('NAT Type:', result.natType);
|
|
44
|
+
* console.log('External IP:', result.externalAddress);
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
class NATDetector {
|
|
48
|
+
/**
|
|
49
|
+
* Create a new NAT Detector
|
|
50
|
+
*
|
|
51
|
+
* @param config - Detector configuration
|
|
52
|
+
*/
|
|
53
|
+
constructor(config = {}) {
|
|
54
|
+
this.cachedResult = null;
|
|
55
|
+
this.cacheTimestamp = 0;
|
|
56
|
+
this.eventHandlers = new Map();
|
|
57
|
+
this.isDetecting = false;
|
|
58
|
+
this.detectionPromise = null;
|
|
59
|
+
this.config = {
|
|
60
|
+
...types_1.DEFAULT_NAT_DETECTOR_CONFIG,
|
|
61
|
+
...config,
|
|
62
|
+
stunServers: config.stunServers ?? types_1.DEFAULT_NAT_DETECTOR_CONFIG.stunServers,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Detect NAT type using configured STUN servers
|
|
67
|
+
*
|
|
68
|
+
* @returns Promise resolving to NAT detection result
|
|
69
|
+
*/
|
|
70
|
+
async detect() {
|
|
71
|
+
// Check cache first
|
|
72
|
+
if (this.isCacheValid()) {
|
|
73
|
+
return this.cachedResult;
|
|
74
|
+
}
|
|
75
|
+
// If detection is already in progress, return existing promise
|
|
76
|
+
if (this.isDetecting && this.detectionPromise) {
|
|
77
|
+
return this.detectionPromise;
|
|
78
|
+
}
|
|
79
|
+
this.isDetecting = true;
|
|
80
|
+
this.detectionPromise = this.performDetection();
|
|
81
|
+
try {
|
|
82
|
+
const result = await this.detectionPromise;
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
this.isDetecting = false;
|
|
87
|
+
this.detectionPromise = null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Force re-detection, ignoring cache
|
|
92
|
+
*
|
|
93
|
+
* @returns Promise resolving to fresh NAT detection result
|
|
94
|
+
*/
|
|
95
|
+
async forceDetect() {
|
|
96
|
+
this.invalidateCache();
|
|
97
|
+
return this.detect();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get cached detection result if available and valid
|
|
101
|
+
*
|
|
102
|
+
* @returns Cached result or null
|
|
103
|
+
*/
|
|
104
|
+
getCachedResult() {
|
|
105
|
+
return this.isCacheValid() ? this.cachedResult : null;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Invalidate cached detection result
|
|
109
|
+
*/
|
|
110
|
+
invalidateCache() {
|
|
111
|
+
this.cachedResult = null;
|
|
112
|
+
this.cacheTimestamp = 0;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Estimate connectivity probability between two NAT types
|
|
116
|
+
*
|
|
117
|
+
* @param localNat - Local NAT type
|
|
118
|
+
* @param remoteNat - Remote NAT type
|
|
119
|
+
* @returns Probability (0-1) of successful direct connection
|
|
120
|
+
*/
|
|
121
|
+
estimateConnectivity(localNat, remoteNat) {
|
|
122
|
+
return types_1.NAT_CONNECTIVITY_MATRIX[localNat]?.[remoteNat] ?? 0.3;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Check if TURN relay is recommended based on NAT types
|
|
126
|
+
*
|
|
127
|
+
* @param localNat - Local NAT type
|
|
128
|
+
* @param remoteNat - Remote NAT type
|
|
129
|
+
* @param threshold - Probability threshold (default 0.5)
|
|
130
|
+
* @returns True if TURN is recommended
|
|
131
|
+
*/
|
|
132
|
+
shouldUseTurn(localNat, remoteNat, threshold = 0.5) {
|
|
133
|
+
const probability = this.estimateConnectivity(localNat, remoteNat);
|
|
134
|
+
return probability < threshold;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Register event handler
|
|
138
|
+
*
|
|
139
|
+
* @param type - Event type to handle
|
|
140
|
+
* @param handler - Event handler function
|
|
141
|
+
* @returns Unsubscribe function
|
|
142
|
+
*/
|
|
143
|
+
on(type, handler) {
|
|
144
|
+
if (!this.eventHandlers.has(type)) {
|
|
145
|
+
this.eventHandlers.set(type, new Set());
|
|
146
|
+
}
|
|
147
|
+
this.eventHandlers.get(type).add(handler);
|
|
148
|
+
return () => this.eventHandlers.get(type)?.delete(handler);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get current configuration
|
|
152
|
+
*/
|
|
153
|
+
getConfig() {
|
|
154
|
+
return { ...this.config };
|
|
155
|
+
}
|
|
156
|
+
// ============================================
|
|
157
|
+
// Private Methods
|
|
158
|
+
// ============================================
|
|
159
|
+
isCacheValid() {
|
|
160
|
+
if (!this.config.enableCache || !this.cachedResult) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
const age = Date.now() - this.cacheTimestamp;
|
|
164
|
+
return age < this.config.cacheTtl;
|
|
165
|
+
}
|
|
166
|
+
async performDetection() {
|
|
167
|
+
const startTime = Date.now();
|
|
168
|
+
this.emitEvent(types_1.NATEventType.DetectionStarted, {
|
|
169
|
+
servers: this.config.stunServers.map((s) => this.getServerUrl(s)),
|
|
170
|
+
timestamp: startTime,
|
|
171
|
+
});
|
|
172
|
+
try {
|
|
173
|
+
// Get binding responses from STUN servers
|
|
174
|
+
const responses = await this.queryStunServers();
|
|
175
|
+
if (responses.length < this.config.minServers) {
|
|
176
|
+
const result = this.createFailedResult(startTime, `Insufficient STUN responses: ${responses.length}/${this.config.minServers}`);
|
|
177
|
+
this.emitEvent(types_1.NATEventType.DetectionFailed, result);
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
// Analyze responses to determine NAT type
|
|
181
|
+
const result = this.analyzeResponses(responses, startTime);
|
|
182
|
+
// Cache result
|
|
183
|
+
if (this.config.enableCache) {
|
|
184
|
+
this.cachedResult = result;
|
|
185
|
+
this.cacheTimestamp = Date.now();
|
|
186
|
+
}
|
|
187
|
+
this.emitEvent(types_1.NATEventType.DetectionCompleted, result);
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
const result = this.createFailedResult(startTime, error instanceof Error ? error.message : 'Unknown detection error');
|
|
192
|
+
this.emitEvent(types_1.NATEventType.DetectionFailed, result);
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async queryStunServers() {
|
|
197
|
+
const servers = this.config.stunServers;
|
|
198
|
+
if (this.config.parallelTesting) {
|
|
199
|
+
// Query all servers in parallel
|
|
200
|
+
const promises = servers.map((server) => this.queryStunServer(server));
|
|
201
|
+
const results = await Promise.allSettled(promises);
|
|
202
|
+
return results
|
|
203
|
+
.filter((r) => r.status === 'fulfilled' && r.value.success)
|
|
204
|
+
.map((r) => r.value);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
// Query servers sequentially
|
|
208
|
+
const responses = [];
|
|
209
|
+
for (const server of servers) {
|
|
210
|
+
try {
|
|
211
|
+
const response = await this.queryStunServer(server);
|
|
212
|
+
if (response.success) {
|
|
213
|
+
responses.push(response);
|
|
214
|
+
}
|
|
215
|
+
if (responses.length >= this.config.minServers) {
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// Continue to next server
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return responses;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async queryStunServer(server) {
|
|
227
|
+
const serverUrl = this.getServerUrl(server);
|
|
228
|
+
const startTime = Date.now();
|
|
229
|
+
return new Promise((resolve) => {
|
|
230
|
+
const timeout = setTimeout(() => {
|
|
231
|
+
resolve({
|
|
232
|
+
server: serverUrl,
|
|
233
|
+
mappedAddress: '',
|
|
234
|
+
mappedPort: 0,
|
|
235
|
+
responseTimeMs: Date.now() - startTime,
|
|
236
|
+
success: false,
|
|
237
|
+
error: 'Timeout',
|
|
238
|
+
});
|
|
239
|
+
}, this.config.timeout);
|
|
240
|
+
// Use RTCPeerConnection for STUN binding in browser environment
|
|
241
|
+
this.performStunBinding(server)
|
|
242
|
+
.then((result) => {
|
|
243
|
+
clearTimeout(timeout);
|
|
244
|
+
resolve({
|
|
245
|
+
...result,
|
|
246
|
+
server: serverUrl,
|
|
247
|
+
responseTimeMs: Date.now() - startTime,
|
|
248
|
+
});
|
|
249
|
+
})
|
|
250
|
+
.catch((error) => {
|
|
251
|
+
clearTimeout(timeout);
|
|
252
|
+
resolve({
|
|
253
|
+
server: serverUrl,
|
|
254
|
+
mappedAddress: '',
|
|
255
|
+
mappedPort: 0,
|
|
256
|
+
responseTimeMs: Date.now() - startTime,
|
|
257
|
+
success: false,
|
|
258
|
+
error: error instanceof Error ? error.message : 'STUN query failed',
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
async performStunBinding(server) {
|
|
264
|
+
return new Promise((resolve, reject) => {
|
|
265
|
+
// Check for RTCPeerConnection availability
|
|
266
|
+
if (typeof RTCPeerConnection === 'undefined') {
|
|
267
|
+
reject(new Error('RTCPeerConnection not available'));
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
const pc = new RTCPeerConnection({
|
|
271
|
+
iceServers: [server],
|
|
272
|
+
iceCandidatePoolSize: 0,
|
|
273
|
+
});
|
|
274
|
+
let resolved = false;
|
|
275
|
+
const candidateTimeout = setTimeout(() => {
|
|
276
|
+
if (!resolved) {
|
|
277
|
+
resolved = true;
|
|
278
|
+
pc.close();
|
|
279
|
+
reject(new Error('No ICE candidates gathered'));
|
|
280
|
+
}
|
|
281
|
+
}, this.config.timeout);
|
|
282
|
+
pc.onicecandidate = (event) => {
|
|
283
|
+
if (event.candidate && !resolved) {
|
|
284
|
+
const candidate = event.candidate.candidate;
|
|
285
|
+
// Look for srflx (server reflexive) candidate
|
|
286
|
+
if (candidate.includes('typ srflx')) {
|
|
287
|
+
const parsed = this.parseCandidate(candidate);
|
|
288
|
+
if (parsed) {
|
|
289
|
+
resolved = true;
|
|
290
|
+
clearTimeout(candidateTimeout);
|
|
291
|
+
pc.close();
|
|
292
|
+
resolve({
|
|
293
|
+
mappedAddress: parsed.address,
|
|
294
|
+
mappedPort: parsed.port,
|
|
295
|
+
success: true,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
else if (event.candidate === null && !resolved) {
|
|
301
|
+
// Gathering complete without srflx
|
|
302
|
+
resolved = true;
|
|
303
|
+
clearTimeout(candidateTimeout);
|
|
304
|
+
pc.close();
|
|
305
|
+
reject(new Error('No server reflexive candidate found'));
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
pc.onicegatheringstatechange = () => {
|
|
309
|
+
if (pc.iceGatheringState === 'complete' && !resolved) {
|
|
310
|
+
resolved = true;
|
|
311
|
+
clearTimeout(candidateTimeout);
|
|
312
|
+
pc.close();
|
|
313
|
+
reject(new Error('ICE gathering complete without srflx candidate'));
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
// Create data channel to trigger ICE gathering
|
|
317
|
+
pc.createDataChannel('nat-detection');
|
|
318
|
+
// Create offer to start ICE gathering
|
|
319
|
+
pc.createOffer()
|
|
320
|
+
.then((offer) => pc.setLocalDescription(offer))
|
|
321
|
+
.catch((error) => {
|
|
322
|
+
if (!resolved) {
|
|
323
|
+
resolved = true;
|
|
324
|
+
clearTimeout(candidateTimeout);
|
|
325
|
+
pc.close();
|
|
326
|
+
reject(error);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
parseCandidate(candidateString) {
|
|
332
|
+
// Parse ICE candidate format:
|
|
333
|
+
// candidate:foundation component protocol priority address port typ type ...
|
|
334
|
+
const parts = candidateString.split(' ');
|
|
335
|
+
if (parts.length < 6) {
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
const address = parts[4];
|
|
339
|
+
const port = parseInt(parts[5], 10);
|
|
340
|
+
if (address && !isNaN(port)) {
|
|
341
|
+
return { address, port };
|
|
342
|
+
}
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
analyzeResponses(responses, startTime) {
|
|
346
|
+
const addresses = new Set();
|
|
347
|
+
const ports = new Set();
|
|
348
|
+
const serversUsed = [];
|
|
349
|
+
for (const response of responses) {
|
|
350
|
+
if (response.success) {
|
|
351
|
+
addresses.add(response.mappedAddress);
|
|
352
|
+
ports.add(response.mappedPort);
|
|
353
|
+
serversUsed.push(response.server);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
const durationMs = Date.now() - startTime;
|
|
357
|
+
// Analyze mapping consistency
|
|
358
|
+
const portMappingConsistent = ports.size === 1;
|
|
359
|
+
const addressConsistent = addresses.size === 1;
|
|
360
|
+
// Determine NAT type based on responses
|
|
361
|
+
let natType;
|
|
362
|
+
let confidence;
|
|
363
|
+
if (addresses.size === 0) {
|
|
364
|
+
natType = types_1.NATClassification.Failed;
|
|
365
|
+
confidence = 0;
|
|
366
|
+
}
|
|
367
|
+
else if (addressConsistent && portMappingConsistent) {
|
|
368
|
+
// Same mapped address and port from multiple servers
|
|
369
|
+
// Indicates consistent NAT mapping
|
|
370
|
+
natType = this.classifyConsistentMapping(responses);
|
|
371
|
+
confidence = Math.min(0.9, 0.5 + responses.length * 0.1);
|
|
372
|
+
}
|
|
373
|
+
else if (addressConsistent && !portMappingConsistent) {
|
|
374
|
+
// Same address but different ports - likely symmetric NAT
|
|
375
|
+
natType = types_1.NATClassification.Symmetric;
|
|
376
|
+
confidence = 0.7;
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
// Different addresses - unusual, possibly multi-homed
|
|
380
|
+
natType = types_1.NATClassification.Unknown;
|
|
381
|
+
confidence = 0.3;
|
|
382
|
+
}
|
|
383
|
+
const firstResponse = responses.find((r) => r.success);
|
|
384
|
+
return {
|
|
385
|
+
natType,
|
|
386
|
+
externalAddress: firstResponse?.mappedAddress,
|
|
387
|
+
externalPort: firstResponse?.mappedPort,
|
|
388
|
+
portMappingConsistent,
|
|
389
|
+
endpointIndependentFiltering: natType !== types_1.NATClassification.Symmetric,
|
|
390
|
+
confidence,
|
|
391
|
+
serversUsed,
|
|
392
|
+
durationMs,
|
|
393
|
+
detectedAt: Date.now(),
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
classifyConsistentMapping(responses) {
|
|
397
|
+
// With consistent mapping, we need additional tests to distinguish
|
|
398
|
+
// between Full Cone, Restricted Cone, and Port Restricted Cone.
|
|
399
|
+
// In browser environment, we can only determine that it's some form
|
|
400
|
+
// of cone NAT or no NAT.
|
|
401
|
+
const firstResponse = responses[0];
|
|
402
|
+
if (!firstResponse?.success) {
|
|
403
|
+
return types_1.NATClassification.Unknown;
|
|
404
|
+
}
|
|
405
|
+
// Check if external address looks like a private IP (indicating no NAT)
|
|
406
|
+
if (this.isPrivateIP(firstResponse.mappedAddress)) {
|
|
407
|
+
return types_1.NATClassification.Open;
|
|
408
|
+
}
|
|
409
|
+
// Without additional tests from different IPs/ports, we can only
|
|
410
|
+
// determine it's likely a cone NAT. Default to FullCone as optimistic.
|
|
411
|
+
// More sophisticated detection would require a STUN server that can
|
|
412
|
+
// respond from different IP/port combinations.
|
|
413
|
+
return types_1.NATClassification.FullCone;
|
|
414
|
+
}
|
|
415
|
+
isPrivateIP(ip) {
|
|
416
|
+
// Check for private IP ranges
|
|
417
|
+
const parts = ip.split('.').map(Number);
|
|
418
|
+
if (parts.length !== 4) {
|
|
419
|
+
// IPv6 or invalid
|
|
420
|
+
return ip.startsWith('fd') || ip.startsWith('fc') || ip === '::1';
|
|
421
|
+
}
|
|
422
|
+
// 10.0.0.0/8
|
|
423
|
+
if (parts[0] === 10)
|
|
424
|
+
return true;
|
|
425
|
+
// 172.16.0.0/12
|
|
426
|
+
if (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31)
|
|
427
|
+
return true;
|
|
428
|
+
// 192.168.0.0/16
|
|
429
|
+
if (parts[0] === 192 && parts[1] === 168)
|
|
430
|
+
return true;
|
|
431
|
+
// 127.0.0.0/8 (loopback)
|
|
432
|
+
if (parts[0] === 127)
|
|
433
|
+
return true;
|
|
434
|
+
return false;
|
|
435
|
+
}
|
|
436
|
+
createFailedResult(startTime, error) {
|
|
437
|
+
return {
|
|
438
|
+
natType: types_1.NATClassification.Failed,
|
|
439
|
+
portMappingConsistent: false,
|
|
440
|
+
endpointIndependentFiltering: false,
|
|
441
|
+
confidence: 0,
|
|
442
|
+
serversUsed: [],
|
|
443
|
+
durationMs: Date.now() - startTime,
|
|
444
|
+
detectedAt: Date.now(),
|
|
445
|
+
error,
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
getServerUrl(server) {
|
|
449
|
+
return Array.isArray(server.urls) ? server.urls[0] : server.urls;
|
|
450
|
+
}
|
|
451
|
+
emitEvent(type, data) {
|
|
452
|
+
const handlers = this.eventHandlers.get(type);
|
|
453
|
+
if (handlers) {
|
|
454
|
+
const event = {
|
|
455
|
+
type,
|
|
456
|
+
timestamp: Date.now(),
|
|
457
|
+
data,
|
|
458
|
+
};
|
|
459
|
+
handlers.forEach((handler) => {
|
|
460
|
+
try {
|
|
461
|
+
handler(event);
|
|
462
|
+
}
|
|
463
|
+
catch (error) {
|
|
464
|
+
console.error(`NAT event handler error for ${type}:`, error);
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
exports.NATDetector = NATDetector;
|
|
471
|
+
exports.default = NATDetector;
|
|
472
|
+
//# sourceMappingURL=NATDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NATDetector.js","sourceRoot":"","sources":["../../../../src/edge/p2p/nat/NATDetector.ts"],"names":[],"mappings":"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"}
|