@iworkforces/tracelattice 2.0.3
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 +24 -0
- package/README.md +260 -0
- package/dist/CliLifecycle.d.ts +31 -0
- package/dist/CliLifecycle.d.ts.map +1 -0
- package/dist/CliLifecycle.js +90 -0
- package/dist/CliLifecycle.js.map +1 -0
- package/dist/ServerConfig.d.ts +290 -0
- package/dist/ServerConfig.d.ts.map +1 -0
- package/dist/ServerConfig.js +175 -0
- package/dist/ServerConfig.js.map +1 -0
- package/dist/cache/DiscoveryCache.d.ts +269 -0
- package/dist/cache/DiscoveryCache.d.ts.map +1 -0
- package/dist/cache/DiscoveryCache.js +104 -0
- package/dist/cache/DiscoveryCache.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5177 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/ConfigLoader.d.ts +270 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +186 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/context/RequestContext.d.ts +43 -0
- package/dist/context/RequestContext.d.ts.map +1 -0
- package/dist/context/RequestContext.js +14 -0
- package/dist/context/RequestContext.js.map +1 -0
- package/dist/contracts/PersistenceBackend.d.ts +134 -0
- package/dist/contracts/PersistenceBackend.d.ts.map +1 -0
- package/dist/contracts/PersistenceBackend.js +6 -0
- package/dist/contracts/PersistenceBackend.js.map +1 -0
- package/dist/contracts/calibrator.d.ts +97 -0
- package/dist/contracts/calibrator.d.ts.map +1 -0
- package/dist/contracts/calibrator.js +1 -0
- package/dist/contracts/features.d.ts +35 -0
- package/dist/contracts/features.d.ts.map +1 -0
- package/dist/contracts/features.js +12 -0
- package/dist/contracts/features.js.map +1 -0
- package/dist/contracts/ids.d.ts +68 -0
- package/dist/contracts/ids.d.ts.map +1 -0
- package/dist/contracts/ids.js +40 -0
- package/dist/contracts/ids.js.map +1 -0
- package/dist/contracts/interfaces.d.ts +254 -0
- package/dist/contracts/interfaces.d.ts.map +1 -0
- package/dist/contracts/interfaces.js +1 -0
- package/dist/contracts/persistence-work.d.ts +96 -0
- package/dist/contracts/persistence-work.d.ts.map +1 -0
- package/dist/contracts/persistence-work.js +1 -0
- package/dist/contracts/reasoning-types.d.ts +21 -0
- package/dist/contracts/reasoning-types.d.ts.map +1 -0
- package/dist/contracts/reasoning-types.js +1 -0
- package/dist/contracts/strategy.d.ts +107 -0
- package/dist/contracts/strategy.d.ts.map +1 -0
- package/dist/contracts/strategy.js +1 -0
- package/dist/contracts/summary.d.ts +110 -0
- package/dist/contracts/summary.d.ts.map +1 -0
- package/dist/contracts/summary.js +1 -0
- package/dist/contracts/suspension.d.ts +215 -0
- package/dist/contracts/suspension.d.ts.map +1 -0
- package/dist/contracts/suspension.js +1 -0
- package/dist/contracts/transport.d.ts +26 -0
- package/dist/contracts/transport.d.ts.map +1 -0
- package/dist/contracts/transport.js +1 -0
- package/dist/core/CrossReferenceValidator.d.ts +18 -0
- package/dist/core/CrossReferenceValidator.d.ts.map +1 -0
- package/dist/core/CrossReferenceValidator.js +125 -0
- package/dist/core/CrossReferenceValidator.js.map +1 -0
- package/dist/core/HistoryManager.d.ts +215 -0
- package/dist/core/HistoryManager.d.ts.map +1 -0
- package/dist/core/HistoryManager.js +594 -0
- package/dist/core/HistoryManager.js.map +1 -0
- package/dist/core/IHistoryManager.d.ts +163 -0
- package/dist/core/IHistoryManager.d.ts.map +1 -0
- package/dist/core/IHistoryManager.js +1 -0
- package/dist/core/IThoughtFormatter.d.ts +51 -0
- package/dist/core/IThoughtFormatter.d.ts.map +1 -0
- package/dist/core/IThoughtFormatter.js +1 -0
- package/dist/core/InputNormalizer.d.ts +140 -0
- package/dist/core/InputNormalizer.d.ts.map +1 -0
- package/dist/core/InputNormalizer.js +95 -0
- package/dist/core/InputNormalizer.js.map +1 -0
- package/dist/core/PersistenceBuffer.d.ts +204 -0
- package/dist/core/PersistenceBuffer.d.ts.map +1 -0
- package/dist/core/PersistenceBuffer.js +382 -0
- package/dist/core/PersistenceBuffer.js.map +1 -0
- package/dist/core/PersistenceBufferErrors.d.ts +22 -0
- package/dist/core/PersistenceBufferErrors.d.ts.map +1 -0
- package/dist/core/PersistenceBufferErrors.js +30 -0
- package/dist/core/PersistenceBufferErrors.js.map +1 -0
- package/dist/core/PersistenceRestore.d.ts +21 -0
- package/dist/core/PersistenceRestore.d.ts.map +1 -0
- package/dist/core/PersistenceRestore.js +87 -0
- package/dist/core/PersistenceRestore.js.map +1 -0
- package/dist/core/PersistenceWorkQueue.d.ts +155 -0
- package/dist/core/PersistenceWorkQueue.d.ts.map +1 -0
- package/dist/core/PersistenceWorkQueue.js +298 -0
- package/dist/core/PersistenceWorkQueue.js.map +1 -0
- package/dist/core/PersistenceWriter.d.ts +55 -0
- package/dist/core/PersistenceWriter.d.ts.map +1 -0
- package/dist/core/PersistenceWriter.js +112 -0
- package/dist/core/PersistenceWriter.js.map +1 -0
- package/dist/core/SessionErrors.d.ts +37 -0
- package/dist/core/SessionErrors.d.ts.map +1 -0
- package/dist/core/SessionErrors.js +50 -0
- package/dist/core/SessionErrors.js.map +1 -0
- package/dist/core/SessionLifecycleCoordinator.d.ts +74 -0
- package/dist/core/SessionLifecycleCoordinator.d.ts.map +1 -0
- package/dist/core/SessionLifecycleCoordinator.js +222 -0
- package/dist/core/SessionLifecycleCoordinator.js.map +1 -0
- package/dist/core/SessionLock.d.ts +59 -0
- package/dist/core/SessionLock.d.ts.map +1 -0
- package/dist/core/SessionLock.js +39 -0
- package/dist/core/SessionLock.js.map +1 -0
- package/dist/core/SessionManager.d.ts +62 -0
- package/dist/core/SessionManager.d.ts.map +1 -0
- package/dist/core/SessionManager.js +75 -0
- package/dist/core/SessionManager.js.map +1 -0
- package/dist/core/SessionResetCoordinator.d.ts +37 -0
- package/dist/core/SessionResetCoordinator.d.ts.map +1 -0
- package/dist/core/SessionResetCoordinator.js +80 -0
- package/dist/core/SessionResetCoordinator.js.map +1 -0
- package/dist/core/ThoughtEvaluator.d.ts +48 -0
- package/dist/core/ThoughtEvaluator.d.ts.map +1 -0
- package/dist/core/ThoughtEvaluator.js +85 -0
- package/dist/core/ThoughtEvaluator.js.map +1 -0
- package/dist/core/ThoughtFormatter.d.ts +134 -0
- package/dist/core/ThoughtFormatter.d.ts.map +1 -0
- package/dist/core/ThoughtFormatter.js +118 -0
- package/dist/core/ThoughtFormatter.js.map +1 -0
- package/dist/core/ThoughtProcessor.d.ts +259 -0
- package/dist/core/ThoughtProcessor.d.ts.map +1 -0
- package/dist/core/ThoughtProcessor.js +451 -0
- package/dist/core/ThoughtProcessor.js.map +1 -0
- package/dist/core/ThoughtReferenceIndex.d.ts +23 -0
- package/dist/core/ThoughtReferenceIndex.d.ts.map +1 -0
- package/dist/core/ThoughtReferenceIndex.js +66 -0
- package/dist/core/ThoughtReferenceIndex.js.map +1 -0
- package/dist/core/VerificationOutcomeAdmission.d.ts +15 -0
- package/dist/core/VerificationOutcomeAdmission.d.ts.map +1 -0
- package/dist/core/VerificationOutcomeAdmission.js +28 -0
- package/dist/core/VerificationOutcomeAdmission.js.map +1 -0
- package/dist/core/compression/CompressionService.d.ts +76 -0
- package/dist/core/compression/CompressionService.d.ts.map +1 -0
- package/dist/core/compression/CompressionService.js +160 -0
- package/dist/core/compression/CompressionService.js.map +1 -0
- package/dist/core/compression/DehydrationPolicy.d.ts +75 -0
- package/dist/core/compression/DehydrationPolicy.d.ts.map +1 -0
- package/dist/core/compression/DehydrationPolicy.js +45 -0
- package/dist/core/compression/DehydrationPolicy.js.map +1 -0
- package/dist/core/compression/InMemorySummaryStore.d.ts +132 -0
- package/dist/core/compression/InMemorySummaryStore.d.ts.map +1 -0
- package/dist/core/compression/InMemorySummaryStore.js +69 -0
- package/dist/core/compression/InMemorySummaryStore.js.map +1 -0
- package/dist/core/compression/Summary.d.ts +74 -0
- package/dist/core/compression/Summary.d.ts.map +1 -0
- package/dist/core/compression/Summary.js +16 -0
- package/dist/core/compression/Summary.js.map +1 -0
- package/dist/core/evaluator/Aggregator.d.ts +40 -0
- package/dist/core/evaluator/Aggregator.d.ts.map +1 -0
- package/dist/core/evaluator/Aggregator.js +36 -0
- package/dist/core/evaluator/Aggregator.js.map +1 -0
- package/dist/core/evaluator/Calibrator.d.ts +52 -0
- package/dist/core/evaluator/Calibrator.d.ts.map +1 -0
- package/dist/core/evaluator/Calibrator.js +135 -0
- package/dist/core/evaluator/Calibrator.js.map +1 -0
- package/dist/core/evaluator/PatternDetector.d.ts +69 -0
- package/dist/core/evaluator/PatternDetector.d.ts.map +1 -0
- package/dist/core/evaluator/PatternDetector.js +192 -0
- package/dist/core/evaluator/PatternDetector.js.map +1 -0
- package/dist/core/evaluator/SignalComputer.d.ts +116 -0
- package/dist/core/evaluator/SignalComputer.d.ts.map +1 -0
- package/dist/core/evaluator/SignalComputer.js +110 -0
- package/dist/core/evaluator/SignalComputer.js.map +1 -0
- package/dist/core/evaluator/calibration-math.d.ts +39 -0
- package/dist/core/evaluator/calibration-math.d.ts.map +1 -0
- package/dist/core/evaluator/calibration-math.js +42 -0
- package/dist/core/evaluator/calibration-math.js.map +1 -0
- package/dist/core/evaluator/internals.d.ts +36 -0
- package/dist/core/evaluator/internals.d.ts.map +1 -0
- package/dist/core/evaluator/internals.js +43 -0
- package/dist/core/evaluator/internals.js.map +1 -0
- package/dist/core/graph/Edge.d.ts +58 -0
- package/dist/core/graph/Edge.d.ts.map +1 -0
- package/dist/core/graph/Edge.js +1 -0
- package/dist/core/graph/EdgeEmitter.d.ts +68 -0
- package/dist/core/graph/EdgeEmitter.d.ts.map +1 -0
- package/dist/core/graph/EdgeEmitter.js +118 -0
- package/dist/core/graph/EdgeEmitter.js.map +1 -0
- package/dist/core/graph/EdgeStore.d.ts +116 -0
- package/dist/core/graph/EdgeStore.d.ts.map +1 -0
- package/dist/core/graph/EdgeStore.js +107 -0
- package/dist/core/graph/EdgeStore.js.map +1 -0
- package/dist/core/graph/GraphView.d.ts +157 -0
- package/dist/core/graph/GraphView.d.ts.map +1 -0
- package/dist/core/graph/GraphView.js +149 -0
- package/dist/core/graph/GraphView.js.map +1 -0
- package/dist/core/ids.d.ts +33 -0
- package/dist/core/ids.d.ts.map +1 -0
- package/dist/core/ids.js +11 -0
- package/dist/core/ids.js.map +1 -0
- package/dist/core/reasoning/OutcomeRecorder.d.ts +88 -0
- package/dist/core/reasoning/OutcomeRecorder.d.ts.map +1 -0
- package/dist/core/reasoning/OutcomeRecorder.js +51 -0
- package/dist/core/reasoning/OutcomeRecorder.js.map +1 -0
- package/dist/core/reasoning/strategies/SequentialStrategy.d.ts +54 -0
- package/dist/core/reasoning/strategies/SequentialStrategy.d.ts.map +1 -0
- package/dist/core/reasoning/strategies/SequentialStrategy.js +22 -0
- package/dist/core/reasoning/strategies/SequentialStrategy.js.map +1 -0
- package/dist/core/reasoning/strategies/StrategyFactory.d.ts +25 -0
- package/dist/core/reasoning/strategies/StrategyFactory.d.ts.map +1 -0
- package/dist/core/reasoning/strategies/StrategyFactory.js +16 -0
- package/dist/core/reasoning/strategies/StrategyFactory.js.map +1 -0
- package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts +58 -0
- package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts.map +1 -0
- package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js +103 -0
- package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js.map +1 -0
- package/dist/core/reasoning/strategies/plateau.d.ts +18 -0
- package/dist/core/reasoning/strategies/plateau.d.ts.map +1 -0
- package/dist/core/reasoning/strategies/plateau.js +12 -0
- package/dist/core/reasoning/strategies/plateau.js.map +1 -0
- package/dist/core/reasoning/strategies/totScoring.d.ts +91 -0
- package/dist/core/reasoning/strategies/totScoring.d.ts.map +1 -0
- package/dist/core/reasoning/strategies/totScoring.js +88 -0
- package/dist/core/reasoning/strategies/totScoring.js.map +1 -0
- package/dist/core/reasoning.d.ts +179 -0
- package/dist/core/reasoning.d.ts.map +1 -0
- package/dist/core/reasoning.js +1 -0
- package/dist/core/step.d.ts +50 -0
- package/dist/core/step.d.ts.map +1 -0
- package/dist/core/step.js +1 -0
- package/dist/core/thought.d.ts +113 -0
- package/dist/core/thought.d.ts.map +1 -0
- package/dist/core/thought.js +1 -0
- package/dist/core/tools/InMemorySuspensionStore.d.ts +66 -0
- package/dist/core/tools/InMemorySuspensionStore.d.ts.map +1 -0
- package/dist/core/tools/InMemorySuspensionStore.js +121 -0
- package/dist/core/tools/InMemorySuspensionStore.js.map +1 -0
- package/dist/di/Container.d.ts +253 -0
- package/dist/di/Container.d.ts.map +1 -0
- package/dist/di/Container.js +111 -0
- package/dist/di/Container.js.map +1 -0
- package/dist/di/ServiceRegistry.d.ts +50 -0
- package/dist/di/ServiceRegistry.d.ts.map +1 -0
- package/dist/di/ServiceRegistry.js +1 -0
- package/dist/errors.d.ts +663 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +282 -0
- package/dist/errors.js.map +1 -0
- package/dist/health/HealthChecker.d.ts +73 -0
- package/dist/health/HealthChecker.d.ts.map +1 -0
- package/dist/health/HealthChecker.js +70 -0
- package/dist/health/HealthChecker.js.map +1 -0
- package/dist/lib.d.ts +273 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +409 -0
- package/dist/lib.js.map +1 -0
- package/dist/logger/NullLogger.d.ts +154 -0
- package/dist/logger/NullLogger.d.ts.map +1 -0
- package/dist/logger/NullLogger.js +24 -0
- package/dist/logger/NullLogger.js.map +1 -0
- package/dist/logger/StructuredLogger.d.ts +327 -0
- package/dist/logger/StructuredLogger.d.ts.map +1 -0
- package/dist/logger/StructuredLogger.js +72 -0
- package/dist/logger/StructuredLogger.js.map +1 -0
- package/dist/metrics/metrics.impl.d.ts +252 -0
- package/dist/metrics/metrics.impl.d.ts.map +1 -0
- package/dist/metrics/metrics.impl.js +197 -0
- package/dist/metrics/metrics.impl.js.map +1 -0
- package/dist/persistence/FileLegacyImport.d.ts +2 -0
- package/dist/persistence/FileLegacyImport.d.ts.map +1 -0
- package/dist/persistence/FileLegacyImport.js +183 -0
- package/dist/persistence/FileLegacyImport.js.map +1 -0
- package/dist/persistence/FilePersistence.d.ts +53 -0
- package/dist/persistence/FilePersistence.d.ts.map +1 -0
- package/dist/persistence/FilePersistence.js +312 -0
- package/dist/persistence/FilePersistence.js.map +1 -0
- package/dist/persistence/FileSnapshotTypes.d.ts +29 -0
- package/dist/persistence/FileSnapshotTypes.d.ts.map +1 -0
- package/dist/persistence/FileSnapshotTypes.js +1 -0
- package/dist/persistence/FileSnapshotV2.d.ts +377 -0
- package/dist/persistence/FileSnapshotV2.d.ts.map +1 -0
- package/dist/persistence/FileSnapshotV2.js +124 -0
- package/dist/persistence/FileSnapshotV2.js.map +1 -0
- package/dist/persistence/FileSnapshotValidation.d.ts +15 -0
- package/dist/persistence/FileSnapshotValidation.d.ts.map +1 -0
- package/dist/persistence/FileSnapshotValidation.js +64 -0
- package/dist/persistence/FileSnapshotValidation.js.map +1 -0
- package/dist/persistence/FileWriter.d.ts +30 -0
- package/dist/persistence/FileWriter.d.ts.map +1 -0
- package/dist/persistence/FileWriter.js +155 -0
- package/dist/persistence/FileWriter.js.map +1 -0
- package/dist/persistence/MemoryPersistence.d.ts +45 -0
- package/dist/persistence/MemoryPersistence.d.ts.map +1 -0
- package/dist/persistence/MemoryPersistence.js +180 -0
- package/dist/persistence/MemoryPersistence.js.map +1 -0
- package/dist/persistence/PersistenceCodec.d.ts +7 -0
- package/dist/persistence/PersistenceCodec.d.ts.map +1 -0
- package/dist/persistence/PersistenceCodec.js +97 -0
- package/dist/persistence/PersistenceCodec.js.map +1 -0
- package/dist/persistence/PersistenceErrors.d.ts +23 -0
- package/dist/persistence/PersistenceErrors.d.ts.map +1 -0
- package/dist/persistence/PersistenceErrors.js +26 -0
- package/dist/persistence/PersistenceErrors.js.map +1 -0
- package/dist/persistence/PersistenceFactory.d.ts +21 -0
- package/dist/persistence/PersistenceFactory.d.ts.map +1 -0
- package/dist/persistence/PersistenceFactory.js +28 -0
- package/dist/persistence/PersistenceFactory.js.map +1 -0
- package/dist/persistence/PersistenceScope.d.ts +42 -0
- package/dist/persistence/PersistenceScope.d.ts.map +1 -0
- package/dist/persistence/PersistenceScope.js +93 -0
- package/dist/persistence/PersistenceScope.js.map +1 -0
- package/dist/persistence/SessionScopedPersistence.d.ts +4 -0
- package/dist/persistence/SessionScopedPersistence.d.ts.map +1 -0
- package/dist/persistence/SessionScopedPersistence.js +9 -0
- package/dist/persistence/SessionScopedPersistence.js.map +1 -0
- package/dist/persistence/SqliteDriver.d.ts +22 -0
- package/dist/persistence/SqliteDriver.d.ts.map +1 -0
- package/dist/persistence/SqliteDriver.js +29 -0
- package/dist/persistence/SqliteDriver.js.map +1 -0
- package/dist/persistence/SqliteLegacyImport.d.ts +14 -0
- package/dist/persistence/SqliteLegacyImport.d.ts.map +1 -0
- package/dist/persistence/SqliteLegacyImport.js +136 -0
- package/dist/persistence/SqliteLegacyImport.js.map +1 -0
- package/dist/persistence/SqliteLegacySchema.d.ts +15 -0
- package/dist/persistence/SqliteLegacySchema.d.ts.map +1 -0
- package/dist/persistence/SqliteLegacySchema.js +72 -0
- package/dist/persistence/SqliteLegacySchema.js.map +1 -0
- package/dist/persistence/SqlitePayload.d.ts +11 -0
- package/dist/persistence/SqlitePayload.d.ts.map +1 -0
- package/dist/persistence/SqlitePayload.js +86 -0
- package/dist/persistence/SqlitePayload.js.map +1 -0
- package/dist/persistence/SqlitePersistence.d.ts +49 -0
- package/dist/persistence/SqlitePersistence.d.ts.map +1 -0
- package/dist/persistence/SqlitePersistence.js +248 -0
- package/dist/persistence/SqlitePersistence.js.map +1 -0
- package/dist/persistence/SqliteSchemaV2.d.ts +14 -0
- package/dist/persistence/SqliteSchemaV2.d.ts.map +1 -0
- package/dist/persistence/SqliteSchemaV2.js +129 -0
- package/dist/persistence/SqliteSchemaV2.js.map +1 -0
- package/dist/persistence/SqliteSnapshotWriter.d.ts +17 -0
- package/dist/persistence/SqliteSnapshotWriter.d.ts.map +1 -0
- package/dist/persistence/SqliteSnapshotWriter.js +30 -0
- package/dist/persistence/SqliteSnapshotWriter.js.map +1 -0
- package/dist/pool/ConnectionPool.d.ts +203 -0
- package/dist/pool/ConnectionPool.d.ts.map +1 -0
- package/dist/pool/ConnectionPool.js +303 -0
- package/dist/pool/ConnectionPool.js.map +1 -0
- package/dist/pool/IConnectionPool.d.ts +143 -0
- package/dist/pool/IConnectionPool.d.ts.map +1 -0
- package/dist/pool/IConnectionPool.js +1 -0
- package/dist/pool/PoolErrors.d.ts +11 -0
- package/dist/pool/PoolErrors.d.ts.map +1 -0
- package/dist/pool/PoolErrors.js +16 -0
- package/dist/pool/PoolErrors.js.map +1 -0
- package/dist/registry/BaseRegistry.d.ts +219 -0
- package/dist/registry/BaseRegistry.d.ts.map +1 -0
- package/dist/registry/BaseRegistry.js +215 -0
- package/dist/registry/BaseRegistry.js.map +1 -0
- package/dist/registry/SkillRegistry.d.ts +67 -0
- package/dist/registry/SkillRegistry.d.ts.map +1 -0
- package/dist/registry/SkillRegistry.js +87 -0
- package/dist/registry/SkillRegistry.js.map +1 -0
- package/dist/registry/ToolRegistry.d.ts +70 -0
- package/dist/registry/ToolRegistry.d.ts.map +1 -0
- package/dist/registry/ToolRegistry.js +96 -0
- package/dist/registry/ToolRegistry.js.map +1 -0
- package/dist/sanitize.d.ts +164 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +100 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/schema.d.ts +562 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +251 -0
- package/dist/schema.js.map +1 -0
- package/dist/transport/BaseTransport.d.ts +166 -0
- package/dist/transport/BaseTransport.d.ts.map +1 -0
- package/dist/transport/BaseTransport.js +199 -0
- package/dist/transport/BaseTransport.js.map +1 -0
- package/dist/transport/HttpHelpers.d.ts +53 -0
- package/dist/transport/HttpHelpers.d.ts.map +1 -0
- package/dist/transport/HttpHelpers.js +44 -0
- package/dist/transport/HttpHelpers.js.map +1 -0
- package/dist/transport/HttpRequestLifecycle.d.ts +37 -0
- package/dist/transport/HttpRequestLifecycle.d.ts.map +1 -0
- package/dist/transport/HttpRequestLifecycle.js +87 -0
- package/dist/transport/HttpRequestLifecycle.js.map +1 -0
- package/dist/transport/HttpTransport.d.ts +140 -0
- package/dist/transport/HttpTransport.d.ts.map +1 -0
- package/dist/transport/HttpTransport.js +245 -0
- package/dist/transport/HttpTransport.js.map +1 -0
- package/dist/transport/SseTransport.d.ts +149 -0
- package/dist/transport/SseTransport.d.ts.map +1 -0
- package/dist/transport/SseTransport.js +470 -0
- package/dist/transport/SseTransport.js.map +1 -0
- package/dist/transport/StreamableHttpTransport.d.ts +225 -0
- package/dist/transport/StreamableHttpTransport.d.ts.map +1 -0
- package/dist/transport/StreamableHttpTransport.js +449 -0
- package/dist/transport/StreamableHttpTransport.js.map +1 -0
- package/dist/types/disposable.d.ts +22 -0
- package/dist/types/disposable.d.ts.map +1 -0
- package/dist/types/disposable.js +1 -0
- package/dist/types/server-config.d.ts +32 -0
- package/dist/types/server-config.d.ts.map +1 -0
- package/dist/types/server-config.js +1 -0
- package/dist/types/skill.d.ts +74 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +1 -0
- package/dist/types/tool.d.ts +78 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +1 -0
- package/dist/utils.d.ts +27 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +6 -0
- package/dist/utils.js.map +1 -0
- package/dist/watchers/SkillWatcher.d.ts +25 -0
- package/dist/watchers/SkillWatcher.d.ts.map +1 -0
- package/dist/watchers/SkillWatcher.js +96 -0
- package/dist/watchers/SkillWatcher.js.map +1 -0
- package/dist/watchers/ToolWatcher.d.ts +24 -0
- package/dist/watchers/ToolWatcher.d.ts.map +1 -0
- package/dist/watchers/ToolWatcher.js +92 -0
- package/dist/watchers/ToolWatcher.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection Pool for managing concurrent user sessions.
|
|
3
|
+
*
|
|
4
|
+
* This module provides session management for multi-user scenarios,
|
|
5
|
+
* allowing multiple concurrent clients to each have isolated state.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const pool = new ConnectionPool({
|
|
10
|
+
* maxSessions: 100,
|
|
11
|
+
* sessionTimeout: 300000 // 5 minutes
|
|
12
|
+
* });
|
|
13
|
+
*
|
|
14
|
+
* const sessionId = await pool.createSession();
|
|
15
|
+
* await pool.process(sessionId, thought);
|
|
16
|
+
* await pool.closeSession(sessionId);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import type { Logger } from '../logger/StructuredLogger.js';
|
|
20
|
+
import { type SessionId } from '../contracts/ids.js';
|
|
21
|
+
import type { ConnectionPoolStats, IConnectionPool, ProcessResult, SessionInfo, SessionRunResult, SessionServer, SessionThoughtInput } from './IConnectionPool.js';
|
|
22
|
+
export interface SessionOptions {
|
|
23
|
+
/**
|
|
24
|
+
* Maximum number of concurrent sessions
|
|
25
|
+
* @default 100
|
|
26
|
+
*/
|
|
27
|
+
maxSessions?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Logger instance
|
|
30
|
+
*/
|
|
31
|
+
logger?: Logger;
|
|
32
|
+
serverFactory?: () => Promise<SessionServer>;
|
|
33
|
+
/**
|
|
34
|
+
* Session timeout in milliseconds
|
|
35
|
+
* @default 300000 (5 minutes)
|
|
36
|
+
*/
|
|
37
|
+
sessionTimeout?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Whether to enable automatic session cleanup
|
|
40
|
+
* @default true
|
|
41
|
+
*/
|
|
42
|
+
autoCleanup?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Cleanup interval in milliseconds
|
|
45
|
+
* @default 60000 (1 minute)
|
|
46
|
+
*/
|
|
47
|
+
cleanupInterval?: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Represents a user session with its own server instance.
|
|
51
|
+
*/
|
|
52
|
+
export declare class Session {
|
|
53
|
+
private _server;
|
|
54
|
+
private _id;
|
|
55
|
+
private _createdAt;
|
|
56
|
+
private _lastActivityAt;
|
|
57
|
+
private _isActiveValue;
|
|
58
|
+
private _timeout;
|
|
59
|
+
private _cleanupTimer;
|
|
60
|
+
private _logger;
|
|
61
|
+
private _closePromise;
|
|
62
|
+
private _activeOperationCount;
|
|
63
|
+
private _operationDrain;
|
|
64
|
+
constructor(id: SessionId, server: SessionServer, timeout: number, logger: Logger);
|
|
65
|
+
/**
|
|
66
|
+
* Check if the session is active.
|
|
67
|
+
*/
|
|
68
|
+
get isActive(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Process a thought through this session's server instance.
|
|
71
|
+
*/
|
|
72
|
+
process(input: SessionThoughtInput): Promise<ProcessResult>;
|
|
73
|
+
processAdmitted(input: SessionThoughtInput): Promise<ProcessResult>;
|
|
74
|
+
runWhileActive<T>(operation: (session: Session) => Promise<T>): Promise<SessionRunResult<T>>;
|
|
75
|
+
/**
|
|
76
|
+
* Get session information.
|
|
77
|
+
*/
|
|
78
|
+
getInfo(): SessionInfo;
|
|
79
|
+
/**
|
|
80
|
+
* Check if the session has timed out.
|
|
81
|
+
*/
|
|
82
|
+
isTimedOut(): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Close the session and stop the server.
|
|
85
|
+
*/
|
|
86
|
+
close(): Promise<void>;
|
|
87
|
+
private _stopServer;
|
|
88
|
+
/**
|
|
89
|
+
* Start the session timeout timer.
|
|
90
|
+
*/
|
|
91
|
+
private _startTimeout;
|
|
92
|
+
/**
|
|
93
|
+
* Reset the timeout timer after activity.
|
|
94
|
+
*/
|
|
95
|
+
private _resetTimeout;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* ConnectionPool manages multiple concurrent user sessions.
|
|
99
|
+
*
|
|
100
|
+
* Each session has its own server instance with isolated state,
|
|
101
|
+
* allowing multiple users to interact with the system simultaneously.
|
|
102
|
+
*/
|
|
103
|
+
export declare class ConnectionPool implements IConnectionPool {
|
|
104
|
+
private _sessions;
|
|
105
|
+
private readonly _closingSessions;
|
|
106
|
+
private _createSessionLock;
|
|
107
|
+
private _maxSessions;
|
|
108
|
+
private _sessionTimeout;
|
|
109
|
+
private _autoCleanup;
|
|
110
|
+
private _cleanupInterval;
|
|
111
|
+
private _cleanupTimerId;
|
|
112
|
+
private _terminated;
|
|
113
|
+
private _logger;
|
|
114
|
+
private _serverFactory;
|
|
115
|
+
private _terminatePromise;
|
|
116
|
+
private readonly _admissionContext;
|
|
117
|
+
private readonly _pendingCreateStopFailures;
|
|
118
|
+
constructor(options?: SessionOptions);
|
|
119
|
+
/**
|
|
120
|
+
* Create a no-op logger when none is provided.
|
|
121
|
+
*/
|
|
122
|
+
private _createNoopLogger;
|
|
123
|
+
/**
|
|
124
|
+
* Create a new session.
|
|
125
|
+
*
|
|
126
|
+
* @returns The session ID
|
|
127
|
+
* @throws Error if max sessions reached
|
|
128
|
+
*/
|
|
129
|
+
createSession(): Promise<SessionId>;
|
|
130
|
+
/**
|
|
131
|
+
* Process a thought in the specified session.
|
|
132
|
+
*
|
|
133
|
+
* @param sessionId - The session ID
|
|
134
|
+
* @param input - The thought data to process
|
|
135
|
+
* @returns Promise with the processing result
|
|
136
|
+
* @throws Error if session not found
|
|
137
|
+
*/
|
|
138
|
+
process(sessionId: SessionId, input: SessionThoughtInput): Promise<ProcessResult>;
|
|
139
|
+
runWithSession<T>(sessionId: SessionId, operation: (session: SessionServer) => Promise<T>): Promise<SessionRunResult<T>>;
|
|
140
|
+
private _runWithSession;
|
|
141
|
+
/**
|
|
142
|
+
* Close a session and release resources.
|
|
143
|
+
*
|
|
144
|
+
* @param sessionId - The session ID to close
|
|
145
|
+
* @throws Error if session not found
|
|
146
|
+
*/
|
|
147
|
+
closeSession(sessionId: SessionId): Promise<void>;
|
|
148
|
+
/**
|
|
149
|
+
* Get information about a session.
|
|
150
|
+
*
|
|
151
|
+
* @param sessionId - The session ID
|
|
152
|
+
* @returns Session info or undefined if not found
|
|
153
|
+
*/
|
|
154
|
+
getSessionInfo(sessionId: SessionId): SessionInfo | undefined;
|
|
155
|
+
/**
|
|
156
|
+
* Get all active sessions.
|
|
157
|
+
*
|
|
158
|
+
* @returns Array of session information
|
|
159
|
+
*/
|
|
160
|
+
getActiveSessions(): SessionInfo[];
|
|
161
|
+
/**
|
|
162
|
+
* Get connection pool statistics.
|
|
163
|
+
*/
|
|
164
|
+
getStats(): ConnectionPoolStats;
|
|
165
|
+
/**
|
|
166
|
+
* Start the automatic cleanup timer.
|
|
167
|
+
*/
|
|
168
|
+
private _startCleanup;
|
|
169
|
+
/**
|
|
170
|
+
* Remove timed-out sessions.
|
|
171
|
+
*/
|
|
172
|
+
private _cleanupTimedOutSessions;
|
|
173
|
+
/**
|
|
174
|
+
* Close all sessions and stop the cleanup timer.
|
|
175
|
+
*/
|
|
176
|
+
terminate(): Promise<void>;
|
|
177
|
+
/**
|
|
178
|
+
* Dispose of the connection pool, releasing all resources.
|
|
179
|
+
* Implements the IDisposable interface.
|
|
180
|
+
* Delegates to terminate() for backward compatibility.
|
|
181
|
+
*/
|
|
182
|
+
dispose(): Promise<void>;
|
|
183
|
+
/**
|
|
184
|
+
* Check if the connection pool is active.
|
|
185
|
+
*/
|
|
186
|
+
isRunning(): boolean;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Create a connection pool with the given options.
|
|
190
|
+
*
|
|
191
|
+
* @param options - Connection pool configuration
|
|
192
|
+
* @returns A configured connection pool
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* ```typescript
|
|
196
|
+
* const pool = createConnectionPool({
|
|
197
|
+
* maxSessions: 50,
|
|
198
|
+
* sessionTimeout: 300000
|
|
199
|
+
* });
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
export declare function createConnectionPool(options?: SessionOptions): ConnectionPool;
|
|
203
|
+
//# sourceMappingURL=ConnectionPool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionPool.d.ts","sourceRoot":"","sources":["../../src/pool/ConnectionPool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { MaxSessionsReachedError, PoolTerminatedError } from "../errors.js";
|
|
3
|
+
import { asSessionId } from "../contracts/ids.js";
|
|
4
|
+
import { assertNever } from "../utils.js";
|
|
5
|
+
import { SessionNotActiveError, SessionNotFoundError } from "./PoolErrors.js";
|
|
6
|
+
class Session {
|
|
7
|
+
_server;
|
|
8
|
+
_id;
|
|
9
|
+
_createdAt;
|
|
10
|
+
_lastActivityAt;
|
|
11
|
+
_isActiveValue;
|
|
12
|
+
_timeout;
|
|
13
|
+
_cleanupTimer = null;
|
|
14
|
+
_logger;
|
|
15
|
+
_closePromise = null;
|
|
16
|
+
_activeOperationCount = 0;
|
|
17
|
+
_operationDrain = null;
|
|
18
|
+
constructor(id, server, timeout, logger){
|
|
19
|
+
this._server = server;
|
|
20
|
+
this._id = id;
|
|
21
|
+
this._createdAt = Date.now();
|
|
22
|
+
this._lastActivityAt = this._createdAt;
|
|
23
|
+
this._isActiveValue = true;
|
|
24
|
+
this._timeout = timeout;
|
|
25
|
+
this._logger = logger;
|
|
26
|
+
this._startTimeout();
|
|
27
|
+
}
|
|
28
|
+
get isActive() {
|
|
29
|
+
return this._isActiveValue;
|
|
30
|
+
}
|
|
31
|
+
async process(input) {
|
|
32
|
+
if (!this.isActive) throw new SessionNotActiveError(this._id);
|
|
33
|
+
this._lastActivityAt = Date.now();
|
|
34
|
+
this._resetTimeout();
|
|
35
|
+
return this._server.processThought(input);
|
|
36
|
+
}
|
|
37
|
+
processAdmitted(input) {
|
|
38
|
+
this._lastActivityAt = Date.now();
|
|
39
|
+
if (this.isActive) this._resetTimeout();
|
|
40
|
+
return this._server.processThought(input);
|
|
41
|
+
}
|
|
42
|
+
runWhileActive(operation) {
|
|
43
|
+
if (!this.isActive) return Promise.resolve({
|
|
44
|
+
status: 'inactive'
|
|
45
|
+
});
|
|
46
|
+
this._activeOperationCount++;
|
|
47
|
+
return (async ()=>{
|
|
48
|
+
try {
|
|
49
|
+
return {
|
|
50
|
+
status: 'completed',
|
|
51
|
+
value: await operation(this)
|
|
52
|
+
};
|
|
53
|
+
} finally{
|
|
54
|
+
this._activeOperationCount--;
|
|
55
|
+
if (0 === this._activeOperationCount) this._operationDrain?.resolve();
|
|
56
|
+
}
|
|
57
|
+
})();
|
|
58
|
+
}
|
|
59
|
+
getInfo() {
|
|
60
|
+
return {
|
|
61
|
+
id: this._id,
|
|
62
|
+
server: this._server,
|
|
63
|
+
createdAt: this._createdAt,
|
|
64
|
+
lastActivityAt: this._lastActivityAt,
|
|
65
|
+
isActive: this.isActive
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
isTimedOut() {
|
|
69
|
+
return Date.now() - this._lastActivityAt > this._timeout;
|
|
70
|
+
}
|
|
71
|
+
close() {
|
|
72
|
+
if (this._closePromise) return this._closePromise;
|
|
73
|
+
const completion = Promise.withResolvers();
|
|
74
|
+
this._closePromise = completion.promise;
|
|
75
|
+
this._isActiveValue = false;
|
|
76
|
+
if (this._cleanupTimer) {
|
|
77
|
+
clearTimeout(this._cleanupTimer);
|
|
78
|
+
this._cleanupTimer = null;
|
|
79
|
+
}
|
|
80
|
+
if (0 === this._activeOperationCount) this._stopServer(completion);
|
|
81
|
+
else {
|
|
82
|
+
this._operationDrain = Promise.withResolvers();
|
|
83
|
+
this._operationDrain.promise.then(()=>this._stopServer(completion));
|
|
84
|
+
}
|
|
85
|
+
return completion.promise;
|
|
86
|
+
}
|
|
87
|
+
_stopServer(completion) {
|
|
88
|
+
try {
|
|
89
|
+
Promise.resolve(this._server.stop()).then(completion.resolve, completion.reject);
|
|
90
|
+
} catch (error) {
|
|
91
|
+
completion.reject(error instanceof Error ? error : new AggregateError([
|
|
92
|
+
error
|
|
93
|
+
], 'Session stop failed'));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
_startTimeout() {
|
|
97
|
+
if (this._cleanupTimer) clearTimeout(this._cleanupTimer);
|
|
98
|
+
this._cleanupTimer = setTimeout(()=>{
|
|
99
|
+
if (this.isTimedOut()) {
|
|
100
|
+
this._logger.warn(`Session ${this._id} timed out, closing`);
|
|
101
|
+
this.close().catch((err)=>{
|
|
102
|
+
this._logger.error(`Error closing timed out session ${this._id}:`, err);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}, this._timeout);
|
|
106
|
+
}
|
|
107
|
+
_resetTimeout() {
|
|
108
|
+
this._startTimeout();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
class ConnectionPool {
|
|
112
|
+
_sessions = new Map();
|
|
113
|
+
_closingSessions = new Map();
|
|
114
|
+
_createSessionLock = null;
|
|
115
|
+
_maxSessions;
|
|
116
|
+
_sessionTimeout;
|
|
117
|
+
_autoCleanup;
|
|
118
|
+
_cleanupInterval;
|
|
119
|
+
_cleanupTimerId = null;
|
|
120
|
+
_terminated = false;
|
|
121
|
+
_logger;
|
|
122
|
+
_serverFactory;
|
|
123
|
+
_terminatePromise = null;
|
|
124
|
+
_admissionContext = new AsyncLocalStorage();
|
|
125
|
+
_pendingCreateStopFailures = new Set();
|
|
126
|
+
constructor(options = {}){
|
|
127
|
+
this._maxSessions = options.maxSessions ?? 100;
|
|
128
|
+
this._sessionTimeout = options.sessionTimeout ?? 300000;
|
|
129
|
+
this._autoCleanup = options.autoCleanup ?? true;
|
|
130
|
+
this._cleanupInterval = options.cleanupInterval ?? 60000;
|
|
131
|
+
this._serverFactory = options.serverFactory ?? null;
|
|
132
|
+
this._logger = options.logger ?? this._createNoopLogger();
|
|
133
|
+
if (this._autoCleanup) this._startCleanup();
|
|
134
|
+
}
|
|
135
|
+
_createNoopLogger() {
|
|
136
|
+
return {
|
|
137
|
+
info: ()=>{},
|
|
138
|
+
warn: ()=>{},
|
|
139
|
+
error: ()=>{},
|
|
140
|
+
debug: ()=>{},
|
|
141
|
+
setLevel: ()=>{},
|
|
142
|
+
getLevel: ()=>'info'
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
async createSession() {
|
|
146
|
+
while(this._createSessionLock)await this._createSessionLock;
|
|
147
|
+
if (this._terminated) throw new PoolTerminatedError();
|
|
148
|
+
if (this._sessions.size >= this._maxSessions) throw new MaxSessionsReachedError(this._maxSessions);
|
|
149
|
+
if (!this._serverFactory) throw new Error('ConnectionPool requires a serverFactory option to create sessions');
|
|
150
|
+
let resolveLock;
|
|
151
|
+
this._createSessionLock = new Promise((resolve)=>{
|
|
152
|
+
resolveLock = resolve;
|
|
153
|
+
});
|
|
154
|
+
try {
|
|
155
|
+
const sessionId = asSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`);
|
|
156
|
+
const server = await this._serverFactory();
|
|
157
|
+
if (this._terminated) {
|
|
158
|
+
try {
|
|
159
|
+
await server.stop();
|
|
160
|
+
} catch (error) {
|
|
161
|
+
this._pendingCreateStopFailures.add(error);
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
throw new PoolTerminatedError();
|
|
165
|
+
}
|
|
166
|
+
const session = new Session(sessionId, server, this._sessionTimeout, this._logger);
|
|
167
|
+
this._sessions.set(sessionId, session);
|
|
168
|
+
this._logger.info(`Created session ${sessionId} (${this._sessions.size}/${this._maxSessions} active sessions)`);
|
|
169
|
+
return sessionId;
|
|
170
|
+
} finally{
|
|
171
|
+
resolveLock();
|
|
172
|
+
this._createSessionLock = null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async process(sessionId, input) {
|
|
176
|
+
const result = await this._runWithSession(sessionId, (session)=>session.processAdmitted(input));
|
|
177
|
+
switch(result.status){
|
|
178
|
+
case 'completed':
|
|
179
|
+
return result.value;
|
|
180
|
+
case 'inactive':
|
|
181
|
+
throw new SessionNotActiveError(sessionId);
|
|
182
|
+
case 'missing':
|
|
183
|
+
throw new SessionNotFoundError(sessionId);
|
|
184
|
+
default:
|
|
185
|
+
return assertNever(result);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
runWithSession(sessionId, operation) {
|
|
189
|
+
return this._runWithSession(sessionId, (session)=>operation(session.getInfo().server));
|
|
190
|
+
}
|
|
191
|
+
_runWithSession(sessionId, operation) {
|
|
192
|
+
const activeFrame = this._admissionContext.getStore();
|
|
193
|
+
if (activeFrame?.open === true && activeFrame.sessionId === sessionId) return (async ()=>({
|
|
194
|
+
status: 'completed',
|
|
195
|
+
value: await operation(activeFrame.session)
|
|
196
|
+
}))();
|
|
197
|
+
const session = this._sessions.get(sessionId);
|
|
198
|
+
if (!session) return Promise.resolve(this._closingSessions.has(sessionId) ? {
|
|
199
|
+
status: 'inactive'
|
|
200
|
+
} : {
|
|
201
|
+
status: 'missing'
|
|
202
|
+
});
|
|
203
|
+
return session.runWhileActive((capturedSession)=>{
|
|
204
|
+
const frame = {
|
|
205
|
+
sessionId,
|
|
206
|
+
session: capturedSession,
|
|
207
|
+
open: true
|
|
208
|
+
};
|
|
209
|
+
return this._admissionContext.run(frame, async ()=>{
|
|
210
|
+
try {
|
|
211
|
+
return await operation(capturedSession);
|
|
212
|
+
} finally{
|
|
213
|
+
frame.open = false;
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
closeSession(sessionId) {
|
|
219
|
+
const closing = this._closingSessions.get(sessionId);
|
|
220
|
+
if (closing) return closing;
|
|
221
|
+
const session = this._sessions.get(sessionId);
|
|
222
|
+
if (!session) return Promise.reject(new SessionNotFoundError(sessionId));
|
|
223
|
+
this._sessions.delete(sessionId);
|
|
224
|
+
const closePromise = session.close();
|
|
225
|
+
this._closingSessions.set(sessionId, closePromise);
|
|
226
|
+
closePromise.then(()=>{
|
|
227
|
+
this._closingSessions.delete(sessionId);
|
|
228
|
+
this._logger.info(`Closed session ${sessionId} (${this._sessions.size}/${this._maxSessions} active sessions)`);
|
|
229
|
+
}, ()=>{
|
|
230
|
+
this._closingSessions.delete(sessionId);
|
|
231
|
+
});
|
|
232
|
+
return closePromise;
|
|
233
|
+
}
|
|
234
|
+
getSessionInfo(sessionId) {
|
|
235
|
+
return this._sessions.get(sessionId)?.getInfo();
|
|
236
|
+
}
|
|
237
|
+
getActiveSessions() {
|
|
238
|
+
return Array.from(this._sessions.values()).filter((s)=>s.isActive).map((s)=>s.getInfo());
|
|
239
|
+
}
|
|
240
|
+
getStats() {
|
|
241
|
+
const activeSessions = this.getActiveSessions();
|
|
242
|
+
return {
|
|
243
|
+
totalSessions: this._sessions.size,
|
|
244
|
+
activeSessions: activeSessions.length,
|
|
245
|
+
maxSessions: this._maxSessions,
|
|
246
|
+
cleanupEnabled: this._autoCleanup,
|
|
247
|
+
sessionTimeout: this._sessionTimeout
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
_startCleanup() {
|
|
251
|
+
if (null !== this._cleanupTimerId) clearInterval(this._cleanupTimerId);
|
|
252
|
+
this._cleanupTimerId = setInterval(()=>{
|
|
253
|
+
this._cleanupTimedOutSessions();
|
|
254
|
+
}, this._cleanupInterval);
|
|
255
|
+
}
|
|
256
|
+
_cleanupTimedOutSessions() {
|
|
257
|
+
let cleaned = 0;
|
|
258
|
+
for (const [sessionId, session] of this._sessions.entries())if (session.isTimedOut()) {
|
|
259
|
+
this.closeSession(sessionId).catch((err)=>{
|
|
260
|
+
this._logger.error(`Error closing timed out session ${sessionId}:`, err);
|
|
261
|
+
});
|
|
262
|
+
cleaned++;
|
|
263
|
+
}
|
|
264
|
+
if (cleaned > 0) this._logger.info(`Cleaned ${cleaned} timed-out sessions (${this._sessions.size}/${this._maxSessions} active sessions)`);
|
|
265
|
+
}
|
|
266
|
+
terminate() {
|
|
267
|
+
if (this._terminatePromise) return this._terminatePromise;
|
|
268
|
+
const completion = Promise.withResolvers();
|
|
269
|
+
this._terminatePromise = completion.promise;
|
|
270
|
+
this._terminated = true;
|
|
271
|
+
if (null !== this._cleanupTimerId) {
|
|
272
|
+
clearInterval(this._cleanupTimerId);
|
|
273
|
+
this._cleanupTimerId = null;
|
|
274
|
+
}
|
|
275
|
+
const sessions = Array.from(this._sessions.values());
|
|
276
|
+
this._sessions.clear();
|
|
277
|
+
const closePromises = new Set(this._closingSessions.values());
|
|
278
|
+
if (this._createSessionLock) closePromises.add(this._createSessionLock);
|
|
279
|
+
for (const session of sessions)closePromises.add(session.close());
|
|
280
|
+
Promise.allSettled(closePromises).then((outcomes)=>{
|
|
281
|
+
const failures = [
|
|
282
|
+
...this._pendingCreateStopFailures,
|
|
283
|
+
...outcomes.filter((outcome)=>'rejected' === outcome.status).map((outcome)=>outcome.reason)
|
|
284
|
+
];
|
|
285
|
+
if (failures.length > 0) return void completion.reject(new AggregateError(failures, 'ConnectionPool termination failed'));
|
|
286
|
+
this._logger.info('ConnectionPool terminated');
|
|
287
|
+
completion.resolve();
|
|
288
|
+
});
|
|
289
|
+
return completion.promise;
|
|
290
|
+
}
|
|
291
|
+
dispose() {
|
|
292
|
+
return this.terminate();
|
|
293
|
+
}
|
|
294
|
+
isRunning() {
|
|
295
|
+
return !this._terminated;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
function createConnectionPool(options) {
|
|
299
|
+
return new ConnectionPool(options);
|
|
300
|
+
}
|
|
301
|
+
export { ConnectionPool, Session, createConnectionPool };
|
|
302
|
+
|
|
303
|
+
//# sourceMappingURL=ConnectionPool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool/ConnectionPool.js","sources":["../../src/pool/ConnectionPool.ts"],"sourcesContent":["/**\n * Connection Pool for managing concurrent user sessions.\n *\n * This module provides session management for multi-user scenarios,\n * allowing multiple concurrent clients to each have isolated state.\n *\n * @example\n * ```typescript\n * const pool = new ConnectionPool({\n * maxSessions: 100,\n * sessionTimeout: 300000 // 5 minutes\n * });\n *\n * const sessionId = await pool.createSession();\n * await pool.process(sessionId, thought);\n * await pool.closeSession(sessionId);\n * ```\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n\tMaxSessionsReachedError,\n\tPoolTerminatedError,\n} from '../errors.js';\nimport type { Logger } from '../logger/StructuredLogger.js';\nimport { asSessionId, type SessionId } from '../contracts/ids.js';\nimport { assertNever } from '../utils.js';\nimport { SessionNotActiveError, SessionNotFoundError } from './PoolErrors.js';\nimport type {\n\tConnectionPoolStats,\n\tIConnectionPool,\n\tProcessResult,\n\tSessionInfo,\n\tSessionRunResult,\n\tSessionServer,\n\tSessionThoughtInput,\n} from './IConnectionPool.js';\n\nexport interface SessionOptions {\n\t/**\n\t * Maximum number of concurrent sessions\n\t * @default 100\n\t */\n\tmaxSessions?: number;\n\n\t/**\n\t * Logger instance\n\t */\n\tlogger?: Logger;\n\n\tserverFactory?: () => Promise<SessionServer>;\n\n\t/**\n\t * Session timeout in milliseconds\n\t * @default 300000 (5 minutes)\n\t */\n\tsessionTimeout?: number;\n\n\t/**\n\t * Whether to enable automatic session cleanup\n\t * @default true\n\t */\n\tautoCleanup?: boolean;\n\n\t/**\n\t * Cleanup interval in milliseconds\n\t * @default 60000 (1 minute)\n\t */\n\tcleanupInterval?: number;\n}\n\n/**\n * Represents a user session with its own server instance.\n */\nexport class Session {\n\tprivate _server: SessionServer;\n\tprivate _id: SessionId;\n\tprivate _createdAt: number;\n\tprivate _lastActivityAt: number;\n\tprivate _isActiveValue: boolean;\n\tprivate _timeout: number;\n\tprivate _cleanupTimer: NodeJS.Timeout | null = null;\n\tprivate _logger: Logger;\n\tprivate _closePromise: Promise<void> | null = null;\n\tprivate _activeOperationCount = 0;\n\tprivate _operationDrain: PromiseWithResolvers<void> | null = null;\n\n\tconstructor(id: SessionId, server: SessionServer, timeout: number, logger: Logger) {\n\t\tthis._server = server;\n\t\tthis._id = id;\n\t\tthis._createdAt = Date.now();\n\t\tthis._lastActivityAt = this._createdAt;\n\t\tthis._isActiveValue = true;\n\t\tthis._timeout = timeout;\n\t\tthis._logger = logger;\n\n\t\t// Start session timeout timer\n\t\tthis._startTimeout();\n\t}\n\n\t/**\n\t * Check if the session is active.\n\t */\n\tget isActive(): boolean {\n\t\treturn this._isActiveValue;\n\t}\n\n\t/**\n\t * Process a thought through this session's server instance.\n\t */\n\tasync process(input: SessionThoughtInput): Promise<ProcessResult> {\n\t\tif (!this.isActive) {\n\t\t\tthrow new SessionNotActiveError(this._id);\n\t\t}\n\n\t\t// Update last activity\n\t\tthis._lastActivityAt = Date.now();\n\n\t\t// Reset timeout timer\n\t\tthis._resetTimeout();\n\n\t\t// Process the thought\n\t\treturn this._server.processThought(input);\n\t}\n\n\tprocessAdmitted(input: SessionThoughtInput): Promise<ProcessResult> {\n\t\tthis._lastActivityAt = Date.now();\n\t\tif (this.isActive) this._resetTimeout();\n\t\treturn this._server.processThought(input);\n\t}\n\n\trunWhileActive<T>(operation: (session: Session) => Promise<T>): Promise<SessionRunResult<T>> {\n\t\tif (!this.isActive) return Promise.resolve({ status: 'inactive' });\n\t\tthis._activeOperationCount++;\n\t\treturn (async () => {\n\t\t\ttry {\n\t\t\t\treturn { status: 'completed', value: await operation(this) };\n\t\t\t} finally {\n\t\t\t\tthis._activeOperationCount--;\n\t\t\t\tif (this._activeOperationCount === 0) this._operationDrain?.resolve();\n\t\t\t}\n\t\t})();\n\t}\n\n\t/**\n\t * Get session information.\n\t */\n\tgetInfo(): SessionInfo {\n\t\treturn {\n\t\t\tid: this._id,\n\t\t\tserver: this._server,\n\t\t\tcreatedAt: this._createdAt,\n\t\t\tlastActivityAt: this._lastActivityAt,\n\t\t\tisActive: this.isActive,\n\t\t};\n\t}\n\n\t/**\n\t * Check if the session has timed out.\n\t */\n\tisTimedOut(): boolean {\n\t\treturn Date.now() - this._lastActivityAt > this._timeout;\n\t}\n\n\t/**\n\t * Close the session and stop the server.\n\t */\n\tclose(): Promise<void> {\n\t\tif (this._closePromise) {\n\t\t\treturn this._closePromise;\n\t\t}\n\n\t\tconst completion = Promise.withResolvers<void>();\n\t\tthis._closePromise = completion.promise;\n\t\tthis._isActiveValue = false;\n\n\t\t// Stop timeout timer\n\t\tif (this._cleanupTimer) {\n\t\t\tclearTimeout(this._cleanupTimer);\n\t\t\tthis._cleanupTimer = null;\n\t\t}\n\n\t\tif (this._activeOperationCount === 0) {\n\t\t\tthis._stopServer(completion);\n\t\t} else {\n\t\t\tthis._operationDrain = Promise.withResolvers<void>();\n\t\t\tvoid this._operationDrain.promise.then(() => this._stopServer(completion));\n\t\t}\n\n\t\treturn completion.promise;\n\t}\n\n\tprivate _stopServer(completion: PromiseWithResolvers<void>): void {\n\t\ttry {\n\t\t\tPromise.resolve(this._server.stop()).then(completion.resolve, completion.reject);\n\t\t} catch (error) {\n\t\t\tcompletion.reject(\n\t\t\t\terror instanceof Error ? error : new AggregateError([error], 'Session stop failed')\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Start the session timeout timer.\n\t */\n\tprivate _startTimeout(): void {\n\t\tif (this._cleanupTimer) {\n\t\t\tclearTimeout(this._cleanupTimer);\n\t\t}\n\n\t\tthis._cleanupTimer = setTimeout(() => {\n\t\t\tif (this.isTimedOut()) {\n\t\t\t\tthis._logger.warn(`Session ${this._id} timed out, closing`);\n\t\t\t\tthis.close().catch((err) => {\n\t\t\t\t\tthis._logger.error(`Error closing timed out session ${this._id}:`, err);\n\t\t\t\t});\n\t\t\t}\n\t\t}, this._timeout);\n\t}\n\n\t/**\n\t * Reset the timeout timer after activity.\n\t */\n\tprivate _resetTimeout(): void {\n\t\tthis._startTimeout();\n\t}\n}\n\n/**\n * ConnectionPool manages multiple concurrent user sessions.\n *\n * Each session has its own server instance with isolated state,\n * allowing multiple users to interact with the system simultaneously.\n */\nexport class ConnectionPool implements IConnectionPool {\n\tprivate _sessions: Map<SessionId, Session> = new Map();\n\tprivate readonly _closingSessions = new Map<SessionId, Promise<void>>();\n\tprivate _createSessionLock: Promise<void> | null = null;\n\tprivate _maxSessions: number;\n\tprivate _sessionTimeout: number;\n\tprivate _autoCleanup: boolean;\n\tprivate _cleanupInterval: number;\n\tprivate _cleanupTimerId: ReturnType<typeof setInterval> | null = null;\n\tprivate _terminated: boolean = false;\n\tprivate _logger: Logger;\n\tprivate _serverFactory: (() => Promise<SessionServer>) | null;\n\tprivate _terminatePromise: Promise<void> | null = null;\n\tprivate readonly _admissionContext = new AsyncLocalStorage<{\n\t\treadonly sessionId: SessionId;\n\t\treadonly session: Session;\n\t\topen: boolean;\n\t}>();\n\tprivate readonly _pendingCreateStopFailures = new Set<unknown>();\n\n\tconstructor(options: SessionOptions = {}) {\n\t\tthis._maxSessions = options.maxSessions ?? 100;\n\t\tthis._sessionTimeout = options.sessionTimeout ?? 300000; // 5 minutes\n\t\tthis._autoCleanup = options.autoCleanup ?? true;\n\t\tthis._cleanupInterval = options.cleanupInterval ?? 60000; // 1 minute\n\t\tthis._serverFactory = options.serverFactory ?? null;\n\t\tthis._logger = options.logger ?? this._createNoopLogger();\n\n\t\tif (this._autoCleanup) {\n\t\t\tthis._startCleanup();\n\t\t}\n\t}\n\n\t/**\n\t * Create a no-op logger when none is provided.\n\t */\n\tprivate _createNoopLogger(): Logger {\n\t\treturn {\n\t\t\tinfo: (): void => {},\n\t\t\twarn: (): void => {},\n\t\t\terror: (): void => {},\n\t\t\tdebug: (): void => {},\n\t\t\tsetLevel: (): void => {},\n\t\t\tgetLevel: (): 'info' => 'info',\n\t\t};\n\t}\n\n\t/**\n\t * Create a new session.\n\t *\n\t * @returns The session ID\n\t * @throws Error if max sessions reached\n\t */\n\tasync createSession(): Promise<SessionId> {\n\t\twhile (this._createSessionLock) {\n\t\t\tawait this._createSessionLock;\n\t\t}\n\n\t\tif (this._terminated) {\n\t\t\tthrow new PoolTerminatedError();\n\t\t}\n\n\t\tif (this._sessions.size >= this._maxSessions) {\n\t\t\tthrow new MaxSessionsReachedError(this._maxSessions);\n\t\t}\n\n\t\tif (!this._serverFactory) {\n\t\t\tthrow new Error('ConnectionPool requires a serverFactory option to create sessions');\n\t\t}\n\n\t\tlet resolveLock!: () => void;\n\t\tthis._createSessionLock = new Promise<void>((resolve) => {\n\t\t\tresolveLock = resolve;\n\t\t});\n\n\t\ttry {\n\t\t\t// Generate unique session ID\n\t\t\tconst sessionId = asSessionId(\n\t\t\t\t`session_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`\n\t\t\t);\n\n\t\t\t// Create a new server instance for this session\n\t\t\tconst server = await this._serverFactory();\n\t\t\tif (this._terminated) {\n\t\t\t\ttry {\n\t\t\t\t\tawait server.stop();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis._pendingCreateStopFailures.add(error);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tthrow new PoolTerminatedError();\n\t\t\t}\n\n\t\t\t// Create session\n\t\t\tconst session = new Session(sessionId, server, this._sessionTimeout, this._logger);\n\t\t\tthis._sessions.set(sessionId, session);\n\n\t\t\tthis._logger.info(\n\t\t\t\t`Created session ${sessionId} (${this._sessions.size}/${this._maxSessions} active sessions)`\n\t\t\t);\n\t\t\treturn sessionId;\n\t\t} finally {\n\t\t\tresolveLock();\n\t\t\tthis._createSessionLock = null;\n\t\t}\n\t}\n\n\t/**\n\t * Process a thought in the specified session.\n\t *\n\t * @param sessionId - The session ID\n\t * @param input - The thought data to process\n\t * @returns Promise with the processing result\n\t * @throws Error if session not found\n\t */\n\tasync process(sessionId: SessionId, input: SessionThoughtInput): Promise<ProcessResult> {\n\t\tconst result = await this._runWithSession(sessionId, (session) =>\n\t\t\tsession.processAdmitted(input)\n\t\t);\n\t\tswitch (result.status) {\n\t\t\tcase 'completed':\n\t\t\t\treturn result.value;\n\t\t\tcase 'inactive':\n\t\t\t\tthrow new SessionNotActiveError(sessionId);\n\t\t\tcase 'missing':\n\t\t\t\tthrow new SessionNotFoundError(sessionId);\n\t\t\tdefault:\n\t\t\t\treturn assertNever(result);\n\t\t}\n\t}\n\n\trunWithSession<T>(\n\t\tsessionId: SessionId,\n\t\toperation: (session: SessionServer) => Promise<T>\n\t): Promise<SessionRunResult<T>> {\n\t\treturn this._runWithSession(sessionId, (session) => operation(session.getInfo().server));\n\t}\n\n\tprivate _runWithSession<T>(\n\t\tsessionId: SessionId,\n\t\toperation: (session: Session) => Promise<T>\n\t): Promise<SessionRunResult<T>> {\n\t\tconst activeFrame = this._admissionContext.getStore();\n\t\tif (activeFrame?.open === true && activeFrame.sessionId === sessionId) {\n\t\t\treturn (async () => ({ status: 'completed', value: await operation(activeFrame.session) }))();\n\t\t}\n\n\t\tconst session = this._sessions.get(sessionId);\n\t\tif (!session) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tthis._closingSessions.has(sessionId) ? { status: 'inactive' } : { status: 'missing' }\n\t\t\t);\n\t\t}\n\n\t\treturn session.runWhileActive((capturedSession) => {\n\t\t\tconst frame = { sessionId, session: capturedSession, open: true };\n\t\t\treturn this._admissionContext.run(frame, async () => {\n\t\t\t\ttry {\n\t\t\t\t\treturn await operation(capturedSession);\n\t\t\t\t} finally {\n\t\t\t\t\tframe.open = false;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Close a session and release resources.\n\t *\n\t * @param sessionId - The session ID to close\n\t * @throws Error if session not found\n\t */\n\tcloseSession(sessionId: SessionId): Promise<void> {\n\t\tconst closing = this._closingSessions.get(sessionId);\n\t\tif (closing) {\n\t\t\treturn closing;\n\t\t}\n\n\t\tconst session = this._sessions.get(sessionId);\n\n\t\tif (!session) {\n\t\t\treturn Promise.reject(new SessionNotFoundError(sessionId));\n\t\t}\n\n\t\tthis._sessions.delete(sessionId);\n\t\tconst closePromise = session.close();\n\t\tthis._closingSessions.set(sessionId, closePromise);\n\t\tvoid closePromise.then(\n\t\t\t() => {\n\t\t\t\tthis._closingSessions.delete(sessionId);\n\t\t\t\tthis._logger.info(\n\t\t\t\t\t`Closed session ${sessionId} (${this._sessions.size}/${this._maxSessions} active sessions)`\n\t\t\t\t);\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tthis._closingSessions.delete(sessionId);\n\t\t\t}\n\t\t);\n\t\treturn closePromise;\n\t}\n\n\t/**\n\t * Get information about a session.\n\t *\n\t * @param sessionId - The session ID\n\t * @returns Session info or undefined if not found\n\t */\n\tgetSessionInfo(sessionId: SessionId): SessionInfo | undefined {\n\t\treturn this._sessions.get(sessionId)?.getInfo();\n\t}\n\n\t/**\n\t * Get all active sessions.\n\t *\n\t * @returns Array of session information\n\t */\n\tgetActiveSessions(): SessionInfo[] {\n\t\treturn Array.from(this._sessions.values())\n\t\t\t.filter((s) => s.isActive)\n\t\t\t.map((s) => s.getInfo());\n\t}\n\n\t/**\n\t * Get connection pool statistics.\n\t */\n\tgetStats(): ConnectionPoolStats {\n\t\tconst activeSessions = this.getActiveSessions();\n\n\t\treturn {\n\t\t\ttotalSessions: this._sessions.size,\n\t\t\tactiveSessions: activeSessions.length,\n\t\t\tmaxSessions: this._maxSessions,\n\t\t\tcleanupEnabled: this._autoCleanup,\n\t\t\tsessionTimeout: this._sessionTimeout,\n\t\t};\n\t}\n\n\t/**\n\t * Start the automatic cleanup timer.\n\t */\n\tprivate _startCleanup(): void {\n\t\tif (this._cleanupTimerId !== null) {\n\t\t\tclearInterval(this._cleanupTimerId);\n\t\t}\n\n\t\tthis._cleanupTimerId = setInterval(() => {\n\t\t\tthis._cleanupTimedOutSessions();\n\t\t}, this._cleanupInterval);\n\t}\n\n\t/**\n\t * Remove timed-out sessions.\n\t */\n\tprivate _cleanupTimedOutSessions(): void {\n\t\tlet cleaned = 0;\n\n\t\tfor (const [sessionId, session] of this._sessions.entries()) {\n\t\t\tif (session.isTimedOut()) {\n\t\t\t\tthis.closeSession(sessionId).catch((err) => {\n\t\t\t\t\tthis._logger.error(`Error closing timed out session ${sessionId}:`, err);\n\t\t\t\t});\n\t\t\t\tcleaned++;\n\t\t\t}\n\t\t}\n\n\t\tif (cleaned > 0) {\n\t\t\tthis._logger.info(\n\t\t\t\t`Cleaned ${cleaned} timed-out sessions (${this._sessions.size}/${this._maxSessions} active sessions)`\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Close all sessions and stop the cleanup timer.\n\t */\n\tterminate(): Promise<void> {\n\t\tif (this._terminatePromise) {\n\t\t\treturn this._terminatePromise;\n\t\t}\n\n\t\tconst completion = Promise.withResolvers<void>();\n\t\tthis._terminatePromise = completion.promise;\n\t\tthis._terminated = true;\n\n\t\t// Stop cleanup timer\n\t\tif (this._cleanupTimerId !== null) {\n\t\t\tclearInterval(this._cleanupTimerId);\n\t\t\tthis._cleanupTimerId = null;\n\t\t}\n\n\t\tconst sessions = Array.from(this._sessions.values());\n\t\tthis._sessions.clear();\n\t\tconst closePromises = new Set<Promise<void>>(this._closingSessions.values());\n\t\tif (this._createSessionLock) {\n\t\t\tclosePromises.add(this._createSessionLock);\n\t\t}\n\t\tfor (const session of sessions) {\n\t\t\tclosePromises.add(session.close());\n\t\t}\n\n\t\tvoid Promise.allSettled(closePromises).then((outcomes) => {\n\t\t\tconst failures = [\n\t\t\t\t...this._pendingCreateStopFailures,\n\t\t\t\t...outcomes\n\t\t\t\t\t.filter((outcome): outcome is PromiseRejectedResult => outcome.status === 'rejected')\n\t\t\t\t\t.map((outcome) => outcome.reason),\n\t\t\t];\n\t\t\tif (failures.length > 0) {\n\t\t\t\tcompletion.reject(new AggregateError(failures, 'ConnectionPool termination failed'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._logger.info('ConnectionPool terminated');\n\t\t\tcompletion.resolve();\n\t\t});\n\n\t\treturn completion.promise;\n\t}\n\n\t/**\n\t * Dispose of the connection pool, releasing all resources.\n\t * Implements the IDisposable interface.\n\t * Delegates to terminate() for backward compatibility.\n\t */\n\tdispose(): Promise<void> {\n\t\treturn this.terminate();\n\t}\n\n\t/**\n\t * Check if the connection pool is active.\n\t */\n\tisRunning(): boolean {\n\t\treturn !this._terminated;\n\t}\n}\n\n/**\n * Create a connection pool with the given options.\n *\n * @param options - Connection pool configuration\n * @returns A configured connection pool\n *\n * @example\n * ```typescript\n * const pool = createConnectionPool({\n * maxSessions: 50,\n * sessionTimeout: 300000\n * });\n * ```\n */\nexport function createConnectionPool(options?: SessionOptions): ConnectionPool {\n\treturn new ConnectionPool(options);\n}\n"],"names":["Session","id","server","timeout","logger","Date","input","SessionNotActiveError","operation","Promise","completion","clearTimeout","error","Error","AggregateError","setTimeout","err","ConnectionPool","Map","AsyncLocalStorage","Set","options","PoolTerminatedError","MaxSessionsReachedError","resolveLock","resolve","sessionId","asSessionId","Math","session","result","SessionNotFoundError","assertNever","activeFrame","capturedSession","frame","closing","closePromise","Array","s","activeSessions","clearInterval","setInterval","cleaned","sessions","closePromises","outcomes","failures","outcome","createConnectionPool"],"mappings":"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"}
|