synapse-storage
Version:
Набор инструментов для управления состоянием и апи-запросами
42 lines (37 loc) • 2.19 kB
JavaScript
import { handleOperationError } from "../../_utils/error-handling.util.js";
const DEFAULT_DEPENDENCY_TIMEOUT = 30000;
/**
* Извлекает IStorageBase из любого формата зависимости:
* - IStorageBase напрямую (есть waitForReady)
* - { storage: IStorageBase } — обёртка
* - готовый synapse — результат createSynapse (тоже имеет .storage)
*/ function extractStorage(dep) {
if (typeof dep.waitForReady === 'function') return dep;
if (dep.storage && typeof dep.storage.waitForReady === 'function') return dep.storage;
throw new Error('Invalid dependency: expected IStorageBase or { storage: IStorageBase }');
}
async function waitForDependencies(dependencies = [], timeoutMs = DEFAULT_DEPENDENCY_TIMEOUT) {
if (dependencies.length === 0) {
return;
}
// Намеренно БЕЗ безусловного лога «Waiting for N dependencies»: при нормальном старте это чистый
// шум (по строке на каждый зависящий модуль). Единственный actionable сигнал — таймаут ниже,
// который называет конкретный зависший dependency.
await Promise.all(dependencies.map(async (dependencyOrPromise, index)=>{
try {
const resolved = await dependencyOrPromise;
const storage = extractStorage(resolved);
const name = storage.name || 'unnamed';
// initialize() идемпотентен — повторный вызов безопасен
await storage.initialize();
await Promise.race([
storage.waitForReady(),
new Promise((_, reject)=>globalThis.setTimeout(()=>reject(new Error(`Dependency ${index} ("${name}") timed out after ${timeoutMs}ms. Check that it initializes correctly.`)), timeoutMs))
]);
} catch (error) {
handleOperationError(`createSynapse: dependency ${index} failed to initialize`, error);
}
}));
}
export { waitForDependencies };
//# sourceMappingURL=waitForDependencies.js.map