@cyanheads/mcp-ts-core 0.1.0-beta.12
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/CLAUDE.md +583 -0
- package/LICENSE +201 -0
- package/README.md +287 -0
- package/biome.json +103 -0
- package/dist/app.d.ts +82 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +222 -0
- package/dist/app.js.map +1 -0
- package/dist/cli/init.d.ts +8 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +161 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/config/index.d.ts +349 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +464 -0
- package/dist/config/index.js.map +1 -0
- package/dist/context.d.ts +119 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +144 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/prompt-registration.d.ts +33 -0
- package/dist/mcp-server/prompts/prompt-registration.d.ts.map +1 -0
- package/dist/mcp-server/prompts/prompt-registration.js +91 -0
- package/dist/mcp-server/prompts/prompt-registration.js.map +1 -0
- package/dist/mcp-server/prompts/utils/newPromptDefinition.d.ts +49 -0
- package/dist/mcp-server/prompts/utils/newPromptDefinition.d.ts.map +1 -0
- package/dist/mcp-server/prompts/utils/newPromptDefinition.js +39 -0
- package/dist/mcp-server/prompts/utils/newPromptDefinition.js.map +1 -0
- package/dist/mcp-server/prompts/utils/promptDefinition.d.ts +37 -0
- package/dist/mcp-server/prompts/utils/promptDefinition.d.ts.map +1 -0
- package/dist/mcp-server/prompts/utils/promptDefinition.js +2 -0
- package/dist/mcp-server/prompts/utils/promptDefinition.js.map +1 -0
- package/dist/mcp-server/resources/resource-registration.d.ts +27 -0
- package/dist/mcp-server/resources/resource-registration.d.ts.map +1 -0
- package/dist/mcp-server/resources/resource-registration.js +85 -0
- package/dist/mcp-server/resources/resource-registration.js.map +1 -0
- package/dist/mcp-server/resources/utils/newResourceDefinition.d.ts +84 -0
- package/dist/mcp-server/resources/utils/newResourceDefinition.d.ts.map +1 -0
- package/dist/mcp-server/resources/utils/newResourceDefinition.js +40 -0
- package/dist/mcp-server/resources/utils/newResourceDefinition.js.map +1 -0
- package/dist/mcp-server/resources/utils/newResourceHandlerFactory.d.ts +32 -0
- package/dist/mcp-server/resources/utils/newResourceHandlerFactory.d.ts.map +1 -0
- package/dist/mcp-server/resources/utils/newResourceHandlerFactory.js +103 -0
- package/dist/mcp-server/resources/utils/newResourceHandlerFactory.js.map +1 -0
- package/dist/mcp-server/resources/utils/resourceDefinition.d.ts +94 -0
- package/dist/mcp-server/resources/utils/resourceDefinition.d.ts.map +1 -0
- package/dist/mcp-server/resources/utils/resourceDefinition.js +2 -0
- package/dist/mcp-server/resources/utils/resourceDefinition.js.map +1 -0
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts +14 -0
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts.map +1 -0
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.js +111 -0
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.js.map +1 -0
- package/dist/mcp-server/roots/roots-registration.d.ts +22 -0
- package/dist/mcp-server/roots/roots-registration.d.ts.map +1 -0
- package/dist/mcp-server/roots/roots-registration.js +25 -0
- package/dist/mcp-server/roots/roots-registration.js.map +1 -0
- package/dist/mcp-server/server.d.ts +34 -0
- package/dist/mcp-server/server.d.ts.map +1 -0
- package/dist/mcp-server/server.js +62 -0
- package/dist/mcp-server/server.js.map +1 -0
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts +42 -0
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts.map +1 -0
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js +70 -0
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js.map +1 -0
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts +109 -0
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts.map +1 -0
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.js +209 -0
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.js.map +1 -0
- package/dist/mcp-server/tasks/core/taskManager.d.ts +103 -0
- package/dist/mcp-server/tasks/core/taskManager.d.ts.map +1 -0
- package/dist/mcp-server/tasks/core/taskManager.js +144 -0
- package/dist/mcp-server/tasks/core/taskManager.js.map +1 -0
- package/dist/mcp-server/tasks/core/taskTypes.d.ts +11 -0
- package/dist/mcp-server/tasks/core/taskTypes.d.ts.map +1 -0
- package/dist/mcp-server/tasks/core/taskTypes.js +13 -0
- package/dist/mcp-server/tasks/core/taskTypes.js.map +1 -0
- package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts +108 -0
- package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts.map +1 -0
- package/dist/mcp-server/tasks/utils/taskToolDefinition.js +14 -0
- package/dist/mcp-server/tasks/utils/taskToolDefinition.js.map +1 -0
- package/dist/mcp-server/tools/tool-registration.d.ts +49 -0
- package/dist/mcp-server/tools/tool-registration.d.ts.map +1 -0
- package/dist/mcp-server/tools/tool-registration.js +269 -0
- package/dist/mcp-server/tools/tool-registration.js.map +1 -0
- package/dist/mcp-server/tools/utils/newToolDefinition.d.ts +73 -0
- package/dist/mcp-server/tools/utils/newToolDefinition.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/newToolDefinition.js +45 -0
- package/dist/mcp-server/tools/utils/newToolDefinition.js.map +1 -0
- package/dist/mcp-server/tools/utils/newToolHandlerFactory.d.ts +33 -0
- package/dist/mcp-server/tools/utils/newToolHandlerFactory.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/newToolHandlerFactory.js +107 -0
- package/dist/mcp-server/tools/utils/newToolHandlerFactory.js.map +1 -0
- package/dist/mcp-server/tools/utils/toolDefinition.d.ts +118 -0
- package/dist/mcp-server/tools/utils/toolDefinition.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/toolDefinition.js +2 -0
- package/dist/mcp-server/tools/utils/toolDefinition.js.map +1 -0
- package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +34 -0
- package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/toolHandlerFactory.js +68 -0
- package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -0
- package/dist/mcp-server/transports/ITransport.d.ts +15 -0
- package/dist/mcp-server/transports/ITransport.d.ts.map +1 -0
- package/dist/mcp-server/transports/ITransport.js +2 -0
- package/dist/mcp-server/transports/ITransport.js.map +1 -0
- package/dist/mcp-server/transports/auth/authFactory.d.ts +11 -0
- package/dist/mcp-server/transports/auth/authFactory.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/authFactory.js +43 -0
- package/dist/mcp-server/transports/auth/authFactory.js.map +1 -0
- package/dist/mcp-server/transports/auth/authMiddleware.d.ts +24 -0
- package/dist/mcp-server/transports/auth/authMiddleware.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/authMiddleware.js +69 -0
- package/dist/mcp-server/transports/auth/authMiddleware.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authContext.d.ts +34 -0
- package/dist/mcp-server/transports/auth/lib/authContext.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authContext.js +25 -0
- package/dist/mcp-server/transports/auth/lib/authContext.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authTypes.d.ts +19 -0
- package/dist/mcp-server/transports/auth/lib/authTypes.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authTypes.js +2 -0
- package/dist/mcp-server/transports/auth/lib/authTypes.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authUtils.d.ts +18 -0
- package/dist/mcp-server/transports/auth/lib/authUtils.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authUtils.js +64 -0
- package/dist/mcp-server/transports/auth/lib/authUtils.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/checkScopes.d.ts +25 -0
- package/dist/mcp-server/transports/auth/lib/checkScopes.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/checkScopes.js +34 -0
- package/dist/mcp-server/transports/auth/lib/checkScopes.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/claimParser.d.ts +34 -0
- package/dist/mcp-server/transports/auth/lib/claimParser.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/claimParser.js +58 -0
- package/dist/mcp-server/transports/auth/lib/claimParser.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/withAuth.d.ts +25 -0
- package/dist/mcp-server/transports/auth/lib/withAuth.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/withAuth.js +30 -0
- package/dist/mcp-server/transports/auth/lib/withAuth.js.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/authStrategy.d.ts +18 -0
- package/dist/mcp-server/transports/auth/strategies/authStrategy.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/authStrategy.js +2 -0
- package/dist/mcp-server/transports/auth/strategies/authStrategy.js.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.d.ts +14 -0
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js +86 -0
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts +14 -0
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js +113 -0
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js.map +1 -0
- package/dist/mcp-server/transports/http/httpErrorHandler.d.ts +25 -0
- package/dist/mcp-server/transports/http/httpErrorHandler.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/httpErrorHandler.js +112 -0
- package/dist/mcp-server/transports/http/httpErrorHandler.js.map +1 -0
- package/dist/mcp-server/transports/http/httpTransport.d.ts +47 -0
- package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/httpTransport.js +396 -0
- package/dist/mcp-server/transports/http/httpTransport.js.map +1 -0
- package/dist/mcp-server/transports/http/httpTypes.d.ts +17 -0
- package/dist/mcp-server/transports/http/httpTypes.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/httpTypes.js +2 -0
- package/dist/mcp-server/transports/http/httpTypes.js.map +1 -0
- package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts +21 -0
- package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/protectedResourceMetadata.js +44 -0
- package/dist/mcp-server/transports/http/protectedResourceMetadata.js.map +1 -0
- package/dist/mcp-server/transports/http/sessionIdUtils.d.ts +33 -0
- package/dist/mcp-server/transports/http/sessionIdUtils.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/sessionIdUtils.js +54 -0
- package/dist/mcp-server/transports/http/sessionIdUtils.js.map +1 -0
- package/dist/mcp-server/transports/http/sessionStore.d.ts +87 -0
- package/dist/mcp-server/transports/http/sessionStore.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/sessionStore.js +209 -0
- package/dist/mcp-server/transports/http/sessionStore.js.map +1 -0
- package/dist/mcp-server/transports/manager.d.ts +22 -0
- package/dist/mcp-server/transports/manager.d.ts.map +1 -0
- package/dist/mcp-server/transports/manager.js +62 -0
- package/dist/mcp-server/transports/manager.js.map +1 -0
- package/dist/mcp-server/transports/stdio/stdioTransport.d.ts +44 -0
- package/dist/mcp-server/transports/stdio/stdioTransport.d.ts.map +1 -0
- package/dist/mcp-server/transports/stdio/stdioTransport.js +63 -0
- package/dist/mcp-server/transports/stdio/stdioTransport.js.map +1 -0
- package/dist/services/graph/core/GraphService.d.ts +205 -0
- package/dist/services/graph/core/GraphService.d.ts.map +1 -0
- package/dist/services/graph/core/GraphService.js +231 -0
- package/dist/services/graph/core/GraphService.js.map +1 -0
- package/dist/services/graph/core/IGraphProvider.d.ts +295 -0
- package/dist/services/graph/core/IGraphProvider.d.ts.map +1 -0
- package/dist/services/graph/core/IGraphProvider.js +8 -0
- package/dist/services/graph/core/IGraphProvider.js.map +1 -0
- package/dist/services/graph/types.d.ts +107 -0
- package/dist/services/graph/types.d.ts.map +1 -0
- package/dist/services/graph/types.js +8 -0
- package/dist/services/graph/types.js.map +1 -0
- package/dist/services/llm/core/ILlmProvider.d.ts +86 -0
- package/dist/services/llm/core/ILlmProvider.d.ts.map +1 -0
- package/dist/services/llm/core/ILlmProvider.js +2 -0
- package/dist/services/llm/core/ILlmProvider.js.map +1 -0
- package/dist/services/llm/providers/openrouter.provider.d.ts +187 -0
- package/dist/services/llm/providers/openrouter.provider.d.ts.map +1 -0
- package/dist/services/llm/providers/openrouter.provider.js +302 -0
- package/dist/services/llm/providers/openrouter.provider.js.map +1 -0
- package/dist/services/llm/types.d.ts +16 -0
- package/dist/services/llm/types.d.ts.map +1 -0
- package/dist/services/llm/types.js +9 -0
- package/dist/services/llm/types.js.map +1 -0
- package/dist/services/speech/core/ISpeechProvider.d.ts +92 -0
- package/dist/services/speech/core/ISpeechProvider.d.ts.map +1 -0
- package/dist/services/speech/core/ISpeechProvider.js +34 -0
- package/dist/services/speech/core/ISpeechProvider.js.map +1 -0
- package/dist/services/speech/core/SpeechService.d.ts +87 -0
- package/dist/services/speech/core/SpeechService.d.ts.map +1 -0
- package/dist/services/speech/core/SpeechService.js +135 -0
- package/dist/services/speech/core/SpeechService.js.map +1 -0
- package/dist/services/speech/providers/elevenlabs.provider.d.ts +77 -0
- package/dist/services/speech/providers/elevenlabs.provider.d.ts.map +1 -0
- package/dist/services/speech/providers/elevenlabs.provider.js +199 -0
- package/dist/services/speech/providers/elevenlabs.provider.js.map +1 -0
- package/dist/services/speech/providers/whisper.provider.d.ts +94 -0
- package/dist/services/speech/providers/whisper.provider.d.ts.map +1 -0
- package/dist/services/speech/providers/whisper.provider.js +240 -0
- package/dist/services/speech/providers/whisper.provider.js.map +1 -0
- package/dist/services/speech/types.d.ts +173 -0
- package/dist/services/speech/types.d.ts.map +1 -0
- package/dist/services/speech/types.js +8 -0
- package/dist/services/speech/types.js.map +1 -0
- package/dist/storage/core/IStorageProvider.d.ts +159 -0
- package/dist/storage/core/IStorageProvider.d.ts.map +1 -0
- package/dist/storage/core/IStorageProvider.js +2 -0
- package/dist/storage/core/IStorageProvider.js.map +1 -0
- package/dist/storage/core/StorageService.d.ts +22 -0
- package/dist/storage/core/StorageService.d.ts.map +1 -0
- package/dist/storage/core/StorageService.js +151 -0
- package/dist/storage/core/StorageService.js.map +1 -0
- package/dist/storage/core/storageFactory.d.ts +66 -0
- package/dist/storage/core/storageFactory.d.ts.map +1 -0
- package/dist/storage/core/storageFactory.js +122 -0
- package/dist/storage/core/storageFactory.js.map +1 -0
- package/dist/storage/core/storageValidation.d.ts +77 -0
- package/dist/storage/core/storageValidation.d.ts.map +1 -0
- package/dist/storage/core/storageValidation.js +303 -0
- package/dist/storage/core/storageValidation.js.map +1 -0
- package/dist/storage/providers/cloudflare/d1Provider.d.ts +94 -0
- package/dist/storage/providers/cloudflare/d1Provider.d.ts.map +1 -0
- package/dist/storage/providers/cloudflare/d1Provider.js +347 -0
- package/dist/storage/providers/cloudflare/d1Provider.js.map +1 -0
- package/dist/storage/providers/cloudflare/kvProvider.d.ts +21 -0
- package/dist/storage/providers/cloudflare/kvProvider.d.ts.map +1 -0
- package/dist/storage/providers/cloudflare/kvProvider.js +183 -0
- package/dist/storage/providers/cloudflare/kvProvider.js.map +1 -0
- package/dist/storage/providers/cloudflare/r2Provider.d.ts +28 -0
- package/dist/storage/providers/cloudflare/r2Provider.d.ts.map +1 -0
- package/dist/storage/providers/cloudflare/r2Provider.js +222 -0
- package/dist/storage/providers/cloudflare/r2Provider.js.map +1 -0
- package/dist/storage/providers/fileSystem/fileSystemProvider.d.ts +20 -0
- package/dist/storage/providers/fileSystem/fileSystemProvider.d.ts.map +1 -0
- package/dist/storage/providers/fileSystem/fileSystemProvider.js +282 -0
- package/dist/storage/providers/fileSystem/fileSystemProvider.js.map +1 -0
- package/dist/storage/providers/inMemory/inMemoryProvider.d.ts +21 -0
- package/dist/storage/providers/inMemory/inMemoryProvider.d.ts.map +1 -0
- package/dist/storage/providers/inMemory/inMemoryProvider.js +139 -0
- package/dist/storage/providers/inMemory/inMemoryProvider.js.map +1 -0
- package/dist/storage/providers/supabase/supabase.types.d.ts +49 -0
- package/dist/storage/providers/supabase/supabase.types.d.ts.map +1 -0
- package/dist/storage/providers/supabase/supabase.types.js +8 -0
- package/dist/storage/providers/supabase/supabase.types.js.map +1 -0
- package/dist/storage/providers/supabase/supabaseProvider.d.ts +24 -0
- package/dist/storage/providers/supabase/supabaseProvider.d.ts.map +1 -0
- package/dist/storage/providers/supabase/supabaseProvider.js +209 -0
- package/dist/storage/providers/supabase/supabaseProvider.js.map +1 -0
- package/dist/testing/index.d.ts +53 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +132 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types-global/errors.d.ts +83 -0
- package/dist/types-global/errors.d.ts.map +1 -0
- package/dist/types-global/errors.js +113 -0
- package/dist/types-global/errors.js.map +1 -0
- package/dist/utils/formatting/diffFormatter.d.ts +227 -0
- package/dist/utils/formatting/diffFormatter.d.ts.map +1 -0
- package/dist/utils/formatting/diffFormatter.js +369 -0
- package/dist/utils/formatting/diffFormatter.js.map +1 -0
- package/dist/utils/formatting/index.d.ts +9 -0
- package/dist/utils/formatting/index.d.ts.map +1 -0
- package/dist/utils/formatting/index.js +9 -0
- package/dist/utils/formatting/index.js.map +1 -0
- package/dist/utils/formatting/markdownBuilder.d.ts +543 -0
- package/dist/utils/formatting/markdownBuilder.d.ts.map +1 -0
- package/dist/utils/formatting/markdownBuilder.js +674 -0
- package/dist/utils/formatting/markdownBuilder.js.map +1 -0
- package/dist/utils/formatting/tableFormatter.d.ts +261 -0
- package/dist/utils/formatting/tableFormatter.d.ts.map +1 -0
- package/dist/utils/formatting/tableFormatter.js +456 -0
- package/dist/utils/formatting/tableFormatter.js.map +1 -0
- package/dist/utils/formatting/treeFormatter.d.ts +344 -0
- package/dist/utils/formatting/treeFormatter.d.ts.map +1 -0
- package/dist/utils/formatting/treeFormatter.js +400 -0
- package/dist/utils/formatting/treeFormatter.js.map +1 -0
- package/dist/utils/internal/encoding.d.ts +42 -0
- package/dist/utils/internal/encoding.d.ts.map +1 -0
- package/dist/utils/internal/encoding.js +87 -0
- package/dist/utils/internal/encoding.js.map +1 -0
- package/dist/utils/internal/error-handler/errorHandler.d.ts +140 -0
- package/dist/utils/internal/error-handler/errorHandler.d.ts.map +1 -0
- package/dist/utils/internal/error-handler/errorHandler.js +318 -0
- package/dist/utils/internal/error-handler/errorHandler.js.map +1 -0
- package/dist/utils/internal/error-handler/helpers.d.ts +98 -0
- package/dist/utils/internal/error-handler/helpers.d.ts.map +1 -0
- package/dist/utils/internal/error-handler/helpers.js +214 -0
- package/dist/utils/internal/error-handler/helpers.js.map +1 -0
- package/dist/utils/internal/error-handler/mappings.d.ts +85 -0
- package/dist/utils/internal/error-handler/mappings.d.ts.map +1 -0
- package/dist/utils/internal/error-handler/mappings.js +234 -0
- package/dist/utils/internal/error-handler/mappings.js.map +1 -0
- package/dist/utils/internal/error-handler/types.d.ts +160 -0
- package/dist/utils/internal/error-handler/types.d.ts.map +1 -0
- package/dist/utils/internal/error-handler/types.js +6 -0
- package/dist/utils/internal/error-handler/types.js.map +1 -0
- package/dist/utils/internal/health.d.ts +60 -0
- package/dist/utils/internal/health.d.ts.map +1 -0
- package/dist/utils/internal/health.js +46 -0
- package/dist/utils/internal/health.js.map +1 -0
- package/dist/utils/internal/logger.d.ts +300 -0
- package/dist/utils/internal/logger.d.ts.map +1 -0
- package/dist/utils/internal/logger.js +573 -0
- package/dist/utils/internal/logger.js.map +1 -0
- package/dist/utils/internal/performance.d.ts +78 -0
- package/dist/utils/internal/performance.d.ts.map +1 -0
- package/dist/utils/internal/performance.js +227 -0
- package/dist/utils/internal/performance.js.map +1 -0
- package/dist/utils/internal/requestContext.d.ts +200 -0
- package/dist/utils/internal/requestContext.d.ts.map +1 -0
- package/dist/utils/internal/requestContext.js +163 -0
- package/dist/utils/internal/requestContext.js.map +1 -0
- package/dist/utils/internal/runtime.d.ts +49 -0
- package/dist/utils/internal/runtime.d.ts.map +1 -0
- package/dist/utils/internal/runtime.js +90 -0
- package/dist/utils/internal/runtime.js.map +1 -0
- package/dist/utils/internal/startupBanner.d.ts +23 -0
- package/dist/utils/internal/startupBanner.d.ts.map +1 -0
- package/dist/utils/internal/startupBanner.js +34 -0
- package/dist/utils/internal/startupBanner.js.map +1 -0
- package/dist/utils/metrics/tokenCounter.d.ts +97 -0
- package/dist/utils/metrics/tokenCounter.d.ts.map +1 -0
- package/dist/utils/metrics/tokenCounter.js +162 -0
- package/dist/utils/metrics/tokenCounter.js.map +1 -0
- package/dist/utils/network/fetchWithTimeout.d.ts +91 -0
- package/dist/utils/network/fetchWithTimeout.d.ts.map +1 -0
- package/dist/utils/network/fetchWithTimeout.js +305 -0
- package/dist/utils/network/fetchWithTimeout.js.map +1 -0
- package/dist/utils/pagination/pagination.d.ts +157 -0
- package/dist/utils/pagination/pagination.d.ts.map +1 -0
- package/dist/utils/pagination/pagination.js +191 -0
- package/dist/utils/pagination/pagination.js.map +1 -0
- package/dist/utils/parsing/csvParser.d.ts +84 -0
- package/dist/utils/parsing/csvParser.d.ts.map +1 -0
- package/dist/utils/parsing/csvParser.js +132 -0
- package/dist/utils/parsing/csvParser.js.map +1 -0
- package/dist/utils/parsing/dateParser.d.ts +103 -0
- package/dist/utils/parsing/dateParser.d.ts.map +1 -0
- package/dist/utils/parsing/dateParser.js +142 -0
- package/dist/utils/parsing/dateParser.js.map +1 -0
- package/dist/utils/parsing/frontmatterParser.d.ts +91 -0
- package/dist/utils/parsing/frontmatterParser.d.ts.map +1 -0
- package/dist/utils/parsing/frontmatterParser.js +163 -0
- package/dist/utils/parsing/frontmatterParser.js.map +1 -0
- package/dist/utils/parsing/index.d.ts +15 -0
- package/dist/utils/parsing/index.d.ts.map +1 -0
- package/dist/utils/parsing/index.js +15 -0
- package/dist/utils/parsing/index.js.map +1 -0
- package/dist/utils/parsing/jsonParser.d.ts +115 -0
- package/dist/utils/parsing/jsonParser.d.ts.map +1 -0
- package/dist/utils/parsing/jsonParser.js +177 -0
- package/dist/utils/parsing/jsonParser.js.map +1 -0
- package/dist/utils/parsing/pdfParser.d.ts +563 -0
- package/dist/utils/parsing/pdfParser.d.ts.map +1 -0
- package/dist/utils/parsing/pdfParser.js +775 -0
- package/dist/utils/parsing/pdfParser.js.map +1 -0
- package/dist/utils/parsing/thinkBlock.d.ts +31 -0
- package/dist/utils/parsing/thinkBlock.d.ts.map +1 -0
- package/dist/utils/parsing/thinkBlock.js +31 -0
- package/dist/utils/parsing/thinkBlock.js.map +1 -0
- package/dist/utils/parsing/xmlParser.d.ts +69 -0
- package/dist/utils/parsing/xmlParser.d.ts.map +1 -0
- package/dist/utils/parsing/xmlParser.js +140 -0
- package/dist/utils/parsing/xmlParser.js.map +1 -0
- package/dist/utils/parsing/yamlParser.d.ts +64 -0
- package/dist/utils/parsing/yamlParser.d.ts.map +1 -0
- package/dist/utils/parsing/yamlParser.js +129 -0
- package/dist/utils/parsing/yamlParser.js.map +1 -0
- package/dist/utils/scheduling/scheduler.d.ts +174 -0
- package/dist/utils/scheduling/scheduler.d.ts.map +1 -0
- package/dist/utils/scheduling/scheduler.js +248 -0
- package/dist/utils/scheduling/scheduler.js.map +1 -0
- package/dist/utils/security/idGenerator.d.ts +189 -0
- package/dist/utils/security/idGenerator.d.ts.map +1 -0
- package/dist/utils/security/idGenerator.js +301 -0
- package/dist/utils/security/idGenerator.js.map +1 -0
- package/dist/utils/security/index.d.ts +8 -0
- package/dist/utils/security/index.d.ts.map +1 -0
- package/dist/utils/security/index.js +8 -0
- package/dist/utils/security/index.js.map +1 -0
- package/dist/utils/security/rateLimiter.d.ts +171 -0
- package/dist/utils/security/rateLimiter.d.ts.map +1 -0
- package/dist/utils/security/rateLimiter.js +294 -0
- package/dist/utils/security/rateLimiter.js.map +1 -0
- package/dist/utils/security/sanitization.d.ts +430 -0
- package/dist/utils/security/sanitization.d.ts.map +1 -0
- package/dist/utils/security/sanitization.js +759 -0
- package/dist/utils/security/sanitization.js.map +1 -0
- package/dist/utils/telemetry/index.d.ts +12 -0
- package/dist/utils/telemetry/index.d.ts.map +1 -0
- package/dist/utils/telemetry/index.js +12 -0
- package/dist/utils/telemetry/index.js.map +1 -0
- package/dist/utils/telemetry/instrumentation.d.ts +62 -0
- package/dist/utils/telemetry/instrumentation.d.ts.map +1 -0
- package/dist/utils/telemetry/instrumentation.js +223 -0
- package/dist/utils/telemetry/instrumentation.js.map +1 -0
- package/dist/utils/telemetry/metrics.d.ts +170 -0
- package/dist/utils/telemetry/metrics.d.ts.map +1 -0
- package/dist/utils/telemetry/metrics.js +205 -0
- package/dist/utils/telemetry/metrics.js.map +1 -0
- package/dist/utils/telemetry/semconv.d.ts +147 -0
- package/dist/utils/telemetry/semconv.d.ts.map +1 -0
- package/dist/utils/telemetry/semconv.js +159 -0
- package/dist/utils/telemetry/semconv.js.map +1 -0
- package/dist/utils/telemetry/trace.d.ts +141 -0
- package/dist/utils/telemetry/trace.d.ts.map +1 -0
- package/dist/utils/telemetry/trace.js +193 -0
- package/dist/utils/telemetry/trace.js.map +1 -0
- package/dist/utils/types/guards.d.ts +209 -0
- package/dist/utils/types/guards.d.ts.map +1 -0
- package/dist/utils/types/guards.js +229 -0
- package/dist/utils/types/guards.js.map +1 -0
- package/dist/utils/types/index.d.ts +6 -0
- package/dist/utils/types/index.d.ts.map +1 -0
- package/dist/utils/types/index.js +6 -0
- package/dist/utils/types/index.js.map +1 -0
- package/dist/worker.d.ts +59 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +216 -0
- package/dist/worker.js.map +1 -0
- package/package.json +377 -0
- package/skills/README.md +38 -0
- package/skills/add-export/SKILL.md +49 -0
- package/skills/add-prompt/SKILL.md +97 -0
- package/skills/add-provider/SKILL.md +53 -0
- package/skills/add-resource/SKILL.md +107 -0
- package/skills/add-service/SKILL.md +113 -0
- package/skills/add-tool/SKILL.md +110 -0
- package/skills/api-auth/SKILL.md +173 -0
- package/skills/api-config/SKILL.md +68 -0
- package/skills/api-context/SKILL.md +321 -0
- package/skills/api-errors/SKILL.md +146 -0
- package/skills/api-services/SKILL.md +24 -0
- package/skills/api-services/references/graph.md +124 -0
- package/skills/api-services/references/llm.md +46 -0
- package/skills/api-services/references/speech.md +72 -0
- package/skills/api-testing/SKILL.md +263 -0
- package/skills/api-utils/SKILL.md +106 -0
- package/skills/api-utils/references/formatting.md +237 -0
- package/skills/api-utils/references/parsing.md +263 -0
- package/skills/api-utils/references/security.md +226 -0
- package/skills/api-workers/SKILL.md +165 -0
- package/skills/devcheck/SKILL.md +31 -0
- package/skills/maintenance/SKILL.md +52 -0
- package/skills/migrate-mcp-ts-template/SKILL.md +131 -0
- package/skills/release/SKILL.md +67 -0
- package/skills/setup/SKILL.md +89 -0
- package/skills/walkthrough-init/SKILL.md +50 -0
- package/templates/.env.example +17 -0
- package/templates/AGENTS.md +113 -0
- package/templates/CLAUDE.md +113 -0
- package/templates/_tsconfig.json +33 -0
- package/templates/biome.template.json +43 -0
- package/templates/package.json +26 -0
- package/templates/src/index.ts +16 -0
- package/templates/src/mcp-server/prompts/definitions/echo.prompt.ts +19 -0
- package/templates/src/mcp-server/resources/definitions/echo.resource.ts +30 -0
- package/templates/src/mcp-server/tools/definitions/echo.tool.ts +24 -0
- package/templates/vitest.config.ts +12 -0
- package/tsconfig.base.json +44 -0
- package/vitest.config.base.ts +38 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Performance utility for tool execution with modern observability.
|
|
3
|
+
* Wraps tool logic to measure duration, payload sizes, and memory usage, and
|
|
4
|
+
* records results to OpenTelemetry plus structured logs. No manual spans beyond
|
|
5
|
+
* the single wrapper span here per project guidelines.
|
|
6
|
+
* @module src/utils/internal/performance
|
|
7
|
+
*/
|
|
8
|
+
import { SpanStatusCode, trace } from '@opentelemetry/api';
|
|
9
|
+
import { config } from '../../config/index.js';
|
|
10
|
+
import { McpError } from '../../types-global/errors.js';
|
|
11
|
+
import { logger } from '../../utils/internal/logger.js';
|
|
12
|
+
import { createCounter, createHistogram } from '../../utils/telemetry/metrics.js';
|
|
13
|
+
import { ATTR_CODE_FUNCTION, ATTR_CODE_NAMESPACE, ATTR_MCP_TOOL_DURATION_MS, ATTR_MCP_TOOL_ERROR_CODE, ATTR_MCP_TOOL_INPUT_BYTES, ATTR_MCP_TOOL_MEMORY_HEAP_USED_AFTER, ATTR_MCP_TOOL_MEMORY_HEAP_USED_BEFORE, ATTR_MCP_TOOL_MEMORY_HEAP_USED_DELTA, ATTR_MCP_TOOL_MEMORY_RSS_AFTER, ATTR_MCP_TOOL_MEMORY_RSS_BEFORE, ATTR_MCP_TOOL_MEMORY_RSS_DELTA, ATTR_MCP_TOOL_NAME, ATTR_MCP_TOOL_OUTPUT_BYTES, ATTR_MCP_TOOL_SUCCESS, } from '../../utils/telemetry/semconv.js';
|
|
14
|
+
// OTel metric instruments for tool execution (lazy-initialized on first use)
|
|
15
|
+
let toolCallCounter;
|
|
16
|
+
let toolCallDuration;
|
|
17
|
+
let toolCallErrors;
|
|
18
|
+
function getToolMetrics() {
|
|
19
|
+
toolCallCounter ??= createCounter('mcp.tool.calls', 'Total MCP tool invocations', '{calls}');
|
|
20
|
+
toolCallDuration ??= createHistogram('mcp.tool.duration', 'MCP tool execution duration', 'ms');
|
|
21
|
+
toolCallErrors ??= createCounter('mcp.tool.errors', 'Total MCP tool errors', '{errors}');
|
|
22
|
+
return { toolCallCounter, toolCallDuration, toolCallErrors };
|
|
23
|
+
}
|
|
24
|
+
// Environment-aware high-resolution timer
|
|
25
|
+
let performanceNow = () => Date.now(); // Fallback
|
|
26
|
+
/**
|
|
27
|
+
* Dynamically loads Node's `perf_hooks` module.
|
|
28
|
+
* Exposed as a named export so tests can inject a mock loader into
|
|
29
|
+
* {@link initHighResTimer} without patching the dynamic import machinery.
|
|
30
|
+
*
|
|
31
|
+
* @returns A promise resolving to the `perf_hooks` module shape (just the `performance` export).
|
|
32
|
+
*/
|
|
33
|
+
export async function loadPerfHooks() {
|
|
34
|
+
return await import('node:perf_hooks');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Initializes the module-level high-resolution timer used by {@link nowMs}.
|
|
38
|
+
*
|
|
39
|
+
* Resolution priority:
|
|
40
|
+
* 1. `globalThis.performance.now` — available in Cloudflare Workers and modern browsers.
|
|
41
|
+
* 2. `node:perf_hooks` `performance.now` — loaded dynamically to stay Workers-compatible.
|
|
42
|
+
* 3. `Date.now()` — millisecond-precision fallback; a warning is logged when this path is taken.
|
|
43
|
+
*
|
|
44
|
+
* Must be called once during server startup (before any tool executions) to ensure
|
|
45
|
+
* sub-millisecond timing accuracy. Subsequent calls are safe but no-ops in practice
|
|
46
|
+
* because the module-level `performanceNow` closure is overwritten each time.
|
|
47
|
+
*
|
|
48
|
+
* @param perfLoader - Optional override for the `perf_hooks` import; defaults to
|
|
49
|
+
* {@link loadPerfHooks}. Inject a mock here in unit tests.
|
|
50
|
+
* @returns A promise that resolves once the timer is ready.
|
|
51
|
+
*/
|
|
52
|
+
export async function initHighResTimer(perfLoader = loadPerfHooks) {
|
|
53
|
+
// Use a type assertion to safely access `performance` on `globalThis`,
|
|
54
|
+
// which is present in browser-like environments (e.g., Cloudflare Workers)
|
|
55
|
+
// but not in Node.js's default global type.
|
|
56
|
+
const globalWithPerf = globalThis;
|
|
57
|
+
if (typeof globalWithPerf.performance?.now === 'function') {
|
|
58
|
+
const perf = globalWithPerf.performance;
|
|
59
|
+
performanceNow = () => perf.now();
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
try {
|
|
63
|
+
const { performance: nodePerformance } = await perfLoader();
|
|
64
|
+
performanceNow = () => nodePerformance.now();
|
|
65
|
+
}
|
|
66
|
+
catch (_e) {
|
|
67
|
+
performanceNow = () => Date.now();
|
|
68
|
+
logger.warning('Could not import perf_hooks, falling back to Date.now() for performance timing.');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Returns the current time in milliseconds using the highest-resolution timer
|
|
74
|
+
* available in this environment.
|
|
75
|
+
*
|
|
76
|
+
* The precision depends on which timer was selected by {@link initHighResTimer}:
|
|
77
|
+
* sub-millisecond after a successful init, millisecond-granular otherwise.
|
|
78
|
+
* The returned value is suitable for computing durations but its epoch origin
|
|
79
|
+
* is implementation-defined — do not treat it as a wall-clock timestamp.
|
|
80
|
+
*
|
|
81
|
+
* @returns Current time in milliseconds.
|
|
82
|
+
*/
|
|
83
|
+
export const nowMs = () => performanceNow();
|
|
84
|
+
const toBytes = (payload) => {
|
|
85
|
+
if (payload == null)
|
|
86
|
+
return 0;
|
|
87
|
+
try {
|
|
88
|
+
const json = JSON.stringify(payload);
|
|
89
|
+
// Prefer Buffer when available (Node), otherwise TextEncoder (Web/Workers)
|
|
90
|
+
if (typeof Buffer !== 'undefined' && typeof Buffer.byteLength === 'function') {
|
|
91
|
+
return Buffer.byteLength(json, 'utf8');
|
|
92
|
+
}
|
|
93
|
+
if (typeof TextEncoder !== 'undefined') {
|
|
94
|
+
return new TextEncoder().encode(json).length;
|
|
95
|
+
}
|
|
96
|
+
return json.length;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const zeroMemory = {
|
|
103
|
+
rss: 0,
|
|
104
|
+
heapUsed: 0,
|
|
105
|
+
heapTotal: 0,
|
|
106
|
+
external: 0,
|
|
107
|
+
arrayBuffers: 0,
|
|
108
|
+
};
|
|
109
|
+
const getMemoryUsage = () => typeof process !== 'undefined' && typeof process.memoryUsage === 'function'
|
|
110
|
+
? process.memoryUsage()
|
|
111
|
+
: zeroMemory;
|
|
112
|
+
/**
|
|
113
|
+
* Wraps a tool's logic function with full observability: an OpenTelemetry span,
|
|
114
|
+
* OTel metric counters/histogram, structured log, and memory/payload size capture.
|
|
115
|
+
*
|
|
116
|
+
* The caller supplies the raw tool logic as `toolLogicFn`; this function handles
|
|
117
|
+
* all instrumentation so tool handlers stay free of telemetry boilerplate.
|
|
118
|
+
*
|
|
119
|
+
* On success the resolved value is passed through transparently.
|
|
120
|
+
* On failure the error is re-thrown after being recorded on the span and metrics;
|
|
121
|
+
* `McpError` instances surface their numeric `code` as the error code attribute.
|
|
122
|
+
*
|
|
123
|
+
* @template T - The resolved type of the tool's return value.
|
|
124
|
+
* @param toolLogicFn - Zero-argument async function containing the tool's business logic.
|
|
125
|
+
* @param context - Request context extended with `toolName`; used for span/log correlation.
|
|
126
|
+
* @param inputPayload - The raw input object passed to the tool, serialized to compute byte size.
|
|
127
|
+
* @returns A promise that resolves with the tool's return value or rejects with the original error.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```typescript
|
|
131
|
+
* const result = await measureToolExecution(
|
|
132
|
+
* () => myToolHandler(parsedInput),
|
|
133
|
+
* { ...requestContext, toolName: 'my_tool' },
|
|
134
|
+
* parsedInput,
|
|
135
|
+
* );
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export async function measureToolExecution(toolLogicFn, context, inputPayload) {
|
|
139
|
+
const tracer = trace.getTracer(config.openTelemetry.serviceName, config.openTelemetry.serviceVersion);
|
|
140
|
+
const { toolName } = context;
|
|
141
|
+
return await tracer.startActiveSpan(`tool_execution:${toolName}`, async (span) => {
|
|
142
|
+
// Pre-capture lightweight metrics
|
|
143
|
+
const memBefore = getMemoryUsage();
|
|
144
|
+
const t0 = nowMs();
|
|
145
|
+
span.setAttributes({
|
|
146
|
+
[ATTR_CODE_FUNCTION]: toolName,
|
|
147
|
+
[ATTR_CODE_NAMESPACE]: 'mcp-tools',
|
|
148
|
+
[ATTR_MCP_TOOL_INPUT_BYTES]: toBytes(inputPayload),
|
|
149
|
+
[ATTR_MCP_TOOL_MEMORY_RSS_BEFORE]: memBefore.rss,
|
|
150
|
+
[ATTR_MCP_TOOL_MEMORY_HEAP_USED_BEFORE]: memBefore.heapUsed,
|
|
151
|
+
});
|
|
152
|
+
let ok = false;
|
|
153
|
+
let errorCode;
|
|
154
|
+
let output;
|
|
155
|
+
try {
|
|
156
|
+
const result = await toolLogicFn();
|
|
157
|
+
ok = true;
|
|
158
|
+
output = result;
|
|
159
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
160
|
+
span.setAttribute(ATTR_MCP_TOOL_OUTPUT_BYTES, toBytes(output));
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
if (err instanceof McpError)
|
|
165
|
+
errorCode = String(err.code);
|
|
166
|
+
else if (err instanceof Error)
|
|
167
|
+
errorCode = 'UNHANDLED_ERROR';
|
|
168
|
+
else
|
|
169
|
+
errorCode = 'UNKNOWN_ERROR';
|
|
170
|
+
if (err instanceof Error)
|
|
171
|
+
span.recordException(err);
|
|
172
|
+
span.setStatus({
|
|
173
|
+
code: SpanStatusCode.ERROR,
|
|
174
|
+
message: err instanceof Error ? err.message : String(err),
|
|
175
|
+
});
|
|
176
|
+
throw err;
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
const t1 = nowMs();
|
|
180
|
+
const durationMs = Number((t1 - t0).toFixed(2));
|
|
181
|
+
const memAfter = getMemoryUsage();
|
|
182
|
+
const rssDelta = memAfter.rss - memBefore.rss;
|
|
183
|
+
const heapUsedDelta = memAfter.heapUsed - memBefore.heapUsed;
|
|
184
|
+
span.setAttributes({
|
|
185
|
+
[ATTR_MCP_TOOL_DURATION_MS]: durationMs,
|
|
186
|
+
[ATTR_MCP_TOOL_SUCCESS]: ok,
|
|
187
|
+
[ATTR_MCP_TOOL_MEMORY_RSS_AFTER]: memAfter.rss,
|
|
188
|
+
[ATTR_MCP_TOOL_MEMORY_HEAP_USED_AFTER]: memAfter.heapUsed,
|
|
189
|
+
[ATTR_MCP_TOOL_MEMORY_RSS_DELTA]: rssDelta,
|
|
190
|
+
[ATTR_MCP_TOOL_MEMORY_HEAP_USED_DELTA]: heapUsedDelta,
|
|
191
|
+
});
|
|
192
|
+
if (errorCode)
|
|
193
|
+
span.setAttribute(ATTR_MCP_TOOL_ERROR_CODE, errorCode);
|
|
194
|
+
span.end();
|
|
195
|
+
// Record to OTel metric instruments (durable across restarts)
|
|
196
|
+
const m = getToolMetrics();
|
|
197
|
+
const metricAttrs = { [ATTR_MCP_TOOL_NAME]: toolName, [ATTR_MCP_TOOL_SUCCESS]: ok };
|
|
198
|
+
m.toolCallCounter.add(1, metricAttrs);
|
|
199
|
+
m.toolCallDuration.record(durationMs, metricAttrs);
|
|
200
|
+
if (!ok)
|
|
201
|
+
m.toolCallErrors.add(1, { [ATTR_MCP_TOOL_NAME]: toolName });
|
|
202
|
+
logger.info('Tool execution finished.', {
|
|
203
|
+
...context,
|
|
204
|
+
metrics: {
|
|
205
|
+
durationMs,
|
|
206
|
+
isSuccess: ok,
|
|
207
|
+
errorCode,
|
|
208
|
+
inputBytes: toBytes(inputPayload),
|
|
209
|
+
outputBytes: toBytes(output),
|
|
210
|
+
memory: {
|
|
211
|
+
rss: {
|
|
212
|
+
before: memBefore.rss,
|
|
213
|
+
after: memAfter.rss,
|
|
214
|
+
delta: rssDelta,
|
|
215
|
+
},
|
|
216
|
+
heapUsed: {
|
|
217
|
+
before: memBefore.heapUsed,
|
|
218
|
+
after: memAfter.heapUsed,
|
|
219
|
+
delta: heapUsedDelta,
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=performance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance.js","sourceRoot":"","sources":["../../../src/utils/internal/performance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import type { AuthInfo } from '../../mcp-server/transports/auth/lib/authTypes.js';
|
|
2
|
+
/**
|
|
3
|
+
* Processed authentication data extracted from a validated JWT or OAuth token
|
|
4
|
+
* and attached to a {@link RequestContext} by {@link requestContextService.withAuthInfo}.
|
|
5
|
+
*
|
|
6
|
+
* Fields map directly to standard JWT claims: `clientId` ← `cid`/`client_id`,
|
|
7
|
+
* `scopes` ← `scp`/`scope` (split to array), `sub` ← `sub`, `tenantId` ← `tid`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const auth: AuthContext = ctx.auth!;
|
|
12
|
+
* if (auth.scopes.includes('tool:my_tool:read')) {
|
|
13
|
+
* // authorized
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export interface AuthContext {
|
|
18
|
+
/** The client application identifier (`cid` or `client_id` JWT claim). */
|
|
19
|
+
clientId: string;
|
|
20
|
+
/** Granted permission scopes derived from the `scp` or `scope` JWT claim. */
|
|
21
|
+
scopes: string[];
|
|
22
|
+
/** Subject identifier — the user or service principal (`sub` JWT claim). Falls back to `clientId` when `sub` is absent. */
|
|
23
|
+
sub: string;
|
|
24
|
+
/** Tenant identifier from the `tid` JWT claim. Present only for multi-tenant tokens. */
|
|
25
|
+
tenantId?: string;
|
|
26
|
+
/** The raw JWT or OAuth bearer token string. */
|
|
27
|
+
token: string;
|
|
28
|
+
/** Additional token payload properties not mapped to named fields. */
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Core context object associated with a single request or operation.
|
|
33
|
+
*
|
|
34
|
+
* Every handler invocation receives a `RequestContext` (wrapped in `Context`).
|
|
35
|
+
* It is the authoritative source for log correlation (`requestId`, `traceId`,
|
|
36
|
+
* `spanId`), multi-tenancy isolation (`tenantId`), and auth (`auth`).
|
|
37
|
+
*
|
|
38
|
+
* Optional fields (`traceId`, `spanId`) are injected automatically when an
|
|
39
|
+
* OpenTelemetry active span exists at context-creation time.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* // Read-only access in a handler
|
|
44
|
+
* ctx.log.info('Handling request', { requestId: ctx.requestId, tenantId: ctx.tenantId });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export interface RequestContext {
|
|
48
|
+
/**
|
|
49
|
+
* Authentication data populated by {@link requestContextService.withAuthInfo}.
|
|
50
|
+
* `undefined` when the request is unauthenticated or auth mode is `none`.
|
|
51
|
+
*/
|
|
52
|
+
auth?: AuthContext;
|
|
53
|
+
/**
|
|
54
|
+
* Unique identifier for this request, used to correlate log entries across
|
|
55
|
+
* service boundaries. Inherited from a parent context when provided;
|
|
56
|
+
* otherwise generated by {@link generateRequestContextId}.
|
|
57
|
+
*/
|
|
58
|
+
requestId: string;
|
|
59
|
+
/**
|
|
60
|
+
* OpenTelemetry span ID from the active span at context-creation time.
|
|
61
|
+
* `undefined` when no active span exists.
|
|
62
|
+
*/
|
|
63
|
+
spanId?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Tenant identifier used for multi-tenancy data isolation.
|
|
66
|
+
* Resolved in priority order: `additionalContext.tenantId` →
|
|
67
|
+
* rest params → `parentContext.tenantId` → AsyncLocalStorage auth store.
|
|
68
|
+
*/
|
|
69
|
+
tenantId?: string;
|
|
70
|
+
/**
|
|
71
|
+
* ISO 8601 UTC timestamp recorded at the moment this context was created.
|
|
72
|
+
*/
|
|
73
|
+
timestamp: string;
|
|
74
|
+
/**
|
|
75
|
+
* OpenTelemetry trace ID from the active span at context-creation time.
|
|
76
|
+
* `undefined` when no active span exists.
|
|
77
|
+
*/
|
|
78
|
+
traceId?: string;
|
|
79
|
+
/**
|
|
80
|
+
* Additional arbitrary key-value pairs for operation-specific context.
|
|
81
|
+
* Consumers must type-check before accessing extended properties.
|
|
82
|
+
*/
|
|
83
|
+
[key: string]: unknown;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parameters accepted by {@link requestContextService.createRequestContext}.
|
|
87
|
+
*
|
|
88
|
+
* Named fields (`parentContext`, `additionalContext`, `operation`) receive
|
|
89
|
+
* special handling. All other properties are spread directly onto the resulting
|
|
90
|
+
* {@link RequestContext} as-is, allowing ad-hoc context extension without
|
|
91
|
+
* modifying this interface.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const ctx = requestContextService.createRequestContext({
|
|
96
|
+
* operation: 'fetchUser',
|
|
97
|
+
* parentContext: incomingCtx,
|
|
98
|
+
* additionalContext: { userId: '123' },
|
|
99
|
+
* });
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export interface CreateRequestContextParams {
|
|
103
|
+
/**
|
|
104
|
+
* Key-value pairs merged into the context after `parentContext` properties
|
|
105
|
+
* but before `requestId`/`timestamp` are pinned. Takes precedence over
|
|
106
|
+
* `parentContext` for overlapping keys. `requestId` and `timestamp` keys in
|
|
107
|
+
* `additionalContext` are silently stripped to prevent overwrites.
|
|
108
|
+
*/
|
|
109
|
+
additionalContext?: Record<string, unknown>;
|
|
110
|
+
/**
|
|
111
|
+
* Human-readable label for the operation creating this context.
|
|
112
|
+
* Written onto the context as `context.operation` when provided.
|
|
113
|
+
*/
|
|
114
|
+
operation?: string;
|
|
115
|
+
/**
|
|
116
|
+
* Parent context whose properties are inherited as the base. When
|
|
117
|
+
* `parentContext.requestId` is a non-empty string it is reused as-is,
|
|
118
|
+
* preserving the same request ID across a call chain.
|
|
119
|
+
*/
|
|
120
|
+
parentContext?: Record<string, unknown> | RequestContext | undefined;
|
|
121
|
+
/** Any additional key-value pairs spread directly onto the resulting context. */
|
|
122
|
+
[key: string]: unknown;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Service for creating and enriching {@link RequestContext} instances.
|
|
126
|
+
*
|
|
127
|
+
* The two primary methods cover the full lifecycle:
|
|
128
|
+
* - {@link requestContextService.createRequestContext} — general-purpose context
|
|
129
|
+
* creation with parent propagation and OTel integration.
|
|
130
|
+
* - {@link requestContextService.withAuthInfo} — enriches a context with
|
|
131
|
+
* structured auth data from a validated token.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* import { requestContextService } from '../../utils/internal/requestContext.js';
|
|
136
|
+
*
|
|
137
|
+
* // Create a root context for an incoming request
|
|
138
|
+
* const ctx = requestContextService.createRequestContext({ operation: 'handleRequest' });
|
|
139
|
+
*
|
|
140
|
+
* // Enrich with auth after token verification
|
|
141
|
+
* const authCtx = requestContextService.withAuthInfo(verifiedAuthInfo, ctx);
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export declare const requestContextService: {
|
|
145
|
+
/**
|
|
146
|
+
* Creates a new {@link RequestContext} with a guaranteed unique `requestId`
|
|
147
|
+
* and current ISO 8601 `timestamp`.
|
|
148
|
+
*
|
|
149
|
+
* Merge order (later entries win, except `requestId`/`timestamp` which are
|
|
150
|
+
* always generated fresh or inherited):
|
|
151
|
+
* 1. `parentContext` properties (base)
|
|
152
|
+
* 2. Remaining spread params (everything in `params` except named fields)
|
|
153
|
+
* 3. `additionalContext` properties (`requestId`/`timestamp` stripped)
|
|
154
|
+
* 4. Resolved `requestId` and `timestamp` (canonical, never overwritten)
|
|
155
|
+
* 5. Resolved `tenantId` (see priority order in {@link RequestContext.tenantId})
|
|
156
|
+
* 6. `operation` (written as `context.operation` when provided)
|
|
157
|
+
* 7. OTel `traceId`/`spanId` from the active span (when present)
|
|
158
|
+
*
|
|
159
|
+
* @param params - Context creation parameters. Defaults to `{}`.
|
|
160
|
+
* @returns A fully constructed `RequestContext`.
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* ```typescript
|
|
164
|
+
* // Minimal — generates a fresh requestId and timestamp
|
|
165
|
+
* const ctx = requestContextService.createRequestContext();
|
|
166
|
+
*
|
|
167
|
+
* // Propagate an existing request ID across a call chain
|
|
168
|
+
* const childCtx = requestContextService.createRequestContext({
|
|
169
|
+
* parentContext: incomingCtx,
|
|
170
|
+
* operation: 'processItem',
|
|
171
|
+
* additionalContext: { itemId: item.id },
|
|
172
|
+
* });
|
|
173
|
+
* ```
|
|
174
|
+
*/
|
|
175
|
+
createRequestContext(params?: CreateRequestContextParams): RequestContext;
|
|
176
|
+
/**
|
|
177
|
+
* Creates a new {@link RequestContext} enriched with authentication information.
|
|
178
|
+
* This method populates the context with auth data from a validated token,
|
|
179
|
+
* including tenant ID, client ID, scopes, and subject.
|
|
180
|
+
*
|
|
181
|
+
* **Note:** This method builds and returns a `RequestContext` object only.
|
|
182
|
+
* It does NOT propagate auth into `AsyncLocalStorage`. ALS propagation is
|
|
183
|
+
* handled by the auth middleware via `authContext.run()`. If you need
|
|
184
|
+
* scope enforcement via `withRequiredScopes()`, ensure the call runs
|
|
185
|
+
* inside the middleware's ALS continuation.
|
|
186
|
+
*
|
|
187
|
+
* @param authInfo - The validated authentication information from JWT/OAuth token.
|
|
188
|
+
* @param parentContext - Optional parent context to inherit properties from.
|
|
189
|
+
* @returns A new `RequestContext` object with auth information populated.
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* ```typescript
|
|
193
|
+
* const authInfo = await jwtStrategy.verify(token);
|
|
194
|
+
* const context = requestContextService.withAuthInfo(authInfo);
|
|
195
|
+
* // context now includes: { requestId, timestamp, tenantId, auth: {...}, ... }
|
|
196
|
+
* ```
|
|
197
|
+
*/
|
|
198
|
+
withAuthInfo(authInfo: AuthInfo, parentContext?: Record<string, unknown> | RequestContext): RequestContext;
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=requestContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestContext.d.ts","sourceRoot":"","sources":["../../../src/utils/internal/requestContext.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+CAA+C,CAAC;AAG9E;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,2HAA2H;IAC3H,GAAG,EAAE,MAAM,CAAC;IACZ,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE5C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,GAAG,SAAS,CAAC;IAErE,iFAAiF;IACjF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA8ID;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,qBAAqB;IA3JhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;kCAC0B,0BAA0B,GAAQ,cAAc;IAuD7E;;;;;;;;;;;;;;;;;;;;;OAqBG;2BAES,QAAQ,kBACF,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,GACvD,cAAc;CA6C+C,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Utilities for creating and managing request contexts.
|
|
3
|
+
*
|
|
4
|
+
* A request context is an immutable-by-convention object that carries a unique
|
|
5
|
+
* request ID, ISO 8601 timestamp, optional tenant ID, and optional auth data.
|
|
6
|
+
* It is the primary carrier for log correlation, distributed tracing, and
|
|
7
|
+
* multi-tenancy isolation throughout the server.
|
|
8
|
+
*
|
|
9
|
+
* Key behaviors:
|
|
10
|
+
* - `requestId` is inherited from a parent context when provided, otherwise a
|
|
11
|
+
* new unique ID is generated via {@link generateRequestContextId}.
|
|
12
|
+
* - `tenantId` is resolved with the following priority (highest to lowest):
|
|
13
|
+
* `additionalContext.tenantId` → spread rest params → `parentContext.tenantId`
|
|
14
|
+
* → AsyncLocalStorage auth store (`authContext`).
|
|
15
|
+
* - OpenTelemetry `traceId` and `spanId` are automatically injected from the
|
|
16
|
+
* active span when one exists.
|
|
17
|
+
* - Auth data is populated separately via {@link requestContextService.withAuthInfo}
|
|
18
|
+
* and is NOT stored in AsyncLocalStorage by this module — ALS propagation is
|
|
19
|
+
* the responsibility of auth middleware.
|
|
20
|
+
*
|
|
21
|
+
* @module src/utils/internal/requestContext
|
|
22
|
+
*/
|
|
23
|
+
import { trace } from '@opentelemetry/api';
|
|
24
|
+
import { authContext as alsAuthContext } from '../../mcp-server/transports/auth/lib/authContext.js';
|
|
25
|
+
import { generateRequestContextId } from '../../utils/security/idGenerator.js';
|
|
26
|
+
/**
|
|
27
|
+
* Singleton-like service object for managing request context operations.
|
|
28
|
+
* @private
|
|
29
|
+
*/
|
|
30
|
+
const requestContextServiceInstance = {
|
|
31
|
+
/**
|
|
32
|
+
* Creates a new {@link RequestContext} with a guaranteed unique `requestId`
|
|
33
|
+
* and current ISO 8601 `timestamp`.
|
|
34
|
+
*
|
|
35
|
+
* Merge order (later entries win, except `requestId`/`timestamp` which are
|
|
36
|
+
* always generated fresh or inherited):
|
|
37
|
+
* 1. `parentContext` properties (base)
|
|
38
|
+
* 2. Remaining spread params (everything in `params` except named fields)
|
|
39
|
+
* 3. `additionalContext` properties (`requestId`/`timestamp` stripped)
|
|
40
|
+
* 4. Resolved `requestId` and `timestamp` (canonical, never overwritten)
|
|
41
|
+
* 5. Resolved `tenantId` (see priority order in {@link RequestContext.tenantId})
|
|
42
|
+
* 6. `operation` (written as `context.operation` when provided)
|
|
43
|
+
* 7. OTel `traceId`/`spanId` from the active span (when present)
|
|
44
|
+
*
|
|
45
|
+
* @param params - Context creation parameters. Defaults to `{}`.
|
|
46
|
+
* @returns A fully constructed `RequestContext`.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* // Minimal — generates a fresh requestId and timestamp
|
|
51
|
+
* const ctx = requestContextService.createRequestContext();
|
|
52
|
+
*
|
|
53
|
+
* // Propagate an existing request ID across a call chain
|
|
54
|
+
* const childCtx = requestContextService.createRequestContext({
|
|
55
|
+
* parentContext: incomingCtx,
|
|
56
|
+
* operation: 'processItem',
|
|
57
|
+
* additionalContext: { itemId: item.id },
|
|
58
|
+
* });
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
createRequestContext(params = {}) {
|
|
62
|
+
const { parentContext, additionalContext, operation, ...rest } = params;
|
|
63
|
+
const inheritedContext = parentContext && typeof parentContext === 'object' ? { ...parentContext } : {};
|
|
64
|
+
const authStore = alsAuthContext.getStore();
|
|
65
|
+
const tenantIdFromAuth = authStore?.authInfo?.tenantId;
|
|
66
|
+
const requestId = typeof inheritedContext.requestId === 'string' && inheritedContext.requestId
|
|
67
|
+
? inheritedContext.requestId
|
|
68
|
+
: generateRequestContextId();
|
|
69
|
+
const timestamp = new Date().toISOString();
|
|
70
|
+
const extractTenantId = (obj) => obj != null && typeof obj.tenantId === 'string' ? obj.tenantId : undefined;
|
|
71
|
+
const resolvedTenantId = extractTenantId(additionalContext) ??
|
|
72
|
+
extractTenantId(rest) ??
|
|
73
|
+
extractTenantId(inheritedContext) ??
|
|
74
|
+
tenantIdFromAuth;
|
|
75
|
+
// Strip system fields from additionalContext to prevent overwriting requestId/timestamp
|
|
76
|
+
const { requestId: _r, timestamp: _t, ...safeAdditional } = additionalContext && typeof additionalContext === 'object' ? additionalContext : {};
|
|
77
|
+
const context = {
|
|
78
|
+
...inheritedContext,
|
|
79
|
+
...rest, // Spread any other properties from the params object
|
|
80
|
+
...safeAdditional,
|
|
81
|
+
requestId,
|
|
82
|
+
timestamp,
|
|
83
|
+
...(resolvedTenantId ? { tenantId: resolvedTenantId } : {}),
|
|
84
|
+
...(operation && typeof operation === 'string' ? { operation } : {}),
|
|
85
|
+
};
|
|
86
|
+
// --- OpenTelemetry Integration ---
|
|
87
|
+
const activeSpan = trace.getActiveSpan();
|
|
88
|
+
if (activeSpan && typeof activeSpan.spanContext === 'function') {
|
|
89
|
+
const spanContext = activeSpan.spanContext();
|
|
90
|
+
if (spanContext) {
|
|
91
|
+
context.traceId = spanContext.traceId;
|
|
92
|
+
context.spanId = spanContext.spanId;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// --- End OpenTelemetry Integration ---
|
|
96
|
+
return context;
|
|
97
|
+
},
|
|
98
|
+
/**
|
|
99
|
+
* Creates a new {@link RequestContext} enriched with authentication information.
|
|
100
|
+
* This method populates the context with auth data from a validated token,
|
|
101
|
+
* including tenant ID, client ID, scopes, and subject.
|
|
102
|
+
*
|
|
103
|
+
* **Note:** This method builds and returns a `RequestContext` object only.
|
|
104
|
+
* It does NOT propagate auth into `AsyncLocalStorage`. ALS propagation is
|
|
105
|
+
* handled by the auth middleware via `authContext.run()`. If you need
|
|
106
|
+
* scope enforcement via `withRequiredScopes()`, ensure the call runs
|
|
107
|
+
* inside the middleware's ALS continuation.
|
|
108
|
+
*
|
|
109
|
+
* @param authInfo - The validated authentication information from JWT/OAuth token.
|
|
110
|
+
* @param parentContext - Optional parent context to inherit properties from.
|
|
111
|
+
* @returns A new `RequestContext` object with auth information populated.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```typescript
|
|
115
|
+
* const authInfo = await jwtStrategy.verify(token);
|
|
116
|
+
* const context = requestContextService.withAuthInfo(authInfo);
|
|
117
|
+
* // context now includes: { requestId, timestamp, tenantId, auth: {...}, ... }
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
withAuthInfo(authInfo, parentContext) {
|
|
121
|
+
const baseContext = this.createRequestContext({
|
|
122
|
+
operation: 'withAuthInfo',
|
|
123
|
+
parentContext,
|
|
124
|
+
additionalContext: {
|
|
125
|
+
tenantId: authInfo.tenantId,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
// Populate auth property with structured authentication context
|
|
129
|
+
const authContext = {
|
|
130
|
+
sub: authInfo.subject ?? authInfo.clientId,
|
|
131
|
+
scopes: authInfo.scopes,
|
|
132
|
+
clientId: authInfo.clientId,
|
|
133
|
+
token: authInfo.token,
|
|
134
|
+
...(authInfo.tenantId ? { tenantId: authInfo.tenantId } : {}),
|
|
135
|
+
};
|
|
136
|
+
return {
|
|
137
|
+
...baseContext,
|
|
138
|
+
auth: authContext,
|
|
139
|
+
};
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Service for creating and enriching {@link RequestContext} instances.
|
|
144
|
+
*
|
|
145
|
+
* The two primary methods cover the full lifecycle:
|
|
146
|
+
* - {@link requestContextService.createRequestContext} — general-purpose context
|
|
147
|
+
* creation with parent propagation and OTel integration.
|
|
148
|
+
* - {@link requestContextService.withAuthInfo} — enriches a context with
|
|
149
|
+
* structured auth data from a validated token.
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```typescript
|
|
153
|
+
* import { requestContextService } from '../../utils/internal/requestContext.js';
|
|
154
|
+
*
|
|
155
|
+
* // Create a root context for an incoming request
|
|
156
|
+
* const ctx = requestContextService.createRequestContext({ operation: 'handleRequest' });
|
|
157
|
+
*
|
|
158
|
+
* // Enrich with auth after token verification
|
|
159
|
+
* const authCtx = requestContextService.withAuthInfo(verifiedAuthInfo, ctx);
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
export const requestContextService = requestContextServiceInstance;
|
|
163
|
+
//# sourceMappingURL=requestContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestContext.js","sourceRoot":"","sources":["../../../src/utils/internal/requestContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,WAAW,IAAI,cAAc,EAAE,MAAM,iDAAiD,CAAC;AAEhG,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAuI3E;;;GAGG;AACH,MAAM,6BAA6B,GAAG;IACpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,oBAAoB,CAAC,SAAqC,EAAE;QAC1D,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QAExE,MAAM,gBAAgB,GACpB,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEjF,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,gBAAgB,GAAG,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC;QAEvD,MAAM,SAAS,GACb,OAAO,gBAAgB,CAAC,SAAS,KAAK,QAAQ,IAAI,gBAAgB,CAAC,SAAS;YAC1E,CAAC,CAAC,gBAAgB,CAAC,SAAS;YAC5B,CAAC,CAAC,wBAAwB,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE3C,MAAM,eAAe,GAAG,CAAC,GAAwC,EAAsB,EAAE,CACvF,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7E,MAAM,gBAAgB,GACpB,eAAe,CAAC,iBAAiB,CAAC;YAClC,eAAe,CAAC,IAA+B,CAAC;YAChD,eAAe,CAAC,gBAAgB,CAAC;YACjC,gBAAgB,CAAC;QAEnB,wFAAwF;QACxF,MAAM,EACJ,SAAS,EAAE,EAAE,EACb,SAAS,EAAE,EAAE,EACb,GAAG,cAAc,EAClB,GAAG,iBAAiB,IAAI,OAAO,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;QAExF,MAAM,OAAO,GAAmB;YAC9B,GAAG,gBAAgB;YACnB,GAAG,IAAI,EAAE,qDAAqD;YAC9D,GAAG,cAAc;YACjB,SAAS;YACT,SAAS;YACT,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC;QAEF,oCAAoC;QACpC,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;QACzC,IAAI,UAAU,IAAI,OAAO,UAAU,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YAC/D,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;YAC7C,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;gBACtC,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;YACtC,CAAC;QACH,CAAC;QACD,wCAAwC;QAExC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,YAAY,CACV,QAAkB,EAClB,aAAwD;QAExD,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC;YAC5C,SAAS,EAAE,cAAc;YACzB,aAAa;YACb,iBAAiB,EAAE;gBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B;SACF,CAAC,CAAC;QAEH,gEAAgE;QAChE,MAAM,WAAW,GAAgB;YAC/B,GAAG,EAAE,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,QAAQ;YAC1C,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC;QAEF,OAAO;YACL,GAAG,WAAW;YACd,IAAI,EAAE,WAAW;SAClB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Runtime capability detection for multi-environment support.
|
|
3
|
+
* Detects presence of Node features, Web/Workers APIs, and common globals.
|
|
4
|
+
* @module src/utils/internal/runtime
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Snapshot of runtime feature availability detected at module load time.
|
|
8
|
+
* All fields are booleans computed once via safe feature-detection; they never
|
|
9
|
+
* throw and never change after the module is first imported.
|
|
10
|
+
*/
|
|
11
|
+
export interface RuntimeCapabilities {
|
|
12
|
+
/** True when the Node.js `Buffer` global is available. */
|
|
13
|
+
hasBuffer: boolean;
|
|
14
|
+
/** True when `globalThis.performance.now` is a callable function. */
|
|
15
|
+
hasPerformanceNow: boolean;
|
|
16
|
+
/** True when the `process` global is defined (Node.js, Bun, or some bundled envs). */
|
|
17
|
+
hasProcess: boolean;
|
|
18
|
+
/** True when `TextEncoder` is available on `globalThis`. */
|
|
19
|
+
hasTextEncoder: boolean;
|
|
20
|
+
/** True when running in a browser main thread (has `window`, not a Worker or Node). */
|
|
21
|
+
isBrowserLike: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* True when running under Bun.
|
|
24
|
+
* Bun sets both `process.versions.node` and `process.versions.bun`,
|
|
25
|
+
* so `isNode` is also true in Bun environments.
|
|
26
|
+
*/
|
|
27
|
+
isBun: boolean;
|
|
28
|
+
/** True when `process.versions.node` is a string (Node.js or Bun). */
|
|
29
|
+
isNode: boolean;
|
|
30
|
+
/** True when running inside a Web Worker or Cloudflare Worker (`WorkerGlobalScope` is present). */
|
|
31
|
+
isWorkerLike: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Singleton snapshot of runtime capabilities for the current environment.
|
|
35
|
+
* Computed once at module load; safe to read at any time without async.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* import { runtimeCaps } from './runtime.js';
|
|
40
|
+
*
|
|
41
|
+
* if (runtimeCaps.hasBuffer) {
|
|
42
|
+
* // Node.js / Bun path — use Buffer for encoding
|
|
43
|
+
* } else {
|
|
44
|
+
* // Worker / browser path — use Web APIs
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare const runtimeCaps: RuntimeCapabilities;
|
|
49
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/utils/internal/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,0DAA0D;IAC1D,SAAS,EAAE,OAAO,CAAC;IACnB,qEAAqE;IACrE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,UAAU,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,cAAc,EAAE,OAAO,CAAC;IACxB,uFAAuF;IACvF,aAAa,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,KAAK,EAAE,OAAO,CAAC;IACf,sEAAsE;IACtE,MAAM,EAAE,OAAO,CAAC;IAChB,mGAAmG;IACnG,YAAY,EAAE,OAAO,CAAC;CACvB;AAiED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,EAAE,mBASzB,CAAC"}
|