feat: add reusable jobqueue library

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-05-16 00:51:54 +02:00
commit 34ca0fe17d
30 changed files with 6405 additions and 0 deletions

View File

@@ -0,0 +1,76 @@
import { SqliteStorage } from '../src/index.js';
import { cleanupDir, createDbPath, createTempDir } from './helpers.js';
describe('SqliteStorage', () => {
it('creates, updates, and completes jobs', () => {
const dir = createTempDir();
const storage = new SqliteStorage<{ url: string }>(createDbPath(dir));
try {
const job = storage.createJob(
'job-1',
{ url: 'https://example.com' },
[
{
name: 'download',
status: 'pending',
progress: 0,
message: null,
startedAt: null,
completedAt: null,
error: null,
},
],
{},
3,
);
expect(job.status).toBe('pending');
expect(storage.claimPendingJob(job.id)).toBe(true);
const inProgress = storage.saveProgress(
job.id,
'download',
[
{
name: 'download',
status: 'active',
progress: 50,
message: 'halfway',
startedAt: new Date().toISOString(),
completedAt: null,
error: null,
},
],
50,
'halfway',
);
expect(inProgress.status).toBe('active');
expect(inProgress.progress).toBe(50);
const completed = storage.completeJob(
job.id,
[
{
name: 'download',
status: 'completed',
progress: 100,
message: null,
startedAt: new Date().toISOString(),
completedAt: new Date().toISOString(),
error: null,
},
],
{ download: { filePath: '/tmp/file' } },
);
expect(completed.status).toBe('completed');
expect(completed.progress).toBe(100);
expect(completed.phaseResults.download).toEqual({ filePath: '/tmp/file' });
} finally {
storage.close();
cleanupDir(dir);
}
});
});