mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-30 15:18:50 +01:00
Some checks failed
Docker Dev Branch Images Build / build (Dockerfile, lc-dev, node) (push) Has been cancelled
Docker Dev Branch Images Build / build (Dockerfile.multi, lc-dev-api, api-build) (push) Has been cancelled
Docker Dev Images Build / build (Dockerfile, librechat-dev, node) (push) Has been cancelled
Docker Dev Images Build / build (Dockerfile.multi, librechat-dev-api, api-build) (push) Has been cancelled
Sync Locize Translations & Create Translation PR / Sync Translation Keys with Locize (push) Has been cancelled
Sync Locize Translations & Create Translation PR / Create Translation PR on Version Published (push) Has been cancelled
* refactor: Restructure MCP registry system with caching - Split MCPServersRegistry into modular components: - MCPServerInspector: handles server inspection and health checks - MCPServersInitializer: manages server initialization logic - MCPServersRegistry: simplified registry coordination - Add distributed caching layer: - ServerConfigsCacheRedis: Redis-backed configuration cache - ServerConfigsCacheInMemory: in-memory fallback cache - RegistryStatusCache: distributed leader election state - Add promise utilities (withTimeout) replacing Promise.race patterns - Add comprehensive cache integration tests for all cache implementations - Remove unused MCPManager.getAllToolFunctions method * fix: Update OAuth flow to include user-specific headers * chore: Update Jest configuration to ignore additional test files - Added patterns to ignore files ending with .helper.ts and .helper.d.ts in testPathIgnorePatterns for cleaner test runs. * fix: oauth headers in callback * chore: Update Jest testPathIgnorePatterns to exclude helper files - Modified testPathIgnorePatterns in package.json to ignore files ending with .helper.ts and .helper.d.ts for cleaner test execution. * ci: update test mocks --------- Co-authored-by: Danny Avila <danny@librechat.ai>
42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
/**
|
|
* Wraps a promise with a timeout. If the promise doesn't resolve/reject within
|
|
* the specified time, it will be rejected with a timeout error.
|
|
*
|
|
* @param promise - The promise to wrap with a timeout
|
|
* @param timeoutMs - Timeout duration in milliseconds
|
|
* @param errorMessage - Custom error message for timeout (optional)
|
|
* @param logger - Optional logger function to log timeout errors (e.g., console.warn, logger.warn)
|
|
* @returns Promise that resolves/rejects with the original promise or times out
|
|
*
|
|
* @example
|
|
* ```typescript
|
|
* const result = await withTimeout(
|
|
* fetchData(),
|
|
* 5000,
|
|
* 'Failed to fetch data within 5 seconds',
|
|
* console.warn
|
|
* );
|
|
* ```
|
|
*/
|
|
export async function withTimeout<T>(
|
|
promise: Promise<T>,
|
|
timeoutMs: number,
|
|
errorMessage?: string,
|
|
logger?: (message: string, error: Error) => void,
|
|
): Promise<T> {
|
|
let timeoutId: NodeJS.Timeout;
|
|
|
|
const timeoutPromise = new Promise<never>((_, reject) => {
|
|
timeoutId = setTimeout(() => {
|
|
const error = new Error(errorMessage ?? `Operation timed out after ${timeoutMs}ms`);
|
|
if (logger) logger(error.message, error);
|
|
reject(error);
|
|
}, timeoutMs);
|
|
});
|
|
|
|
try {
|
|
return await Promise.race([promise, timeoutPromise]);
|
|
} finally {
|
|
clearTimeout(timeoutId!);
|
|
}
|
|
}
|