@juspay/neurolink 9.32.0 → 9.32.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/auth/anthropicOAuth.js +1 -1
- package/dist/cli/commands/proxy.js +18 -5
- package/dist/client/aiSdkAdapter.js +1 -1
- package/dist/client/index.js +137 -501
- package/dist/core/factory.js +0 -1
- package/dist/core/redisConversationMemoryManager.js +1 -1
- package/dist/features/ppt/slideGenerator.js +0 -1
- package/dist/features/ppt/utils.js +0 -1
- package/dist/lib/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/mcp/elicitationProtocol.js +1 -1
- package/dist/mcp/servers/agent/directToolsServer.js +0 -1
- package/dist/providers/azureOpenai.js +1 -1
- package/dist/providers/huggingFace.js +0 -1
- package/dist/providers/openaiCompatible.js +0 -1
- package/dist/sdk/toolRegistration.js +0 -1
- package/dist/server/openapi/generator.js +1 -1
- package/dist/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/types/configTypes.js +0 -5
- package/dist/types/modelTypes.js +0 -1
- package/dist/types/tools.js +0 -1
- package/dist/types/typeAliases.js +0 -1
- package/dist/types/utilities.js +1 -1
- package/dist/types/workflowTypes.js +0 -1
- package/dist/utils/providerRetry.js +0 -1
- package/dist/utils/providerUtils.js +0 -1
- package/package.json +2 -2
- package/dist/client/adapters/providerImageAdapter.js +0 -588
- package/dist/client/adapters/tts/googleTTSHandler.js +0 -344
- package/dist/client/adapters/video/directorPipeline.js +0 -516
- package/dist/client/adapters/video/ffmpegAdapter.js +0 -206
- package/dist/client/adapters/video/frameExtractor.js +0 -143
- package/dist/client/adapters/video/vertexVideoHandler.js +0 -763
- package/dist/client/adapters/video/videoAnalyzer.js +0 -238
- package/dist/client/adapters/video/videoMerger.js +0 -171
- package/dist/client/agent/directTools.js +0 -840
- package/dist/client/auth/AuthProviderFactory.js +0 -111
- package/dist/client/auth/AuthProviderRegistry.js +0 -190
- package/dist/client/auth/RequestContext.js +0 -78
- package/dist/client/auth/accountPool.js +0 -178
- package/dist/client/auth/anthropicOAuth.js +0 -974
- package/dist/client/auth/authContext.js +0 -314
- package/dist/client/auth/errors.js +0 -39
- package/dist/client/auth/index.js +0 -61
- package/dist/client/auth/middleware/AuthMiddleware.js +0 -519
- package/dist/client/auth/middleware/rateLimitByUser.js +0 -554
- package/dist/client/auth/providers/BaseAuthProvider.js +0 -723
- package/dist/client/auth/providers/CognitoProvider.js +0 -304
- package/dist/client/auth/providers/KeycloakProvider.js +0 -393
- package/dist/client/auth/providers/auth0.js +0 -274
- package/dist/client/auth/providers/betterAuth.js +0 -182
- package/dist/client/auth/providers/clerk.js +0 -317
- package/dist/client/auth/providers/custom.js +0 -112
- package/dist/client/auth/providers/firebase.js +0 -226
- package/dist/client/auth/providers/jwt.js +0 -212
- package/dist/client/auth/providers/oauth2.js +0 -303
- package/dist/client/auth/providers/supabase.js +0 -259
- package/dist/client/auth/providers/workos.js +0 -284
- package/dist/client/auth/serverBridge.js +0 -25
- package/dist/client/auth/sessionManager.js +0 -437
- package/dist/client/auth/tokenStore.js +0 -799
- package/dist/client/client/aiSdkAdapter.js +0 -487
- package/dist/client/client/auth.js +0 -473
- package/dist/client/client/errors.js +0 -552
- package/dist/client/client/httpClient.js +0 -837
- package/dist/client/client/index.js +0 -172
- package/dist/client/client/interceptors.js +0 -601
- package/dist/client/client/sseClient.js +0 -545
- package/dist/client/client/streamingClient.js +0 -917
- package/dist/client/client/wsClient.js +0 -369
- package/dist/client/config/configManager.js +0 -303
- package/dist/client/config/conversationMemory.js +0 -86
- package/dist/client/config/taskClassificationConfig.js +0 -148
- package/dist/client/constants/contextWindows.js +0 -295
- package/dist/client/constants/enums.js +0 -853
- package/dist/client/constants/index.js +0 -207
- package/dist/client/constants/performance.js +0 -389
- package/dist/client/constants/retry.js +0 -266
- package/dist/client/constants/timeouts.js +0 -182
- package/dist/client/constants/tokens.js +0 -380
- package/dist/client/constants/videoErrors.js +0 -46
- package/dist/client/context/budgetChecker.js +0 -98
- package/dist/client/context/contextCompactor.js +0 -205
- package/dist/client/context/emergencyTruncation.js +0 -88
- package/dist/client/context/errorDetection.js +0 -171
- package/dist/client/context/errors.js +0 -21
- package/dist/client/context/fileTokenBudget.js +0 -127
- package/dist/client/context/prompts/summarizationPrompt.js +0 -117
- package/dist/client/context/stages/fileReadDeduplicator.js +0 -66
- package/dist/client/context/stages/slidingWindowTruncator.js +0 -190
- package/dist/client/context/stages/structuredSummarizer.js +0 -99
- package/dist/client/context/stages/toolOutputPruner.js +0 -52
- package/dist/client/context/summarizationEngine.js +0 -136
- package/dist/client/context/toolOutputLimits.js +0 -78
- package/dist/client/context/toolPairRepair.js +0 -66
- package/dist/client/core/analytics.js +0 -88
- package/dist/client/core/baseProvider.js +0 -1385
- package/dist/client/core/constants.js +0 -140
- package/dist/client/core/conversationMemoryFactory.js +0 -141
- package/dist/client/core/conversationMemoryInitializer.js +0 -128
- package/dist/client/core/conversationMemoryManager.js +0 -344
- package/dist/client/core/dynamicModels.js +0 -358
- package/dist/client/core/evaluation.js +0 -309
- package/dist/client/core/evaluationProviders.js +0 -248
- package/dist/client/core/factory.js +0 -412
- package/dist/client/core/infrastructure/baseError.js +0 -22
- package/dist/client/core/infrastructure/baseFactory.js +0 -54
- package/dist/client/core/infrastructure/baseRegistry.js +0 -53
- package/dist/client/core/infrastructure/index.js +0 -5
- package/dist/client/core/infrastructure/retry.js +0 -20
- package/dist/client/core/infrastructure/typedEventEmitter.js +0 -23
- package/dist/client/core/modelConfiguration.js +0 -851
- package/dist/client/core/modules/GenerationHandler.js +0 -588
- package/dist/client/core/modules/MessageBuilder.js +0 -273
- package/dist/client/core/modules/StreamHandler.js +0 -185
- package/dist/client/core/modules/TelemetryHandler.js +0 -203
- package/dist/client/core/modules/ToolsManager.js +0 -499
- package/dist/client/core/modules/Utilities.js +0 -331
- package/dist/client/core/redisConversationMemoryManager.js +0 -1435
- package/dist/client/core/streamAnalytics.js +0 -131
- package/dist/client/evaluation/contextBuilder.js +0 -134
- package/dist/client/evaluation/index.js +0 -61
- package/dist/client/evaluation/prompts.js +0 -73
- package/dist/client/evaluation/ragasEvaluator.js +0 -110
- package/dist/client/evaluation/retryManager.js +0 -78
- package/dist/client/evaluation/scoring.js +0 -61
- package/dist/client/factories/providerFactory.js +0 -166
- package/dist/client/factories/providerRegistry.js +0 -166
- package/dist/client/features/ppt/constants.js +0 -896
- package/dist/client/features/ppt/contentPlanner.js +0 -529
- package/dist/client/features/ppt/presentationOrchestrator.js +0 -236
- package/dist/client/features/ppt/slideGenerator.js +0 -532
- package/dist/client/features/ppt/slideRenderers.js +0 -2383
- package/dist/client/features/ppt/slideTypeInference.js +0 -405
- package/dist/client/features/ppt/types.js +0 -13
- package/dist/client/features/ppt/utils.js +0 -443
- package/dist/client/files/fileReferenceRegistry.js +0 -1543
- package/dist/client/files/fileTools.js +0 -450
- package/dist/client/files/streamingReader.js +0 -321
- package/dist/client/files/types.js +0 -23
- package/dist/client/hitl/hitlErrors.js +0 -54
- package/dist/client/hitl/hitlManager.js +0 -460
- package/dist/client/mcp/agentExposure.js +0 -356
- package/dist/client/mcp/auth/index.js +0 -11
- package/dist/client/mcp/auth/oauthClientProvider.js +0 -325
- package/dist/client/mcp/auth/tokenStorage.js +0 -134
- package/dist/client/mcp/batching/index.js +0 -10
- package/dist/client/mcp/batching/requestBatcher.js +0 -441
- package/dist/client/mcp/caching/index.js +0 -10
- package/dist/client/mcp/caching/toolCache.js +0 -433
- package/dist/client/mcp/elicitation/elicitationManager.js +0 -376
- package/dist/client/mcp/elicitation/index.js +0 -11
- package/dist/client/mcp/elicitation/types.js +0 -10
- package/dist/client/mcp/elicitationProtocol.js +0 -375
- package/dist/client/mcp/enhancedToolDiscovery.js +0 -481
- package/dist/client/mcp/externalServerManager.js +0 -1478
- package/dist/client/mcp/factory.js +0 -161
- package/dist/client/mcp/flexibleToolValidator.js +0 -161
- package/dist/client/mcp/httpRateLimiter.js +0 -391
- package/dist/client/mcp/httpRetryHandler.js +0 -178
- package/dist/client/mcp/index.js +0 -74
- package/dist/client/mcp/mcpCircuitBreaker.js +0 -427
- package/dist/client/mcp/mcpClientFactory.js +0 -708
- package/dist/client/mcp/mcpRegistryClient.js +0 -488
- package/dist/client/mcp/mcpServerBase.js +0 -373
- package/dist/client/mcp/multiServerManager.js +0 -579
- package/dist/client/mcp/registry.js +0 -158
- package/dist/client/mcp/routing/index.js +0 -10
- package/dist/client/mcp/routing/toolRouter.js +0 -416
- package/dist/client/mcp/serverCapabilities.js +0 -502
- package/dist/client/mcp/servers/agent/directToolsServer.js +0 -150
- package/dist/client/mcp/toolAnnotations.js +0 -239
- package/dist/client/mcp/toolConverter.js +0 -258
- package/dist/client/mcp/toolDiscoveryService.js +0 -798
- package/dist/client/mcp/toolIntegration.js +0 -334
- package/dist/client/mcp/toolRegistry.js +0 -729
- package/dist/client/memory/hippocampusInitializer.js +0 -19
- package/dist/client/memory/memoryRetrievalTools.js +0 -166
- package/dist/client/middleware/builtin/analytics.js +0 -132
- package/dist/client/middleware/builtin/autoEvaluation.js +0 -203
- package/dist/client/middleware/builtin/guardrails.js +0 -109
- package/dist/client/middleware/builtin/lifecycle.js +0 -168
- package/dist/client/middleware/factory.js +0 -327
- package/dist/client/middleware/registry.js +0 -295
- package/dist/client/middleware/utils/guardrailsUtils.js +0 -396
- package/dist/client/models/anthropicModels.js +0 -527
- package/dist/client/neurolink.js +0 -8233
- package/dist/client/observability/exporterRegistry.js +0 -413
- package/dist/client/observability/exporters/arizeExporter.js +0 -138
- package/dist/client/observability/exporters/baseExporter.js +0 -190
- package/dist/client/observability/exporters/braintrustExporter.js +0 -154
- package/dist/client/observability/exporters/datadogExporter.js +0 -196
- package/dist/client/observability/exporters/laminarExporter.js +0 -302
- package/dist/client/observability/exporters/langfuseExporter.js +0 -209
- package/dist/client/observability/exporters/langsmithExporter.js +0 -143
- package/dist/client/observability/exporters/otelExporter.js +0 -164
- package/dist/client/observability/exporters/posthogExporter.js +0 -287
- package/dist/client/observability/exporters/sentryExporter.js +0 -165
- package/dist/client/observability/index.js +0 -31
- package/dist/client/observability/metricsAggregator.js +0 -556
- package/dist/client/observability/otelBridge.js +0 -131
- package/dist/client/observability/retryPolicy.js +0 -383
- package/dist/client/observability/sampling/samplers.js +0 -216
- package/dist/client/observability/spanProcessor.js +0 -303
- package/dist/client/observability/tokenTracker.js +0 -413
- package/dist/client/observability/types/exporterTypes.js +0 -5
- package/dist/client/observability/types/index.js +0 -4
- package/dist/client/observability/types/spanTypes.js +0 -92
- package/dist/client/observability/utils/safeMetadata.js +0 -25
- package/dist/client/observability/utils/spanSerializer.js +0 -292
- package/dist/client/processors/archive/ArchiveProcessor.js +0 -1308
- package/dist/client/processors/base/BaseFileProcessor.js +0 -614
- package/dist/client/processors/base/types.js +0 -82
- package/dist/client/processors/config/fileTypes.js +0 -520
- package/dist/client/processors/config/index.js +0 -92
- package/dist/client/processors/config/languageMap.js +0 -410
- package/dist/client/processors/config/mimeTypes.js +0 -363
- package/dist/client/processors/config/sizeLimits.js +0 -258
- package/dist/client/processors/document/ExcelProcessor.js +0 -590
- package/dist/client/processors/document/OpenDocumentProcessor.js +0 -212
- package/dist/client/processors/document/PptxProcessor.js +0 -157
- package/dist/client/processors/document/RtfProcessor.js +0 -361
- package/dist/client/processors/document/WordProcessor.js +0 -353
- package/dist/client/processors/errors/FileErrorCode.js +0 -255
- package/dist/client/processors/errors/errorHelpers.js +0 -386
- package/dist/client/processors/errors/errorSerializer.js +0 -507
- package/dist/client/processors/errors/index.js +0 -49
- package/dist/client/processors/markup/SvgProcessor.js +0 -240
- package/dist/client/processors/media/AudioProcessor.js +0 -707
- package/dist/client/processors/media/VideoProcessor.js +0 -1045
- package/dist/client/providers/amazonBedrock.js +0 -1512
- package/dist/client/providers/amazonSagemaker.js +0 -162
- package/dist/client/providers/anthropic.js +0 -831
- package/dist/client/providers/azureOpenai.js +0 -143
- package/dist/client/providers/googleAiStudio.js +0 -1200
- package/dist/client/providers/googleNativeGemini3.js +0 -543
- package/dist/client/providers/googleVertex.js +0 -2936
- package/dist/client/providers/huggingFace.js +0 -315
- package/dist/client/providers/litellm.js +0 -488
- package/dist/client/providers/mistral.js +0 -157
- package/dist/client/providers/ollama.js +0 -1579
- package/dist/client/providers/openAI.js +0 -627
- package/dist/client/providers/openRouter.js +0 -543
- package/dist/client/providers/openaiCompatible.js +0 -290
- package/dist/client/providers/providerTypeUtils.js +0 -46
- package/dist/client/providers/sagemaker/adaptive-semaphore.js +0 -215
- package/dist/client/providers/sagemaker/client.js +0 -472
- package/dist/client/providers/sagemaker/config.js +0 -317
- package/dist/client/providers/sagemaker/detection.js +0 -606
- package/dist/client/providers/sagemaker/error-constants.js +0 -227
- package/dist/client/providers/sagemaker/errors.js +0 -299
- package/dist/client/providers/sagemaker/language-model.js +0 -775
- package/dist/client/providers/sagemaker/parsers.js +0 -634
- package/dist/client/providers/sagemaker/streaming.js +0 -331
- package/dist/client/providers/sagemaker/structured-parser.js +0 -625
- package/dist/client/proxy/accountQuota.js +0 -162
- package/dist/client/proxy/claudeFormat.js +0 -595
- package/dist/client/proxy/modelRouter.js +0 -29
- package/dist/client/proxy/oauthFetch.js +0 -367
- package/dist/client/proxy/proxyFetch.js +0 -586
- package/dist/client/proxy/requestLogger.js +0 -207
- package/dist/client/proxy/tokenRefresh.js +0 -124
- package/dist/client/proxy/usageStats.js +0 -74
- package/dist/client/proxy/utils/noProxyUtils.js +0 -149
- package/dist/client/rag/ChunkerFactory.js +0 -320
- package/dist/client/rag/ChunkerRegistry.js +0 -421
- package/dist/client/rag/chunkers/BaseChunker.js +0 -143
- package/dist/client/rag/chunkers/CharacterChunker.js +0 -28
- package/dist/client/rag/chunkers/HTMLChunker.js +0 -38
- package/dist/client/rag/chunkers/JSONChunker.js +0 -68
- package/dist/client/rag/chunkers/LaTeXChunker.js +0 -63
- package/dist/client/rag/chunkers/MarkdownChunker.js +0 -306
- package/dist/client/rag/chunkers/RecursiveChunker.js +0 -139
- package/dist/client/rag/chunkers/SemanticMarkdownChunker.js +0 -138
- package/dist/client/rag/chunkers/SentenceChunker.js +0 -66
- package/dist/client/rag/chunkers/TokenChunker.js +0 -61
- package/dist/client/rag/chunkers/index.js +0 -15
- package/dist/client/rag/chunking/characterChunker.js +0 -142
- package/dist/client/rag/chunking/chunkerRegistry.js +0 -194
- package/dist/client/rag/chunking/htmlChunker.js +0 -247
- package/dist/client/rag/chunking/index.js +0 -17
- package/dist/client/rag/chunking/jsonChunker.js +0 -281
- package/dist/client/rag/chunking/latexChunker.js +0 -251
- package/dist/client/rag/chunking/markdownChunker.js +0 -373
- package/dist/client/rag/chunking/recursiveChunker.js +0 -148
- package/dist/client/rag/chunking/semanticChunker.js +0 -306
- package/dist/client/rag/chunking/sentenceChunker.js +0 -230
- package/dist/client/rag/chunking/tokenChunker.js +0 -183
- package/dist/client/rag/document/MDocument.js +0 -392
- package/dist/client/rag/document/index.js +0 -5
- package/dist/client/rag/document/loaders.js +0 -500
- package/dist/client/rag/errors/RAGError.js +0 -274
- package/dist/client/rag/errors/index.js +0 -6
- package/dist/client/rag/graphRag/graphRAG.js +0 -401
- package/dist/client/rag/graphRag/index.js +0 -4
- package/dist/client/rag/index.js +0 -141
- package/dist/client/rag/metadata/MetadataExtractorFactory.js +0 -418
- package/dist/client/rag/metadata/MetadataExtractorRegistry.js +0 -362
- package/dist/client/rag/metadata/index.js +0 -9
- package/dist/client/rag/metadata/metadataExtractor.js +0 -280
- package/dist/client/rag/pipeline/RAGPipeline.js +0 -436
- package/dist/client/rag/pipeline/contextAssembly.js +0 -341
- package/dist/client/rag/pipeline/index.js +0 -5
- package/dist/client/rag/ragIntegration.js +0 -321
- package/dist/client/rag/reranker/RerankerFactory.js +0 -430
- package/dist/client/rag/reranker/RerankerRegistry.js +0 -402
- package/dist/client/rag/reranker/index.js +0 -9
- package/dist/client/rag/reranker/reranker.js +0 -277
- package/dist/client/rag/resilience/CircuitBreaker.js +0 -431
- package/dist/client/rag/resilience/RetryHandler.js +0 -304
- package/dist/client/rag/resilience/index.js +0 -7
- package/dist/client/rag/retrieval/hybridSearch.js +0 -335
- package/dist/client/rag/retrieval/index.js +0 -5
- package/dist/client/rag/retrieval/vectorQueryTool.js +0 -307
- package/dist/client/rag/types.js +0 -8
- package/dist/client/sdk/toolRegistration.js +0 -377
- package/dist/client/server/abstract/baseServerAdapter.js +0 -575
- package/dist/client/server/adapters/expressAdapter.js +0 -486
- package/dist/client/server/adapters/fastifyAdapter.js +0 -472
- package/dist/client/server/adapters/honoAdapter.js +0 -632
- package/dist/client/server/adapters/koaAdapter.js +0 -510
- package/dist/client/server/errors.js +0 -486
- package/dist/client/server/factory/serverAdapterFactory.js +0 -160
- package/dist/client/server/index.js +0 -108
- package/dist/client/server/middleware/abortSignal.js +0 -111
- package/dist/client/server/middleware/auth.js +0 -388
- package/dist/client/server/middleware/cache.js +0 -359
- package/dist/client/server/middleware/common.js +0 -281
- package/dist/client/server/middleware/deprecation.js +0 -190
- package/dist/client/server/middleware/mcpBodyAttachment.js +0 -63
- package/dist/client/server/middleware/rateLimit.js +0 -227
- package/dist/client/server/middleware/validation.js +0 -388
- package/dist/client/server/openapi/generator.js +0 -398
- package/dist/client/server/openapi/index.js +0 -36
- package/dist/client/server/openapi/schemas.js +0 -695
- package/dist/client/server/openapi/templates.js +0 -374
- package/dist/client/server/routes/agentRoutes.js +0 -189
- package/dist/client/server/routes/claudeProxyRoutes.js +0 -1600
- package/dist/client/server/routes/healthRoutes.js +0 -187
- package/dist/client/server/routes/index.js +0 -57
- package/dist/client/server/routes/mcpRoutes.js +0 -342
- package/dist/client/server/routes/memoryRoutes.js +0 -350
- package/dist/client/server/routes/openApiRoutes.js +0 -126
- package/dist/client/server/routes/toolRoutes.js +0 -199
- package/dist/client/server/streaming/dataStream.js +0 -486
- package/dist/client/server/streaming/index.js +0 -11
- package/dist/client/server/types.js +0 -67
- package/dist/client/server/utils/redaction.js +0 -334
- package/dist/client/server/utils/validation.js +0 -243
- package/dist/client/server/websocket/WebSocketHandler.js +0 -383
- package/dist/client/server/websocket/index.js +0 -4
- package/dist/client/services/server/ai/observability/instrumentation.js +0 -808
- package/dist/client/telemetry/attributes.js +0 -100
- package/dist/client/telemetry/index.js +0 -26
- package/dist/client/telemetry/telemetryService.js +0 -308
- package/dist/client/telemetry/tracers.js +0 -17
- package/dist/client/telemetry/withSpan.js +0 -34
- package/dist/client/types/actionTypes.js +0 -6
- package/dist/client/types/analytics.js +0 -5
- package/dist/client/types/authTypes.js +0 -9
- package/dist/client/types/circuitBreakerErrors.js +0 -34
- package/dist/client/types/cli.js +0 -21
- package/dist/client/types/clientTypes.js +0 -10
- package/dist/client/types/common.js +0 -51
- package/dist/client/types/configTypes.js +0 -49
- package/dist/client/types/content.js +0 -19
- package/dist/client/types/contextTypes.js +0 -400
- package/dist/client/types/conversation.js +0 -47
- package/dist/client/types/conversationMemoryInterface.js +0 -6
- package/dist/client/types/domainTypes.js +0 -5
- package/dist/client/types/errors.js +0 -167
- package/dist/client/types/evaluation.js +0 -5
- package/dist/client/types/evaluationProviders.js +0 -5
- package/dist/client/types/evaluationTypes.js +0 -1
- package/dist/client/types/externalMcp.js +0 -6
- package/dist/client/types/fileReferenceTypes.js +0 -8
- package/dist/client/types/fileTypes.js +0 -4
- package/dist/client/types/generateTypes.js +0 -1
- package/dist/client/types/guardrails.js +0 -1
- package/dist/client/types/hitlTypes.js +0 -8
- package/dist/client/types/index.js +0 -57
- package/dist/client/types/mcpTypes.js +0 -5
- package/dist/client/types/middlewareTypes.js +0 -1
- package/dist/client/types/modelTypes.js +0 -30
- package/dist/client/types/multimodal.js +0 -135
- package/dist/client/types/observability.js +0 -6
- package/dist/client/types/pptTypes.js +0 -82
- package/dist/client/types/providers.js +0 -111
- package/dist/client/types/proxyTypes.js +0 -16
- package/dist/client/types/ragTypes.js +0 -7
- package/dist/client/types/sdkTypes.js +0 -8
- package/dist/client/types/serviceTypes.js +0 -5
- package/dist/client/types/streamTypes.js +0 -1
- package/dist/client/types/subscriptionTypes.js +0 -9
- package/dist/client/types/taskClassificationTypes.js +0 -5
- package/dist/client/types/tools.js +0 -24
- package/dist/client/types/ttsTypes.js +0 -57
- package/dist/client/types/typeAliases.js +0 -48
- package/dist/client/types/utilities.js +0 -4
- package/dist/client/types/workflowTypes.js +0 -30
- package/dist/client/utils/async/withTimeout.js +0 -98
- package/dist/client/utils/asyncMutex.js +0 -60
- package/dist/client/utils/conversationMemory.js +0 -431
- package/dist/client/utils/csvProcessor.js +0 -846
- package/dist/client/utils/errorHandling.js +0 -936
- package/dist/client/utils/evaluationUtils.js +0 -131
- package/dist/client/utils/factoryProcessing.js +0 -589
- package/dist/client/utils/fileDetector.js +0 -2161
- package/dist/client/utils/imageCache.js +0 -376
- package/dist/client/utils/imageProcessor.js +0 -704
- package/dist/client/utils/logger.js +0 -491
- package/dist/client/utils/mcpDefaults.js +0 -134
- package/dist/client/utils/messageBuilder.js +0 -1653
- package/dist/client/utils/modelAliasResolver.js +0 -54
- package/dist/client/utils/modelDetection.js +0 -80
- package/dist/client/utils/modelRouter.js +0 -292
- package/dist/client/utils/multimodalOptionsBuilder.js +0 -65
- package/dist/client/utils/observabilityHelpers.js +0 -47
- package/dist/client/utils/parameterValidation.js +0 -966
- package/dist/client/utils/pdfProcessor.js +0 -410
- package/dist/client/utils/performance.js +0 -222
- package/dist/client/utils/pricing.js +0 -340
- package/dist/client/utils/promptRedaction.js +0 -62
- package/dist/client/utils/providerConfig.js +0 -1009
- package/dist/client/utils/providerHealth.js +0 -1237
- package/dist/client/utils/providerRetry.js +0 -112
- package/dist/client/utils/providerUtils.js +0 -434
- package/dist/client/utils/rateLimiter.js +0 -200
- package/dist/client/utils/redis.js +0 -368
- package/dist/client/utils/retryHandler.js +0 -269
- package/dist/client/utils/retryability.js +0 -22
- package/dist/client/utils/sanitizers/svg.js +0 -481
- package/dist/client/utils/schemaConversion.js +0 -255
- package/dist/client/utils/taskClassificationUtils.js +0 -149
- package/dist/client/utils/taskClassifier.js +0 -94
- package/dist/client/utils/thinkingConfig.js +0 -104
- package/dist/client/utils/timeout.js +0 -359
- package/dist/client/utils/tokenEstimation.js +0 -142
- package/dist/client/utils/tokenLimits.js +0 -125
- package/dist/client/utils/tokenUtils.js +0 -239
- package/dist/client/utils/toolUtils.js +0 -75
- package/dist/client/utils/transformationUtils.js +0 -554
- package/dist/client/utils/ttsProcessor.js +0 -286
- package/dist/client/utils/typeUtils.js +0 -97
- package/dist/client/utils/videoAnalysisProcessor.js +0 -67
- package/dist/client/workflow/config.js +0 -398
- package/dist/client/workflow/core/ensembleExecutor.js +0 -407
- package/dist/client/workflow/core/judgeScorer.js +0 -544
- package/dist/client/workflow/core/responseConditioner.js +0 -225
- package/dist/client/workflow/core/types/conditionerTypes.js +0 -7
- package/dist/client/workflow/core/types/ensembleTypes.js +0 -7
- package/dist/client/workflow/core/types/index.js +0 -7
- package/dist/client/workflow/core/types/judgeTypes.js +0 -7
- package/dist/client/workflow/core/types/layerTypes.js +0 -7
- package/dist/client/workflow/core/types/registryTypes.js +0 -7
- package/dist/client/workflow/core/workflowRegistry.js +0 -304
- package/dist/client/workflow/core/workflowRunner.js +0 -586
- package/dist/client/workflow/index.js +0 -50
- package/dist/client/workflow/types.js +0 -9
- package/dist/client/workflow/utils/types/index.js +0 -7
- package/dist/client/workflow/utils/workflowMetrics.js +0 -311
- package/dist/client/workflow/utils/workflowValidation.js +0 -420
- package/dist/client/workflow/workflows/adaptiveWorkflow.js +0 -366
- package/dist/client/workflow/workflows/consensusWorkflow.js +0 -192
- package/dist/client/workflow/workflows/fallbackWorkflow.js +0 -225
- package/dist/client/workflow/workflows/multiJudgeWorkflow.js +0 -351
- /package/dist/client/{client/reactHooks.js → reactHooks.js} +0 -0
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Route Deprecation Middleware
|
|
3
|
-
* Adds RFC 8594 deprecation headers to responses for deprecated routes
|
|
4
|
-
*
|
|
5
|
-
* @see https://datatracker.ietf.org/doc/html/rfc8594 - The 'Deprecation' HTTP Header Field
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Build a lookup map of deprecated routes
|
|
9
|
-
* Key format: "METHOD:path" (e.g., "GET:/api/v1/users")
|
|
10
|
-
*/
|
|
11
|
-
function buildDeprecatedRoutesMap(routes) {
|
|
12
|
-
const map = new Map();
|
|
13
|
-
for (const route of routes) {
|
|
14
|
-
if (route.deprecated?.enabled) {
|
|
15
|
-
const key = `${route.method}:${route.path}`;
|
|
16
|
-
map.set(key, {
|
|
17
|
-
method: route.method,
|
|
18
|
-
path: route.path,
|
|
19
|
-
deprecation: route.deprecated,
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return map;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Normalize a path with parameters to match against route patterns
|
|
27
|
-
* Converts "/users/123" to match "/users/:id" pattern
|
|
28
|
-
*/
|
|
29
|
-
function normalizePathForMatching(actualPath, routePatterns) {
|
|
30
|
-
// Try exact match first
|
|
31
|
-
if (routePatterns.includes(actualPath)) {
|
|
32
|
-
return actualPath;
|
|
33
|
-
}
|
|
34
|
-
// Try pattern matching for parameterized routes
|
|
35
|
-
for (const pattern of routePatterns) {
|
|
36
|
-
if (matchesRoutePattern(actualPath, pattern)) {
|
|
37
|
-
return pattern;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Check if an actual path matches a route pattern with parameters
|
|
44
|
-
*/
|
|
45
|
-
function matchesRoutePattern(actualPath, pattern) {
|
|
46
|
-
const patternParts = pattern.split("/");
|
|
47
|
-
const actualParts = actualPath.split("/");
|
|
48
|
-
if (patternParts.length !== actualParts.length) {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
for (let i = 0; i < patternParts.length; i++) {
|
|
52
|
-
const patternPart = patternParts[i];
|
|
53
|
-
const actualPart = actualParts[i];
|
|
54
|
-
// Parameter parts start with ":"
|
|
55
|
-
if (patternPart.startsWith(":")) {
|
|
56
|
-
continue; // Parameter matches any value
|
|
57
|
-
}
|
|
58
|
-
if (patternPart !== actualPart) {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Format a date for the Deprecation header (RFC 7231 HTTP-date format)
|
|
66
|
-
* Example: "Sun, 06 Nov 1994 08:49:37 GMT"
|
|
67
|
-
*/
|
|
68
|
-
function formatHttpDate(date) {
|
|
69
|
-
return date.toUTCString();
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Parse a version string to estimate a sunset date
|
|
73
|
-
* This is a simple heuristic - in production you'd want actual dates
|
|
74
|
-
*/
|
|
75
|
-
function estimateSunsetDate(removeIn) {
|
|
76
|
-
if (!removeIn) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
// Default to 6 months from now if version specified
|
|
80
|
-
const sunsetDate = new Date();
|
|
81
|
-
sunsetDate.setMonth(sunsetDate.getMonth() + 6);
|
|
82
|
-
return sunsetDate;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Create deprecation middleware
|
|
86
|
-
*
|
|
87
|
-
* This middleware adds RFC 8594 compliant deprecation headers to responses
|
|
88
|
-
* for routes marked as deprecated:
|
|
89
|
-
*
|
|
90
|
-
* - `Deprecation`: RFC 8594 header indicating the route is deprecated
|
|
91
|
-
* - `Sunset`: RFC 8594 header indicating when the route will be removed
|
|
92
|
-
* - `Link`: Header pointing to the alternative route (rel="successor-version")
|
|
93
|
-
* - `X-Deprecation-Notice`: Custom header with a human-readable message
|
|
94
|
-
*
|
|
95
|
-
* @example
|
|
96
|
-
* ```typescript
|
|
97
|
-
* const routes: RouteDefinition[] = [
|
|
98
|
-
* {
|
|
99
|
-
* method: "GET",
|
|
100
|
-
* path: "/api/v1/users",
|
|
101
|
-
* handler: handleUsers,
|
|
102
|
-
* deprecated: {
|
|
103
|
-
* enabled: true,
|
|
104
|
-
* since: "2.0.0",
|
|
105
|
-
* removeIn: "3.0.0",
|
|
106
|
-
* alternative: "/api/v2/users",
|
|
107
|
-
* message: "Use /api/v2/users instead",
|
|
108
|
-
* },
|
|
109
|
-
* },
|
|
110
|
-
* ];
|
|
111
|
-
*
|
|
112
|
-
* const deprecationMiddleware = createDeprecationMiddleware({ routes });
|
|
113
|
-
* server.registerMiddleware(deprecationMiddleware);
|
|
114
|
-
* ```
|
|
115
|
-
*/
|
|
116
|
-
export function createDeprecationMiddleware(config) {
|
|
117
|
-
const { routes, noticeHeader = "X-Deprecation-Notice", includeLink = true, } = config;
|
|
118
|
-
// Build lookup map of deprecated routes
|
|
119
|
-
const deprecatedRoutes = buildDeprecatedRoutesMap(routes);
|
|
120
|
-
// Extract route patterns for matching (key format is "METHOD:path")
|
|
121
|
-
// We need to handle paths that may contain ":" for parameters
|
|
122
|
-
const routePatterns = Array.from(deprecatedRoutes.keys()).map((key) => {
|
|
123
|
-
const colonIndex = key.indexOf(":");
|
|
124
|
-
return key.slice(colonIndex + 1);
|
|
125
|
-
});
|
|
126
|
-
return {
|
|
127
|
-
name: "deprecation",
|
|
128
|
-
order: 100, // Run late, after route handling
|
|
129
|
-
handler: async (ctx, next) => {
|
|
130
|
-
// Execute the route handler first
|
|
131
|
-
const result = await next();
|
|
132
|
-
// Check if current route is deprecated
|
|
133
|
-
const matchedPattern = normalizePathForMatching(ctx.path, routePatterns);
|
|
134
|
-
if (!matchedPattern) {
|
|
135
|
-
return result;
|
|
136
|
-
}
|
|
137
|
-
const routeKey = `${ctx.method}:${matchedPattern}`;
|
|
138
|
-
const deprecatedRoute = deprecatedRoutes.get(routeKey);
|
|
139
|
-
if (!deprecatedRoute) {
|
|
140
|
-
return result;
|
|
141
|
-
}
|
|
142
|
-
const { deprecation } = deprecatedRoute;
|
|
143
|
-
// Initialize response headers if not present
|
|
144
|
-
ctx.responseHeaders = ctx.responseHeaders || {};
|
|
145
|
-
// Add RFC 8594 Deprecation header
|
|
146
|
-
// Value is either "true" or an HTTP-date when deprecated
|
|
147
|
-
if (deprecation.since) {
|
|
148
|
-
// Use a date representation if we have version info
|
|
149
|
-
ctx.responseHeaders["Deprecation"] = "true";
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
ctx.responseHeaders["Deprecation"] = "true";
|
|
153
|
-
}
|
|
154
|
-
// Add Sunset header if removeIn is specified
|
|
155
|
-
if (deprecation.removeIn) {
|
|
156
|
-
const sunsetDate = estimateSunsetDate(deprecation.removeIn);
|
|
157
|
-
if (sunsetDate) {
|
|
158
|
-
ctx.responseHeaders["Sunset"] = formatHttpDate(sunsetDate);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
// Add Link header for alternative route
|
|
162
|
-
if (includeLink && deprecation.alternative) {
|
|
163
|
-
// RFC 8594 recommends rel="successor-version" for replacement resources
|
|
164
|
-
ctx.responseHeaders["Link"] =
|
|
165
|
-
`<${deprecation.alternative}>; rel="successor-version"`;
|
|
166
|
-
}
|
|
167
|
-
// Add custom deprecation notice header
|
|
168
|
-
let notice = "This endpoint is deprecated";
|
|
169
|
-
if (deprecation.since) {
|
|
170
|
-
notice += ` since version ${deprecation.since}`;
|
|
171
|
-
}
|
|
172
|
-
if (deprecation.removeIn) {
|
|
173
|
-
notice += ` and will be removed in version ${deprecation.removeIn}`;
|
|
174
|
-
}
|
|
175
|
-
if (deprecation.message) {
|
|
176
|
-
notice = deprecation.message;
|
|
177
|
-
}
|
|
178
|
-
ctx.responseHeaders[noticeHeader] = notice;
|
|
179
|
-
// Store deprecation info in metadata for logging/telemetry
|
|
180
|
-
ctx.metadata.deprecation = {
|
|
181
|
-
route: matchedPattern,
|
|
182
|
-
method: ctx.method,
|
|
183
|
-
since: deprecation.since,
|
|
184
|
-
removeIn: deprecation.removeIn,
|
|
185
|
-
alternative: deprecation.alternative,
|
|
186
|
-
};
|
|
187
|
-
return result;
|
|
188
|
-
},
|
|
189
|
-
};
|
|
190
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Body Attachment Middleware for Fastify
|
|
3
|
-
* Attaches parsed body to raw request for MCP SDK compatibility
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Create MCP body attachment middleware for Fastify.
|
|
7
|
-
* The MCP SDK reads body from request.raw.body, but Fastify
|
|
8
|
-
* parses body separately. This middleware bridges the gap.
|
|
9
|
-
*
|
|
10
|
-
* @returns Middleware that attaches body to raw request
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* // In Fastify adapter
|
|
15
|
-
* const mcpBodyMiddleware = createMCPBodyAttachmentMiddleware();
|
|
16
|
-
* server.registerMiddleware(mcpBodyMiddleware);
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
|
-
export function createMCPBodyAttachmentMiddleware() {
|
|
20
|
-
return {
|
|
21
|
-
name: "mcp-body-attachment",
|
|
22
|
-
order: 10, // After body parsing, before route handlers
|
|
23
|
-
handler: async (ctx, next) => {
|
|
24
|
-
attachBodyToRawRequest(ctx);
|
|
25
|
-
return next();
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Attach parsed body to raw request object.
|
|
31
|
-
* Supports Fastify's request structure.
|
|
32
|
-
*/
|
|
33
|
-
function attachBodyToRawRequest(ctx) {
|
|
34
|
-
const rawRequest = ctx.rawRequest;
|
|
35
|
-
if (!rawRequest) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
// Fastify structure: request.raw is the Node.js IncomingMessage
|
|
39
|
-
if (rawRequest.raw && rawRequest.body !== undefined) {
|
|
40
|
-
rawRequest.raw.body = rawRequest.body;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Fastify-specific preHandler hook.
|
|
45
|
-
* Use this directly with Fastify for optimal integration.
|
|
46
|
-
*
|
|
47
|
-
* This is a lower-level hook that works directly with Fastify
|
|
48
|
-
* request objects rather than the unified ServerContext.
|
|
49
|
-
*
|
|
50
|
-
* @param request - Fastify request object
|
|
51
|
-
* @returns Promise that resolves when body is attached
|
|
52
|
-
*
|
|
53
|
-
* @example
|
|
54
|
-
* ```typescript
|
|
55
|
-
* // In Fastify adapter initialization
|
|
56
|
-
* fastify.addHook('preHandler', fastifyMCPBodyHook);
|
|
57
|
-
* ```
|
|
58
|
-
*/
|
|
59
|
-
export async function fastifyMCPBodyHook(request) {
|
|
60
|
-
if (request.body !== undefined) {
|
|
61
|
-
request.raw.body = request.body;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rate Limiting Middleware
|
|
3
|
-
* Provides configurable rate limiting for server adapters
|
|
4
|
-
*/
|
|
5
|
-
import { RateLimitError as ServerRateLimitError } from "../errors.js";
|
|
6
|
-
/**
|
|
7
|
-
* In-memory rate limit store
|
|
8
|
-
*/
|
|
9
|
-
export class InMemoryRateLimitStore {
|
|
10
|
-
store = new Map();
|
|
11
|
-
cleanupInterval;
|
|
12
|
-
constructor() {
|
|
13
|
-
// Clean up expired entries periodically
|
|
14
|
-
this.cleanupInterval = setInterval(() => this.cleanup(), 60000);
|
|
15
|
-
}
|
|
16
|
-
async get(key) {
|
|
17
|
-
const record = this.store.get(key);
|
|
18
|
-
if (!record) {
|
|
19
|
-
return undefined;
|
|
20
|
-
}
|
|
21
|
-
// Check if expired
|
|
22
|
-
if (Date.now() > record.resetAt) {
|
|
23
|
-
this.store.delete(key);
|
|
24
|
-
return undefined;
|
|
25
|
-
}
|
|
26
|
-
return record;
|
|
27
|
-
}
|
|
28
|
-
async set(key, entry) {
|
|
29
|
-
this.store.set(key, entry);
|
|
30
|
-
}
|
|
31
|
-
async increment(key, windowMs) {
|
|
32
|
-
const now = Date.now();
|
|
33
|
-
let record = this.store.get(key);
|
|
34
|
-
if (!record || now > record.resetAt) {
|
|
35
|
-
record = { count: 0, resetAt: now + windowMs };
|
|
36
|
-
this.store.set(key, record);
|
|
37
|
-
}
|
|
38
|
-
record.count++;
|
|
39
|
-
return { count: record.count, resetAt: record.resetAt };
|
|
40
|
-
}
|
|
41
|
-
async reset(key) {
|
|
42
|
-
this.store.delete(key);
|
|
43
|
-
}
|
|
44
|
-
cleanup() {
|
|
45
|
-
const now = Date.now();
|
|
46
|
-
for (const [key, record] of this.store.entries()) {
|
|
47
|
-
if (now > record.resetAt) {
|
|
48
|
-
this.store.delete(key);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
destroy() {
|
|
53
|
-
if (this.cleanupInterval) {
|
|
54
|
-
clearInterval(this.cleanupInterval);
|
|
55
|
-
}
|
|
56
|
-
this.store.clear();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Create rate limiting middleware
|
|
61
|
-
*
|
|
62
|
-
* Response headers set on all requests:
|
|
63
|
-
* - `X-RateLimit-Limit`: Maximum requests allowed per window
|
|
64
|
-
* - `X-RateLimit-Remaining`: Requests remaining in current window
|
|
65
|
-
* - `X-RateLimit-Reset`: Unix timestamp when the window resets
|
|
66
|
-
*
|
|
67
|
-
* Additional headers on rate limit exceeded (HTTP 429):
|
|
68
|
-
* - `Retry-After`: Seconds to wait before retrying
|
|
69
|
-
*
|
|
70
|
-
* @example
|
|
71
|
-
* ```typescript
|
|
72
|
-
* const rateLimiter = createRateLimitMiddleware({
|
|
73
|
-
* maxRequests: 100,
|
|
74
|
-
* windowMs: 15 * 60 * 1000, // 15 minutes
|
|
75
|
-
* skipPaths: ["/api/health"],
|
|
76
|
-
* });
|
|
77
|
-
*
|
|
78
|
-
* server.registerMiddleware(rateLimiter);
|
|
79
|
-
* ```
|
|
80
|
-
*/
|
|
81
|
-
export function createRateLimitMiddleware(config) {
|
|
82
|
-
const { maxRequests, windowMs, message = "Too many requests, please try again later", skipPaths = [], keyGenerator = defaultKeyGenerator, onRateLimitExceeded, store = new InMemoryRateLimitStore(), } = config;
|
|
83
|
-
return {
|
|
84
|
-
name: "rate-limit",
|
|
85
|
-
order: 5, // Run early
|
|
86
|
-
excludePaths: skipPaths,
|
|
87
|
-
handler: async (ctx, next) => {
|
|
88
|
-
const key = keyGenerator(ctx);
|
|
89
|
-
const { count, resetAt } = await store.increment(key, windowMs);
|
|
90
|
-
// Set rate limit headers in responseHeaders (adapters read from here)
|
|
91
|
-
ctx.responseHeaders = ctx.responseHeaders || {};
|
|
92
|
-
ctx.responseHeaders["X-RateLimit-Limit"] = String(maxRequests);
|
|
93
|
-
ctx.responseHeaders["X-RateLimit-Remaining"] = String(Math.max(0, maxRequests - count));
|
|
94
|
-
ctx.responseHeaders["X-RateLimit-Reset"] = String(Math.ceil(resetAt / 1000));
|
|
95
|
-
if (count > maxRequests) {
|
|
96
|
-
const retryAfter = Math.ceil((resetAt - Date.now()) / 1000);
|
|
97
|
-
// Add Retry-After header for 429 responses
|
|
98
|
-
ctx.responseHeaders["Retry-After"] = String(Math.max(0, retryAfter));
|
|
99
|
-
if (onRateLimitExceeded) {
|
|
100
|
-
return onRateLimitExceeded(ctx, retryAfter);
|
|
101
|
-
}
|
|
102
|
-
// Throw a rate limit error that adapters can catch
|
|
103
|
-
throw new ServerRateLimitError(retryAfter * 1000, message, ctx.requestId);
|
|
104
|
-
}
|
|
105
|
-
return next();
|
|
106
|
-
},
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Default key generator using IP address
|
|
111
|
-
*/
|
|
112
|
-
function defaultKeyGenerator(ctx) {
|
|
113
|
-
return (ctx.headers["x-forwarded-for"]?.split(",")[0].trim() ||
|
|
114
|
-
ctx.headers["x-real-ip"] ||
|
|
115
|
-
"unknown");
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Re-export RateLimitError from errors for convenience
|
|
119
|
-
*/
|
|
120
|
-
export { RateLimitError } from "../errors.js";
|
|
121
|
-
/**
|
|
122
|
-
* Create a sliding window rate limiter
|
|
123
|
-
* More accurate than fixed window but slightly more complex
|
|
124
|
-
*/
|
|
125
|
-
export function createSlidingWindowRateLimitMiddleware(config) {
|
|
126
|
-
const { maxRequests, windowMs, message = "Too many requests, please try again later", skipPaths = [], keyGenerator = defaultKeyGenerator, onRateLimitExceeded, subWindows = 10, } = config;
|
|
127
|
-
// Store: key -> array of timestamps
|
|
128
|
-
const store = new Map();
|
|
129
|
-
const subWindowMs = windowMs / subWindows;
|
|
130
|
-
// Cleanup interval
|
|
131
|
-
setInterval(() => {
|
|
132
|
-
const now = Date.now();
|
|
133
|
-
for (const [key, timestamps] of store.entries()) {
|
|
134
|
-
const valid = timestamps.filter((t) => now - t < windowMs);
|
|
135
|
-
if (valid.length === 0) {
|
|
136
|
-
store.delete(key);
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
store.set(key, valid);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}, subWindowMs);
|
|
143
|
-
return {
|
|
144
|
-
name: "sliding-window-rate-limit",
|
|
145
|
-
order: 5,
|
|
146
|
-
excludePaths: skipPaths,
|
|
147
|
-
handler: async (ctx, next) => {
|
|
148
|
-
const key = keyGenerator(ctx);
|
|
149
|
-
const now = Date.now();
|
|
150
|
-
// Get existing timestamps and filter old ones
|
|
151
|
-
let timestamps = store.get(key) || [];
|
|
152
|
-
timestamps = timestamps.filter((t) => now - t < windowMs);
|
|
153
|
-
// Calculate count
|
|
154
|
-
const count = timestamps.length;
|
|
155
|
-
// Set rate limit headers in responseHeaders (adapters read from here)
|
|
156
|
-
ctx.responseHeaders = ctx.responseHeaders || {};
|
|
157
|
-
ctx.responseHeaders["X-RateLimit-Limit"] = String(maxRequests);
|
|
158
|
-
ctx.responseHeaders["X-RateLimit-Remaining"] = String(Math.max(0, maxRequests - count - 1));
|
|
159
|
-
ctx.responseHeaders["X-RateLimit-Reset"] = String(Math.ceil((now + windowMs) / 1000));
|
|
160
|
-
if (count >= maxRequests) {
|
|
161
|
-
const oldestTimestamp = timestamps[0] || now;
|
|
162
|
-
const retryAfter = Math.ceil((oldestTimestamp + windowMs - now) / 1000);
|
|
163
|
-
// Add Retry-After header for 429 responses
|
|
164
|
-
ctx.responseHeaders["Retry-After"] = String(Math.max(0, retryAfter));
|
|
165
|
-
if (onRateLimitExceeded) {
|
|
166
|
-
return onRateLimitExceeded(ctx, retryAfter);
|
|
167
|
-
}
|
|
168
|
-
throw new ServerRateLimitError(retryAfter * 1000, message, ctx.requestId);
|
|
169
|
-
}
|
|
170
|
-
// Add current request timestamp
|
|
171
|
-
timestamps.push(now);
|
|
172
|
-
store.set(key, timestamps);
|
|
173
|
-
return next();
|
|
174
|
-
},
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
// ============================================
|
|
178
|
-
// Compatibility Aliases
|
|
179
|
-
// ============================================
|
|
180
|
-
/**
|
|
181
|
-
* Alias for InMemoryRateLimitStore for compatibility
|
|
182
|
-
*/
|
|
183
|
-
export { InMemoryRateLimitStore as MemoryRateLimitStore };
|
|
184
|
-
/**
|
|
185
|
-
* Create fixed window rate limit middleware
|
|
186
|
-
*
|
|
187
|
-
* Accepts config and optional store as separate parameters for compatibility.
|
|
188
|
-
* Returns rate limit headers in the response object.
|
|
189
|
-
*
|
|
190
|
-
* @example
|
|
191
|
-
* ```typescript
|
|
192
|
-
* const store = new MemoryRateLimitStore();
|
|
193
|
-
* const middleware = createFixedWindowRateLimitMiddleware(
|
|
194
|
-
* { windowMs: 60000, maxRequests: 10 },
|
|
195
|
-
* store
|
|
196
|
-
* );
|
|
197
|
-
* ```
|
|
198
|
-
*/
|
|
199
|
-
export function createFixedWindowRateLimitMiddleware(config, store) {
|
|
200
|
-
const { maxRequests, windowMs, message = "Too many requests, please try again later", skipPaths = [], keyGenerator = defaultKeyGenerator, onRateLimitExceeded, } = config;
|
|
201
|
-
const rateLimitStore = store ?? new InMemoryRateLimitStore();
|
|
202
|
-
return {
|
|
203
|
-
name: "fixed-window-rate-limit",
|
|
204
|
-
order: 5,
|
|
205
|
-
excludePaths: skipPaths,
|
|
206
|
-
handler: async (ctx, next) => {
|
|
207
|
-
const key = keyGenerator(ctx);
|
|
208
|
-
const { count, resetAt } = await rateLimitStore.increment(key, windowMs);
|
|
209
|
-
// Set rate limit headers in responseHeaders (adapters read from here)
|
|
210
|
-
ctx.responseHeaders = ctx.responseHeaders || {};
|
|
211
|
-
ctx.responseHeaders["X-RateLimit-Limit"] = String(maxRequests);
|
|
212
|
-
ctx.responseHeaders["X-RateLimit-Remaining"] = String(Math.max(0, maxRequests - count));
|
|
213
|
-
ctx.responseHeaders["X-RateLimit-Reset"] = String(Math.ceil(resetAt / 1000));
|
|
214
|
-
if (count > maxRequests) {
|
|
215
|
-
const retryAfter = Math.ceil((resetAt - Date.now()) / 1000);
|
|
216
|
-
// Add Retry-After header for 429 responses
|
|
217
|
-
ctx.responseHeaders["Retry-After"] = String(Math.max(0, retryAfter));
|
|
218
|
-
if (onRateLimitExceeded) {
|
|
219
|
-
return onRateLimitExceeded(ctx, retryAfter);
|
|
220
|
-
}
|
|
221
|
-
throw new ServerRateLimitError(retryAfter * 1000, message, ctx.requestId);
|
|
222
|
-
}
|
|
223
|
-
// Call next handler - headers are already in ctx.responseHeaders for adapters
|
|
224
|
-
return next();
|
|
225
|
-
},
|
|
226
|
-
};
|
|
227
|
-
}
|