@dreamhorizonorg/sentinel
Version:
Open-source, zero-dependency tool that blocks compromised packages BEFORE download. Built to counter supply chain and credential theft attacks like Shai-Hulud.
79 lines (65 loc) • 2.09 kB
JavaScript
/**
* Vulnerability Providers
* Central registry and manager for all vulnerability providers
*/
import { OSVProvider } from './osv.provider.mjs';
import { GitHubAdvisoriesProvider } from './github-advisories.provider.mjs';
import { SnykProvider } from './snyk.provider.mjs';
/**
* All available providers
*/
export const PROVIDERS = {
OSV: OSVProvider,
GITHUB: GitHubAdvisoriesProvider,
SNYK: SnykProvider
};
/**
* Get enabled providers from config
*/
export function getEnabledProviders(config = {}) {
const providers = [];
const providersConfig = config.providers ?? {};
// OSV (enabled by default)
if (providersConfig.osv?.enabled !== false) {
providers.push(new OSVProvider());
}
// GitHub Advisories (enabled by default)
if (providersConfig.github?.enabled !== false) {
providers.push(new GitHubAdvisoriesProvider());
}
// Snyk (disabled by default, requires token)
if (providersConfig.snyk?.enabled === true) {
providers.push(new SnykProvider());
}
return providers;
}
/**
* Check package against all enabled providers
* Returns first vulnerability found (most severe)
*/
export async function checkWithProviders(packageName, version = null, config = {}) {
const providers = getEnabledProviders(config);
const providersConfig = config.providers ?? {};
if (providers.length === 0) {
return { found: false };
}
// Check all providers in parallel
const results = await Promise.allSettled(
providers.map(provider => {
// Map provider name to config key
let configKey = provider.name.toLowerCase().replace(/\s+/g, '');
if (configKey === 'githubadvisories') {
configKey = 'github';
}
const providerConfig = providersConfig[configKey] ?? {};
return provider.check(packageName, version, { ...config, ...providerConfig });
})
);
// Find first vulnerability (providers are ordered by priority)
for (const result of results) {
if (result.status === 'fulfilled' && result.value.found) {
return result.value;
}
}
return { found: false };
}