This commit is contained in:
Pierre
2026-02-07 12:50:34 +01:00
parent bad6ddace2
commit 725d22c98f
4 changed files with 15 additions and 116 deletions
@@ -38,7 +38,6 @@ export class UnifiedAPIServer {
private getDuplicateResult: (() => DuplicateResult | null) | null = null;
private kvClient: IKVClient | null = null;
private kvManager: KVManager | null = null;
private triggerScanCallback: (() => Promise<void>) | null = null;
private getQueueStatus: (() => any) | null = null;
private fastQueueConcurrency: number | undefined = undefined;
private backgroundQueueConcurrency: number | undefined = undefined;
@@ -59,7 +58,6 @@ export class UnifiedAPIServer {
unifiedStateManager?: UnifiedProcessingStateManager,
getDuplicateResult?: () => DuplicateResult | null,
kvClient?: IKVClient,
triggerScanCallback?: () => Promise<void>,
backgroundQueueConcurrency?: number,
fastQueueConcurrency?: number,
getQueueStatus?: () => any,
@@ -72,7 +70,6 @@ export class UnifiedAPIServer {
this.getDuplicateResult = getDuplicateResult || null;
this.kvClient = kvClient || null;
this.kvManager = kvManager || null;
this.triggerScanCallback = triggerScanCallback || null;
this.getQueueStatus = getQueueStatus || null;
this.backgroundQueueConcurrency = backgroundQueueConcurrency;
this.fastQueueConcurrency = fastQueueConcurrency;
@@ -724,12 +721,6 @@ export class UnifiedAPIServer {
// Add file back to discovered state for reprocessing
this.unifiedStateManager!.addDiscovered(filePath);
// Trigger scan callback if available to pick up the file
if (this.triggerScanCallback) {
// Don't await - just trigger async
this.triggerScanCallback().catch(err => console.warn('[API] Scan trigger failed during retry:', getErrorMessage(err)));
}
return { status: 'ok', message: `File ${filePath} queued for retry` };
} catch (error: any) {
return reply.status(500).send({ error: error.message });
@@ -747,11 +738,6 @@ export class UnifiedAPIServer {
queued++;
}
// Trigger scan callback if available
if (this.triggerScanCallback) {
this.triggerScanCallback().catch(err => console.warn('[API] Scan trigger failed during retry-all:', getErrorMessage(err)));
}
return { status: 'ok', message: `${queued} files queued for retry` };
});
@@ -883,40 +869,12 @@ export class UnifiedAPIServer {
}
/**
* Setup Scan Trigger API routes
* Setup Metadata Clear API routes
* NOTE: /api/scan/trigger has been removed - use meta-core's endpoint instead
*/
private setupScanRoutes(): void {
// Trigger manual scan
this.app.post('/api/scan/trigger', async (request, reply) => {
if (!this.triggerScanCallback) {
return reply.status(503).send({
status: 'error',
message: 'Scan trigger not available'
});
}
try {
console.log('Manual scan triggered via API');
// Don't await - trigger and return immediately
this.triggerScanCallback().catch(error => {
console.error('Error during triggered scan:', error);
});
return {
status: 'ok',
message: 'Scan triggered successfully'
};
} catch (error: any) {
console.error('Error triggering scan:', error);
return reply.status(500).send({
status: 'error',
message: 'Failed to trigger scan',
details: error.message
});
}
});
// Clear all metadata and trigger rescan
// Clear all metadata
// NOTE: To trigger a rescan after clearing, call meta-core's /api/scan/trigger endpoint
this.app.post('/api/metadata/clear', async (request, reply) => {
if (!this.kvClient) {
return reply.status(503).send({
@@ -950,19 +908,10 @@ export class UnifiedAPIServer {
console.log(`Cleared ${deletedCount} file metadata entries`);
// Trigger rescan if callback is available
if (this.triggerScanCallback) {
console.log('Triggering rescan after metadata clear');
this.triggerScanCallback().catch(error => {
console.error('Error during post-clear rescan:', error);
});
}
return {
status: 'ok',
message: `Cleared ${deletedCount} files`,
deletedCount,
rescanTriggered: !!this.triggerScanCallback
message: `Cleared ${deletedCount} files. To rescan, call meta-core's /api/scan/trigger endpoint.`,
deletedCount
};
} catch (error: any) {
console.error('Error clearing metadata:', error);
@@ -1964,7 +1913,6 @@ export class UnifiedAPIServer {
if (this.unifiedStateManager) {
console.log(` - Unified Processing API (4 states): http://${this.config.host}:${this.config.port}/api/processing/status`);
}
console.log(` - Scan API: http://${this.config.host}:${this.config.port}/api/scan/trigger (POST)`);
} catch (error) {
console.error('Error starting Unified API Server:', error);
throw error;
+2 -15
View File
@@ -270,7 +270,6 @@ describe('UnifiedAPIServer', function() {
mockStateManager as any,
() => duplicateResult,
mockKV as any,
async () => { /* scan trigger */ },
4, // backgroundQueueConcurrency
16, // fastQueueConcurrency
() => ({ fast: { pending: 0, running: 0 }, background: { pending: 0, running: 0 } })
@@ -463,20 +462,8 @@ describe('UnifiedAPIServer', function() {
});
});
// =========================================================================
// Scan API
// =========================================================================
describe('Scan API (/api/scan)', function() {
it('POST /api/scan/trigger triggers a scan', async function() {
const response = await app.inject({
method: 'POST',
url: '/api/scan/trigger'
});
expect([200, 202, 204]).to.include(response.statusCode);
});
});
// NOTE: /api/scan/trigger has been removed from meta-sort (Architecture V3)
// Scan is now handled by meta-core. Tests for scan trigger are in core.bats.
// =========================================================================
// FUSE API (Virtual Filesystem)
@@ -98,24 +98,8 @@ export class EventSubscriber {
console.log('[EventSubscriber] Stopped');
}
/**
* Trigger a manual scan on meta-core
*/
async triggerScan(): Promise<void> {
try {
const response = await fetch(`${this.options.metaCoreUrl}/api/scan/trigger`, {
method: 'POST'
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
console.log('[EventSubscriber] Scan triggered on meta-core');
} catch (error) {
console.error('[EventSubscriber] Failed to trigger scan:', error);
}
}
// NOTE: triggerScan() has been removed - meta-core handles scanning automatically
// To trigger a scan manually, call meta-core's /api/scan/trigger endpoint directly
/**
* Get watcher status from meta-core
@@ -171,13 +155,7 @@ export class EventSubscriber {
this.eventSource.onopen = () => {
console.log('[EventSubscriber] Connected to meta-core SSE');
this.reconnectAttempts = 0;
// Request initial scan if configured
if (this.options.requestInitialScan) {
this.triggerScan().catch(err => {
console.error('[EventSubscriber] Failed to trigger initial scan:', err);
});
}
// NOTE: Initial scan is handled automatically by meta-core (Architecture V3)
};
this.eventSource.onerror = (error) => {
+4 -18
View File
@@ -79,22 +79,8 @@ const getDuplicateResult = () => fileProcessor.getDuplicateResult();
// API Server will be initialized after KV is ready (deferred to async init)
let apiServer: UnifiedAPIServer | null = null;
// Manual scan trigger (called from API) - delegates to meta-core via EventSubscriber
const triggerScan = async () => {
console.log('[Scan] Triggering manual scan...');
// Reset pipeline counters and state before fresh scan
// Also publishes reset event to meta-fuse
await pipeline.reset();
// Trigger scan on meta-core (which will send events back via SSE)
if (eventSubscriber) {
await eventSubscriber.triggerScan();
console.log('[Scan] Scan triggered on meta-core');
} else {
console.warn('[Scan] EventSubscriber not available, cannot trigger scan');
}
};
// NOTE: Scan trigger has been moved to meta-core (Architecture V3)
// Use meta-core's /api/scan/trigger endpoint directly
// Global error handlers - prevent crashes from unforeseen errors
process.on('uncaughtException', (error: Error) => {
@@ -178,7 +164,7 @@ process.on('SIGINT', async () => {
port: config.FUSE_API_PORT,
host: config.FUSE_API_HOST,
enableCors: true,
}, unifiedStateManager, getDuplicateResult, kvClient || undefined, triggerScan, backgroundQueueConcurrency, fastQueueConcurrency, () => fileProcessor.getQueueStatus(), kvManager || undefined, getPluginManagerInstance, () => fileProcessor.getTaskScheduler());
}, unifiedStateManager, getDuplicateResult, kvClient || undefined, backgroundQueueConcurrency, fastQueueConcurrency, () => fileProcessor.getQueueStatus(), kvManager || undefined, getPluginManagerInstance, () => fileProcessor.getTaskScheduler());
await apiServer.start();
console.log('Unified API Server started successfully');
@@ -269,7 +255,7 @@ process.on('SIGINT', async () => {
console.error('[Startup] Make sure meta-core is running and kv-leader.info exists.');
process.exit(1);
}
const metaCoreUrl = leaderInfo.baseUrl;
const metaCoreUrl = leaderInfo.apiUrl;
console.log(`[Startup] Connecting to meta-core at ${metaCoreUrl}...`);
eventSubscriber = new EventSubscriber({
metaCoreUrl: metaCoreUrl,