@rudderjs/horizon 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,36 @@
1
+ import { ServiceProvider, type Application } from '@rudderjs/core';
2
+ import { type HorizonConfig, type HorizonStorage, type HorizonJob, type QueueMetric, type WorkerInfo, type JobStatus, type JobListOptions } from './types.js';
3
+ export type { HorizonConfig, HorizonStorage, HorizonJob, QueueMetric, WorkerInfo, JobStatus, JobListOptions };
4
+ export { MemoryStorage, SqliteStorage } from './storage.js';
5
+ export { JobCollector } from './collectors/job.js';
6
+ export { MetricsCollector } from './collectors/metrics.js';
7
+ export { WorkerCollector } from './collectors/worker.js';
8
+ export declare class HorizonRegistry {
9
+ private static storage;
10
+ static set(storage: HorizonStorage): void;
11
+ static get(): HorizonStorage | null;
12
+ /** @internal — clears the registered storage. Used for testing. */
13
+ static reset(): void;
14
+ }
15
+ export declare class Horizon {
16
+ private static store;
17
+ static recentJobs(options?: JobListOptions): HorizonJob[] | Promise<HorizonJob[]>;
18
+ static failedJobs(options?: JobListOptions): HorizonJob[] | Promise<HorizonJob[]>;
19
+ static findJob(id: string): HorizonJob | null | Promise<HorizonJob | null>;
20
+ static currentMetrics(): QueueMetric[] | Promise<QueueMetric[]>;
21
+ static workers(): WorkerInfo[] | Promise<WorkerInfo[]>;
22
+ static jobCount(status?: JobStatus): number | Promise<number>;
23
+ }
24
+ /**
25
+ * Returns a HorizonServiceProvider class for deep queue monitoring.
26
+ *
27
+ * Tracks job lifecycle (dispatch → processing → completed/failed),
28
+ * queue-level metrics (throughput, wait time, runtime),
29
+ * and worker status (memory, jobs processed).
30
+ *
31
+ * Usage in bootstrap/providers.ts:
32
+ * import { horizon } from '@rudderjs/horizon'
33
+ * export default [..., horizon(configs.horizon), ...]
34
+ */
35
+ export declare function horizon(config?: HorizonConfig): new (app: Application) => ServiceProvider;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAMlE,OAAO,EAEL,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EACxD,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EACvE,MAAM,YAAY,CAAA;AAInB,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,CAAA;AAC7G,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAIxD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,OAAO,CAA8B;IAEpD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IACzC,MAAM,CAAC,GAAG,IAAI,cAAc,GAAG,IAAI;IACnC,mEAAmE;IACnE,MAAM,CAAC,KAAK,IAAI,IAAI;CACrB;AAID,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAC,KAAK;IAMpB,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIjF,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIjF,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAI1E,MAAM,CAAC,cAAc,IAAI,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI/D,MAAM,CAAC,OAAO,IAAI,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAItD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG9D;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,MAAM,GAAE,aAAkB,GAAG,KAAK,GAAG,EAAE,WAAW,KAAK,eAAe,CA6D7F"}
package/dist/index.js ADDED
@@ -0,0 +1,113 @@
1
+ import { ServiceProvider } from '@rudderjs/core';
2
+ import { MemoryStorage, SqliteStorage } from './storage.js';
3
+ import { JobCollector } from './collectors/job.js';
4
+ import { MetricsCollector } from './collectors/metrics.js';
5
+ import { WorkerCollector } from './collectors/worker.js';
6
+ import { registerRoutes } from './api/routes.js';
7
+ import { defaultConfig, } from './types.js';
8
+ export { MemoryStorage, SqliteStorage } from './storage.js';
9
+ export { JobCollector } from './collectors/job.js';
10
+ export { MetricsCollector } from './collectors/metrics.js';
11
+ export { WorkerCollector } from './collectors/worker.js';
12
+ // ─── Horizon Registry ──────────────────────────────────────
13
+ export class HorizonRegistry {
14
+ static storage = null;
15
+ static set(storage) { this.storage = storage; }
16
+ static get() { return this.storage; }
17
+ /** @internal — clears the registered storage. Used for testing. */
18
+ static reset() { this.storage = null; }
19
+ }
20
+ // ─── Horizon Facade ────────────────────────────────────────
21
+ export class Horizon {
22
+ static store() {
23
+ const s = HorizonRegistry.get();
24
+ if (!s)
25
+ throw new Error('[RudderJS Horizon] No storage registered. Add horizon() to providers.');
26
+ return s;
27
+ }
28
+ static recentJobs(options) {
29
+ return this.store().recentJobs(options);
30
+ }
31
+ static failedJobs(options) {
32
+ return this.store().failedJobs(options);
33
+ }
34
+ static findJob(id) {
35
+ return this.store().findJob(id);
36
+ }
37
+ static currentMetrics() {
38
+ return this.store().currentMetrics();
39
+ }
40
+ static workers() {
41
+ return this.store().workers();
42
+ }
43
+ static jobCount(status) {
44
+ return this.store().jobCount(status);
45
+ }
46
+ }
47
+ // ─── Service Provider Factory ──────────────────────────────
48
+ /**
49
+ * Returns a HorizonServiceProvider class for deep queue monitoring.
50
+ *
51
+ * Tracks job lifecycle (dispatch → processing → completed/failed),
52
+ * queue-level metrics (throughput, wait time, runtime),
53
+ * and worker status (memory, jobs processed).
54
+ *
55
+ * Usage in bootstrap/providers.ts:
56
+ * import { horizon } from '@rudderjs/horizon'
57
+ * export default [..., horizon(configs.horizon), ...]
58
+ */
59
+ export function horizon(config = {}) {
60
+ const resolved = {
61
+ enabled: config.enabled ?? defaultConfig.enabled,
62
+ path: config.path ?? defaultConfig.path,
63
+ storage: config.storage ?? defaultConfig.storage,
64
+ sqlitePath: config.sqlitePath ?? defaultConfig.sqlitePath,
65
+ maxJobs: config.maxJobs ?? defaultConfig.maxJobs,
66
+ pruneAfterHours: config.pruneAfterHours ?? defaultConfig.pruneAfterHours,
67
+ metricsIntervalMs: config.metricsIntervalMs ?? defaultConfig.metricsIntervalMs,
68
+ auth: config.auth ?? defaultConfig.auth,
69
+ };
70
+ class HorizonServiceProvider extends ServiceProvider {
71
+ register() {
72
+ this.publishes({
73
+ from: new URL('../../boost/guidelines.md', import.meta.url).pathname,
74
+ to: 'boost',
75
+ tag: 'horizon-boost',
76
+ });
77
+ }
78
+ async boot() {
79
+ if (!resolved.enabled)
80
+ return;
81
+ // ── Create storage ────────────────────────────────────
82
+ let storage;
83
+ if (resolved.storage === 'sqlite') {
84
+ storage = new SqliteStorage(resolved.sqlitePath);
85
+ }
86
+ else {
87
+ storage = new MemoryStorage(resolved.maxJobs);
88
+ }
89
+ HorizonRegistry.set(storage);
90
+ this.app.instance('horizon', storage);
91
+ // ── Auto-prune ────────────────────────────────────────
92
+ const pruneHours = resolved.pruneAfterHours;
93
+ if (pruneHours > 0) {
94
+ const interval = Math.min(pruneHours * 60 * 60 * 1000, 3_600_000);
95
+ const timer = setInterval(() => {
96
+ storage.pruneOlderThan(new Date(Date.now() - pruneHours * 60 * 60 * 1000));
97
+ }, interval);
98
+ timer.unref();
99
+ }
100
+ // ── Register collectors ───────────────────────────────
101
+ const jobCollector = new JobCollector(storage);
102
+ const metricsCollector = new MetricsCollector(storage, resolved.metricsIntervalMs);
103
+ const workerCollector = new WorkerCollector(storage);
104
+ jobCollector.register();
105
+ metricsCollector.register();
106
+ workerCollector.register();
107
+ // ── Register API routes ───────────────────────────────
108
+ await registerRoutes(storage, resolved);
109
+ }
110
+ }
111
+ return HorizonServiceProvider;
112
+ }
113
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { HorizonStorage, HorizonJob, QueueMetric, WorkerInfo, JobListOptions, JobStatus } from './types.js';
2
+ export declare class MemoryStorage implements HorizonStorage {
3
+ private readonly maxJobs;
4
+ private readonly jobs;
5
+ private readonly metricsHistory;
6
+ private readonly latestMetrics;
7
+ private readonly workerMap;
8
+ constructor(maxJobs?: number);
9
+ recordJob(job: HorizonJob): void;
10
+ updateJob(id: string, updates: Partial<HorizonJob>): void;
11
+ recentJobs(options?: JobListOptions): HorizonJob[];
12
+ failedJobs(options?: JobListOptions): HorizonJob[];
13
+ findJob(id: string): HorizonJob | null;
14
+ recordMetric(metric: QueueMetric): void;
15
+ metrics(queue: string, since: Date): QueueMetric[];
16
+ currentMetrics(): QueueMetric[];
17
+ recordWorker(worker: WorkerInfo): void;
18
+ workers(): WorkerInfo[];
19
+ deleteJob(id: string): void;
20
+ pruneOlderThan(date: Date): void;
21
+ jobCount(status?: JobStatus): number;
22
+ private filterJobs;
23
+ }
24
+ export declare class SqliteStorage implements HorizonStorage {
25
+ private readonly dbPath;
26
+ private db;
27
+ constructor(dbPath: string);
28
+ private getDb;
29
+ private migrate;
30
+ recordJob(job: HorizonJob): void;
31
+ updateJob(id: string, updates: Partial<HorizonJob>): void;
32
+ recentJobs(options?: JobListOptions): HorizonJob[];
33
+ failedJobs(options?: JobListOptions): HorizonJob[];
34
+ findJob(id: string): HorizonJob | null;
35
+ recordMetric(metric: QueueMetric): void;
36
+ metrics(queue: string, since: Date): QueueMetric[];
37
+ currentMetrics(): QueueMetric[];
38
+ recordWorker(worker: WorkerInfo): void;
39
+ workers(): WorkerInfo[];
40
+ deleteJob(id: string): void;
41
+ pruneOlderThan(date: Date): void;
42
+ jobCount(status?: JobStatus): number;
43
+ private queryJobs;
44
+ private jobFromRow;
45
+ private metricFromRow;
46
+ }
47
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EACnD,cAAc,EAAE,SAAS,EAC1B,MAAM,YAAY,CAAA;AAInB,qBAAa,aAAc,YAAW,cAAc;IAMtC,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwC;IACvE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsC;IACpE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;gBAElC,OAAO,GAAE,MAAa;IAEnD,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAOhC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IAKzD,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,EAAE;IAIlD,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,EAAE;IAIlD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAItC,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAQvC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,WAAW,EAAE;IASlD,cAAc,IAAI,WAAW,EAAE;IAI/B,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAItC,OAAO,IAAI,UAAU,EAAE;IAIvB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK3B,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAShC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM;IAKpC,OAAO,CAAC,UAAU;CAwBnB;AAID,qBAAa,aAAc,YAAW,cAAc;IAGtC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,EAAE,CAAiD;gBAE9B,MAAM,EAAE,MAAM;IAE3C,OAAO,CAAC,KAAK;IAYb,OAAO,CAAC,OAAO;IA6Cf,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAehC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IAgBzD,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,EAAE;IAIlD,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,EAAE;IAIlD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAKtC,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAWvC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,WAAW,EAAE;IAOlD,cAAc,IAAI,WAAW,EAAE;IAS/B,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAQtC,OAAO,IAAI,UAAU,EAAE;IAavB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI3B,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAOhC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM;IASpC,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,aAAa;CAYtB"}
@@ -0,0 +1,303 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ // ─── Memory Storage ────────────────────────────────────────
3
+ export class MemoryStorage {
4
+ maxJobs;
5
+ jobs = [];
6
+ metricsHistory = new Map();
7
+ latestMetrics = new Map();
8
+ workerMap = new Map();
9
+ constructor(maxJobs = 1000) {
10
+ this.maxJobs = maxJobs;
11
+ }
12
+ recordJob(job) {
13
+ this.jobs.unshift(job);
14
+ if (this.jobs.length > this.maxJobs) {
15
+ this.jobs.length = this.maxJobs;
16
+ }
17
+ }
18
+ updateJob(id, updates) {
19
+ const job = this.jobs.find(j => j.id === id);
20
+ if (job)
21
+ Object.assign(job, updates);
22
+ }
23
+ recentJobs(options) {
24
+ return this.filterJobs(options);
25
+ }
26
+ failedJobs(options) {
27
+ return this.filterJobs({ ...options, status: 'failed' });
28
+ }
29
+ findJob(id) {
30
+ return this.jobs.find(j => j.id === id) ?? null;
31
+ }
32
+ recordMetric(metric) {
33
+ this.latestMetrics.set(metric.queue, metric);
34
+ const history = this.metricsHistory.get(metric.queue) ?? [];
35
+ history.push(metric);
36
+ if (history.length > 1440)
37
+ history.shift(); // keep 24h at 1-min resolution
38
+ this.metricsHistory.set(metric.queue, history);
39
+ }
40
+ metrics(queue, since) {
41
+ const history = this.metricsHistory.get(queue) ?? [];
42
+ const sinceTs = since.getTime();
43
+ // Metrics don't have timestamps in the record — approximate by index
44
+ // For memory storage, return all history (it's already bounded)
45
+ void sinceTs;
46
+ return [...history];
47
+ }
48
+ currentMetrics() {
49
+ return [...this.latestMetrics.values()];
50
+ }
51
+ recordWorker(worker) {
52
+ this.workerMap.set(worker.id, worker);
53
+ }
54
+ workers() {
55
+ return [...this.workerMap.values()];
56
+ }
57
+ deleteJob(id) {
58
+ const idx = this.jobs.findIndex(j => j.id === id);
59
+ if (idx !== -1)
60
+ this.jobs.splice(idx, 1);
61
+ }
62
+ pruneOlderThan(date) {
63
+ const ts = date.getTime();
64
+ for (let i = this.jobs.length - 1; i >= 0; i--) {
65
+ if (this.jobs[i].dispatchedAt.getTime() < ts) {
66
+ this.jobs.splice(i, 1);
67
+ }
68
+ }
69
+ }
70
+ jobCount(status) {
71
+ if (!status)
72
+ return this.jobs.length;
73
+ return this.jobs.filter(j => j.status === status).length;
74
+ }
75
+ filterJobs(options) {
76
+ let result = [...this.jobs];
77
+ if (options?.status) {
78
+ const s = options.status;
79
+ result = result.filter(j => j.status === s);
80
+ }
81
+ if (options?.queue) {
82
+ const q = options.queue;
83
+ result = result.filter(j => j.queue === q);
84
+ }
85
+ if (options?.search) {
86
+ const s = options.search.toLowerCase();
87
+ result = result.filter(j => j.name.toLowerCase().includes(s) ||
88
+ JSON.stringify(j.payload).toLowerCase().includes(s));
89
+ }
90
+ const page = options?.page ?? 1;
91
+ const perPage = options?.perPage ?? 50;
92
+ const start = (page - 1) * perPage;
93
+ return result.slice(start, start + perPage);
94
+ }
95
+ }
96
+ // ─── SQLite Storage ────────────────────────────────────────
97
+ export class SqliteStorage {
98
+ dbPath;
99
+ db = null;
100
+ constructor(dbPath) {
101
+ this.dbPath = dbPath;
102
+ }
103
+ getDb() {
104
+ if (!this.db) {
105
+ const Database = globalThis.__betterSqlite3;
106
+ if (!Database) {
107
+ throw new Error('[RudderJS Horizon] better-sqlite3 is required for SQLite storage. Run: pnpm add better-sqlite3');
108
+ }
109
+ this.db = new Database(this.dbPath);
110
+ this.migrate();
111
+ }
112
+ return this.db;
113
+ }
114
+ migrate() {
115
+ this.db.exec(`
116
+ CREATE TABLE IF NOT EXISTS horizon_jobs (
117
+ id TEXT PRIMARY KEY,
118
+ name TEXT NOT NULL,
119
+ queue TEXT NOT NULL,
120
+ status TEXT NOT NULL,
121
+ payload TEXT NOT NULL DEFAULT '{}',
122
+ attempts INTEGER NOT NULL DEFAULT 0,
123
+ exception TEXT,
124
+ dispatched_at TEXT NOT NULL,
125
+ started_at TEXT,
126
+ completed_at TEXT,
127
+ duration INTEGER,
128
+ tags TEXT NOT NULL DEFAULT '[]'
129
+ );
130
+ CREATE INDEX IF NOT EXISTS idx_horizon_status ON horizon_jobs(status, dispatched_at);
131
+ CREATE INDEX IF NOT EXISTS idx_horizon_queue ON horizon_jobs(queue, dispatched_at);
132
+
133
+ CREATE TABLE IF NOT EXISTS horizon_metrics (
134
+ id TEXT PRIMARY KEY,
135
+ queue TEXT NOT NULL,
136
+ throughput INTEGER NOT NULL DEFAULT 0,
137
+ wait_time REAL NOT NULL DEFAULT 0,
138
+ runtime REAL NOT NULL DEFAULT 0,
139
+ pending INTEGER NOT NULL DEFAULT 0,
140
+ active INTEGER NOT NULL DEFAULT 0,
141
+ completed INTEGER NOT NULL DEFAULT 0,
142
+ failed INTEGER NOT NULL DEFAULT 0,
143
+ created_at TEXT NOT NULL
144
+ );
145
+ CREATE INDEX IF NOT EXISTS idx_horizon_metrics_queue ON horizon_metrics(queue, created_at);
146
+
147
+ CREATE TABLE IF NOT EXISTS horizon_workers (
148
+ id TEXT PRIMARY KEY,
149
+ queue TEXT NOT NULL,
150
+ status TEXT NOT NULL,
151
+ jobs_run INTEGER NOT NULL DEFAULT 0,
152
+ memory_mb REAL NOT NULL DEFAULT 0,
153
+ started_at TEXT NOT NULL,
154
+ last_job_at TEXT
155
+ );
156
+ `);
157
+ }
158
+ recordJob(job) {
159
+ this.getDb().prepare(`INSERT INTO horizon_jobs (id, name, queue, status, payload, attempts, exception, dispatched_at, started_at, completed_at, duration, tags)
160
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(job.id, job.name, job.queue, job.status, JSON.stringify(job.payload), job.attempts, job.exception, job.dispatchedAt.toISOString(), job.startedAt?.toISOString() ?? null, job.completedAt?.toISOString() ?? null, job.duration, JSON.stringify(job.tags));
161
+ }
162
+ updateJob(id, updates) {
163
+ const sets = [];
164
+ const params = [];
165
+ if (updates.status !== undefined) {
166
+ sets.push('status = ?');
167
+ params.push(updates.status);
168
+ }
169
+ if (updates.attempts !== undefined) {
170
+ sets.push('attempts = ?');
171
+ params.push(updates.attempts);
172
+ }
173
+ if (updates.exception !== undefined) {
174
+ sets.push('exception = ?');
175
+ params.push(updates.exception);
176
+ }
177
+ if (updates.startedAt !== undefined) {
178
+ sets.push('started_at = ?');
179
+ params.push(updates.startedAt?.toISOString() ?? null);
180
+ }
181
+ if (updates.completedAt !== undefined) {
182
+ sets.push('completed_at = ?');
183
+ params.push(updates.completedAt?.toISOString() ?? null);
184
+ }
185
+ if (updates.duration !== undefined) {
186
+ sets.push('duration = ?');
187
+ params.push(updates.duration);
188
+ }
189
+ if (sets.length === 0)
190
+ return;
191
+ params.push(id);
192
+ this.getDb().prepare(`UPDATE horizon_jobs SET ${sets.join(', ')} WHERE id = ?`).run(...params);
193
+ }
194
+ recentJobs(options) {
195
+ return this.queryJobs(options);
196
+ }
197
+ failedJobs(options) {
198
+ return this.queryJobs({ ...options, status: 'failed' });
199
+ }
200
+ findJob(id) {
201
+ const row = this.getDb().prepare('SELECT * FROM horizon_jobs WHERE id = ?').get(id);
202
+ return row ? this.jobFromRow(row) : null;
203
+ }
204
+ recordMetric(metric) {
205
+ this.getDb().prepare(`INSERT INTO horizon_metrics (id, queue, throughput, wait_time, runtime, pending, active, completed, failed, created_at)
206
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(randomUUID(), metric.queue, metric.throughput, metric.waitTime, metric.runtime, metric.pending, metric.active, metric.completed, metric.failed, new Date().toISOString());
207
+ }
208
+ metrics(queue, since) {
209
+ const rows = this.getDb().prepare('SELECT * FROM horizon_metrics WHERE queue = ? AND created_at >= ? ORDER BY created_at ASC').all(queue, since.toISOString());
210
+ return rows.map(r => this.metricFromRow(r));
211
+ }
212
+ currentMetrics() {
213
+ const rows = this.getDb().prepare(`SELECT m.* FROM horizon_metrics m
214
+ INNER JOIN (SELECT queue, MAX(created_at) as max_created FROM horizon_metrics GROUP BY queue) latest
215
+ ON m.queue = latest.queue AND m.created_at = latest.max_created`).all();
216
+ return rows.map(r => this.metricFromRow(r));
217
+ }
218
+ recordWorker(worker) {
219
+ this.getDb().prepare(`INSERT OR REPLACE INTO horizon_workers (id, queue, status, jobs_run, memory_mb, started_at, last_job_at)
220
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(worker.id, worker.queue, worker.status, worker.jobsRun, worker.memoryMb, worker.startedAt.toISOString(), worker.lastJobAt?.toISOString() ?? null);
221
+ }
222
+ workers() {
223
+ const rows = this.getDb().prepare('SELECT * FROM horizon_workers').all();
224
+ return rows.map(r => ({
225
+ id: r['id'],
226
+ queue: r['queue'],
227
+ status: r['status'],
228
+ jobsRun: r['jobs_run'],
229
+ memoryMb: r['memory_mb'],
230
+ startedAt: new Date(r['started_at']),
231
+ lastJobAt: r['last_job_at'] ? new Date(r['last_job_at']) : null,
232
+ }));
233
+ }
234
+ deleteJob(id) {
235
+ this.getDb().prepare('DELETE FROM horizon_jobs WHERE id = ?').run(id);
236
+ }
237
+ pruneOlderThan(date) {
238
+ const iso = date.toISOString();
239
+ const db = this.getDb();
240
+ db.prepare('DELETE FROM horizon_jobs WHERE dispatched_at < ?').run(iso);
241
+ db.prepare('DELETE FROM horizon_metrics WHERE created_at < ?').run(iso);
242
+ }
243
+ jobCount(status) {
244
+ if (status) {
245
+ const row = this.getDb().prepare('SELECT COUNT(*) as cnt FROM horizon_jobs WHERE status = ?').get(status);
246
+ return row.cnt;
247
+ }
248
+ const row = this.getDb().prepare('SELECT COUNT(*) as cnt FROM horizon_jobs').get();
249
+ return row.cnt;
250
+ }
251
+ queryJobs(options) {
252
+ const conditions = [];
253
+ const params = [];
254
+ if (options?.status) {
255
+ conditions.push('status = ?');
256
+ params.push(options.status);
257
+ }
258
+ if (options?.queue) {
259
+ conditions.push('queue = ?');
260
+ params.push(options.queue);
261
+ }
262
+ if (options?.search) {
263
+ conditions.push('(name LIKE ? OR payload LIKE ?)');
264
+ params.push(`%${options.search}%`, `%${options.search}%`);
265
+ }
266
+ const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';
267
+ const page = options?.page ?? 1;
268
+ const perPage = options?.perPage ?? 50;
269
+ const offset = (page - 1) * perPage;
270
+ params.push(perPage, offset);
271
+ const rows = this.getDb().prepare(`SELECT * FROM horizon_jobs ${where} ORDER BY dispatched_at DESC LIMIT ? OFFSET ?`).all(...params);
272
+ return rows.map(r => this.jobFromRow(r));
273
+ }
274
+ jobFromRow(r) {
275
+ return {
276
+ id: r['id'],
277
+ name: r['name'],
278
+ queue: r['queue'],
279
+ status: r['status'],
280
+ payload: JSON.parse(r['payload']),
281
+ attempts: r['attempts'],
282
+ exception: r['exception'] || null,
283
+ dispatchedAt: new Date(r['dispatched_at']),
284
+ startedAt: r['started_at'] ? new Date(r['started_at']) : null,
285
+ completedAt: r['completed_at'] ? new Date(r['completed_at']) : null,
286
+ duration: r['duration'] ?? null,
287
+ tags: JSON.parse(r['tags']),
288
+ };
289
+ }
290
+ metricFromRow(r) {
291
+ return {
292
+ queue: r['queue'],
293
+ throughput: r['throughput'],
294
+ waitTime: r['wait_time'],
295
+ runtime: r['runtime'],
296
+ pending: r['pending'],
297
+ active: r['active'],
298
+ completed: r['completed'],
299
+ failed: r['failed'],
300
+ };
301
+ }
302
+ }
303
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAMxC,8DAA8D;AAE9D,MAAM,OAAO,aAAa;IAMK;IALZ,IAAI,GAAiB,EAAE,CAAA;IACvB,cAAc,GAA+B,IAAI,GAAG,EAAE,CAAA;IACtD,aAAa,GAA6B,IAAI,GAAG,EAAE,CAAA;IACnD,SAAS,GAA4B,IAAI,GAAG,EAAE,CAAA;IAE/D,YAA6B,UAAkB,IAAI;QAAtB,YAAO,GAAP,OAAO,CAAe;IAAG,CAAC;IAEvD,SAAS,CAAC,GAAe;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAA;QACjC,CAAC;IACH,CAAC;IAED,SAAS,CAAC,EAAU,EAAE,OAA4B;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5C,IAAI,GAAG;YAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACtC,CAAC;IAED,UAAU,CAAC,OAAwB;QACjC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;IAED,UAAU,CAAC,OAAwB;QACjC,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAA;IACjD,CAAC;IAED,YAAY,CAAC,MAAmB;QAC9B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QAC3D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI;YAAE,OAAO,CAAC,KAAK,EAAE,CAAA,CAAC,+BAA+B;QAC1E,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAChD,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,KAAW;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QACpD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;QAC/B,qEAAqE;QACrE,gEAAgE;QAChE,KAAK,OAAO,CAAA;QACZ,OAAO,CAAC,GAAG,OAAO,CAAC,CAAA;IACrB,CAAC;IAED,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAA;IACzC,CAAC;IAED,YAAY,CAAC,MAAkB;QAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACvC,CAAC;IAED,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA;IACrC,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QACjD,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IAC1C,CAAC;IAED,cAAc,CAAC,IAAU;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QACzB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,MAAkB;QACzB,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAA;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAA;IAC1D,CAAC;IAEO,UAAU,CAAC,OAAwB;QACzC,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;QAE3B,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;YACxB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAA;QAC7C,CAAC;QACD,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAA;YACvB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAA;QAC5C,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;YACtC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACzB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CACpD,CAAA;QACH,CAAC;QAED,MAAM,IAAI,GAAM,OAAO,EAAE,IAAI,IAAO,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;QACtC,MAAM,KAAK,GAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAA;QACpC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,CAAA;IAC7C,CAAC;CACF;AAED,8DAA8D;AAE9D,MAAM,OAAO,aAAa;IAGK;IAFrB,EAAE,GAA6C,IAAI,CAAA;IAE3D,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAEvC,KAAK;QACX,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,QAAQ,GAAI,UAAsC,CAAC,eAA8D,CAAA;YACvH,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,gGAAgG,CAAC,CAAA;YACnH,CAAC;YACD,IAAI,CAAC,EAAE,GAAG,IAAK,QAA+E,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAC3G,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC;QACD,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,EAAG,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyCb,CAAC,CAAA;IACJ,CAAC;IAED,SAAS,CAAC,GAAe;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAClB;mDAC6C,CAC9C,CAAC,GAAG,CACH,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EACvC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EACxD,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,EAC9B,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,IAAI,EACpC,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,IAAI,EACtC,GAAG,CAAC,QAAQ,EACZ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CACzB,CAAA;IACH,CAAC;IAED,SAAS,CAAC,EAAU,EAAE,OAA4B;QAChD,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,MAAM,MAAM,GAAc,EAAE,CAAA;QAE5B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAO,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAAC,CAAC;QACrG,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAK,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAAK,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAAC,CAAC;QACvG,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAI,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAAC,CAAC;QACxG,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAI,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,CAAA;QAAC,CAAC;QAC/H,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,CAAA;QAAC,CAAC;QACjI,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAK,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAAK,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAAC,CAAC;QAEvG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACf,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,2BAA2B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;IAChG,CAAC;IAED,UAAU,CAAC,OAAwB;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;IAED,UAAU,CAAC,OAAwB;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IACzD,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAwC,CAAA;QAC1H,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1C,CAAC;IAED,YAAY,CAAC,MAAmB;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAClB;6CACuC,CACxC,CAAC,GAAG,CACH,UAAU,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAC9E,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAC9D,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CACzB,CAAA;IACH,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,KAAW;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAC/B,2FAA2F,CAC5F,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,CAA8B,CAAA;QAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;IAED,cAAc;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAC/B;;uEAEiE,CAClE,CAAC,GAAG,EAA+B,CAAA;QACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;IAED,YAAY,CAAC,MAAkB;QAC7B,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAClB;oCAC8B,CAC/B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAC3E,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,CAAA;IAC5E,CAAC;IAED,OAAO;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,EAA+B,CAAA;QACrG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,EAAE,EAAS,CAAC,CAAC,IAAI,CAAW;YAC5B,KAAK,EAAM,CAAC,CAAC,OAAO,CAAW;YAC/B,MAAM,EAAK,CAAC,CAAC,QAAQ,CAAyB;YAC9C,OAAO,EAAI,CAAC,CAAC,UAAU,CAAW;YAClC,QAAQ,EAAG,CAAC,CAAC,WAAW,CAAW;YACnC,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAW,CAAC;YAC9C,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,CAAW,CAAC,CAAC,CAAC,CAAC,IAAI;SAC1E,CAAC,CAAC,CAAA;IACL,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACvE,CAAC;IAED,cAAc,CAAC,IAAU;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAC9B,MAAM,EAAE,GAAI,IAAI,CAAC,KAAK,EAAE,CAAA;QACxB,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACvE,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACzE,CAAC;IAED,QAAQ,CAAC,MAAkB;QACzB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,CAAC,MAAM,CAAoB,CAAA;YAC5H,OAAO,GAAG,CAAC,GAAG,CAAA;QAChB,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,EAAqB,CAAA;QACrG,OAAO,GAAG,CAAC,GAAG,CAAA;IAChB,CAAC;IAEO,SAAS,CAAC,OAAwB;QACxC,MAAM,UAAU,GAAa,EAAE,CAAA;QAC/B,MAAM,MAAM,GAAc,EAAE,CAAA;QAE5B,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAAC,CAAC;QACnF,IAAI,OAAO,EAAE,KAAK,EAAG,CAAC;YAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAAC,CAAC;QAClF,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YAAC,UAAU,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;QAAC,CAAC;QAEtI,MAAM,KAAK,GAAK,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAC5E,MAAM,IAAI,GAAM,OAAO,EAAE,IAAI,IAAO,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;QACtC,MAAM,MAAM,GAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAA;QACpC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAE5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAC/B,8BAA8B,KAAK,+CAA+C,CACnF,CAAC,GAAG,CAAC,GAAG,MAAM,CAA8B,CAAA;QAE7C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1C,CAAC;IAEO,UAAU,CAAC,CAA0B;QAC3C,OAAO;YACL,EAAE,EAAY,CAAC,CAAC,IAAI,CAAW;YAC/B,IAAI,EAAU,CAAC,CAAC,MAAM,CAAW;YACjC,KAAK,EAAS,CAAC,CAAC,OAAO,CAAW;YAClC,MAAM,EAAQ,CAAC,CAAC,QAAQ,CAAc;YACtC,OAAO,EAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAW,CAA4B;YAC3E,QAAQ,EAAM,CAAC,CAAC,UAAU,CAAW;YACrC,SAAS,EAAM,CAAC,CAAC,WAAW,CAAY,IAAI,IAAI;YAChD,YAAY,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,CAAW,CAAC;YACpD,SAAS,EAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAW,CAAC,CAAC,CAAC,CAAC,IAAI;YAC1E,WAAW,EAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAW,CAAC,CAAC,CAAC,CAAC,IAAI;YAC9E,QAAQ,EAAO,CAAC,CAAC,UAAU,CAAY,IAAI,IAAI;YAC/C,IAAI,EAAU,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAW,CAAa;SAC1D,CAAA;IACH,CAAC;IAEO,aAAa,CAAC,CAA0B;QAC9C,OAAO;YACL,KAAK,EAAO,CAAC,CAAC,OAAO,CAAW;YAChC,UAAU,EAAE,CAAC,CAAC,YAAY,CAAW;YACrC,QAAQ,EAAI,CAAC,CAAC,WAAW,CAAW;YACpC,OAAO,EAAK,CAAC,CAAC,SAAS,CAAW;YAClC,OAAO,EAAK,CAAC,CAAC,SAAS,CAAW;YAClC,MAAM,EAAM,CAAC,CAAC,QAAQ,CAAW;YACjC,SAAS,EAAG,CAAC,CAAC,WAAW,CAAW;YACpC,MAAM,EAAM,CAAC,CAAC,QAAQ,CAAW;SAClC,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,90 @@
1
+ export type JobStatus = 'pending' | 'processing' | 'completed' | 'failed';
2
+ export interface HorizonJob {
3
+ id: string;
4
+ name: string;
5
+ queue: string;
6
+ status: JobStatus;
7
+ payload: Record<string, unknown>;
8
+ attempts: number;
9
+ exception: string | null;
10
+ dispatchedAt: Date;
11
+ startedAt: Date | null;
12
+ completedAt: Date | null;
13
+ duration: number | null;
14
+ tags: string[];
15
+ }
16
+ export interface QueueMetric {
17
+ queue: string;
18
+ throughput: number;
19
+ waitTime: number;
20
+ runtime: number;
21
+ pending: number;
22
+ active: number;
23
+ completed: number;
24
+ failed: number;
25
+ }
26
+ export interface WorkerInfo {
27
+ id: string;
28
+ queue: string;
29
+ status: 'active' | 'idle' | 'paused';
30
+ jobsRun: number;
31
+ memoryMb: number;
32
+ startedAt: Date;
33
+ lastJobAt: Date | null;
34
+ }
35
+ export interface HorizonStorage {
36
+ /** Record a job event (dispatch, start, complete, fail) */
37
+ recordJob(job: HorizonJob): void | Promise<void>;
38
+ /** Update an existing job record */
39
+ updateJob(id: string, updates: Partial<HorizonJob>): void | Promise<void>;
40
+ /** List recent jobs */
41
+ recentJobs(options?: JobListOptions): HorizonJob[] | Promise<HorizonJob[]>;
42
+ /** List failed jobs */
43
+ failedJobs(options?: JobListOptions): HorizonJob[] | Promise<HorizonJob[]>;
44
+ /** Get a single job by ID */
45
+ findJob(id: string): HorizonJob | null | Promise<HorizonJob | null>;
46
+ /** Record a per-minute metric snapshot for a queue */
47
+ recordMetric(metric: QueueMetric): void | Promise<void>;
48
+ /** Get metric history for a queue */
49
+ metrics(queue: string, since: Date): QueueMetric[] | Promise<QueueMetric[]>;
50
+ /** Get latest metric for each queue */
51
+ currentMetrics(): QueueMetric[] | Promise<QueueMetric[]>;
52
+ /** Register/update a worker */
53
+ recordWorker(worker: WorkerInfo): void | Promise<void>;
54
+ /** List all known workers */
55
+ workers(): WorkerInfo[] | Promise<WorkerInfo[]>;
56
+ /** Delete a failed job record */
57
+ deleteJob(id: string): void | Promise<void>;
58
+ /** Delete all data older than date */
59
+ pruneOlderThan(date: Date): void | Promise<void>;
60
+ /** Count jobs by status */
61
+ jobCount(status?: JobStatus | undefined): number | Promise<number>;
62
+ }
63
+ export interface JobListOptions {
64
+ page?: number | undefined;
65
+ perPage?: number | undefined;
66
+ queue?: string | undefined;
67
+ search?: string | undefined;
68
+ status?: JobStatus | undefined;
69
+ }
70
+ export interface HorizonConfig {
71
+ enabled?: boolean | undefined;
72
+ path?: string | undefined;
73
+ storage?: 'memory' | 'sqlite' | undefined;
74
+ sqlitePath?: string | undefined;
75
+ maxJobs?: number | undefined;
76
+ pruneAfterHours?: number | undefined;
77
+ metricsIntervalMs?: number | undefined;
78
+ auth?: null | ((req: unknown) => boolean | Promise<boolean>) | undefined;
79
+ }
80
+ export declare const defaultConfig: {
81
+ enabled: boolean;
82
+ path: string;
83
+ storage: "memory";
84
+ sqlitePath: string;
85
+ maxJobs: number;
86
+ pruneAfterHours: number;
87
+ metricsIntervalMs: number;
88
+ auth: null | ((req: unknown) => boolean | Promise<boolean>);
89
+ };
90
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,12 @@
1
+ // ─── Job Record ────────────────────────────────────────────
2
+ export const defaultConfig = {
3
+ enabled: true,
4
+ path: 'horizon',
5
+ storage: 'memory',
6
+ sqlitePath: '.horizon.db',
7
+ maxJobs: 1000,
8
+ pruneAfterHours: 72,
9
+ metricsIntervalMs: 60_000,
10
+ auth: null,
11
+ };
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAqG9D,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAY,IAAI;IACvB,IAAI,EAAe,SAAS;IAC5B,OAAO,EAAY,QAAiB;IACpC,UAAU,EAAS,aAAa;IAChC,OAAO,EAAY,IAAI;IACvB,eAAe,EAAI,EAAE;IACrB,iBAAiB,EAAE,MAAM;IACzB,IAAI,EAAe,IAA6D;CACjF,CAAA"}