@queuebase/cli 1.4.0 → 1.5.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.
- package/dist/__tests__/generate.test.d.ts +2 -0
- package/dist/__tests__/generate.test.d.ts.map +1 -0
- package/dist/__tests__/generate.test.js +204 -0
- package/dist/__tests__/generate.test.js.map +1 -0
- package/dist/__tests__/manifest.test.d.ts +2 -0
- package/dist/__tests__/manifest.test.d.ts.map +1 -0
- package/dist/__tests__/manifest.test.js +41 -0
- package/dist/__tests__/manifest.test.js.map +1 -0
- package/dist/__tests__/schedule-ticker.test.d.ts +2 -0
- package/dist/__tests__/schedule-ticker.test.d.ts.map +1 -0
- package/dist/__tests__/schedule-ticker.test.js +185 -0
- package/dist/__tests__/schedule-ticker.test.js.map +1 -0
- package/dist/__tests__/sync-schedules.test.d.ts +2 -0
- package/dist/__tests__/sync-schedules.test.d.ts.map +1 -0
- package/dist/__tests__/sync-schedules.test.js +171 -0
- package/dist/__tests__/sync-schedules.test.js.map +1 -0
- package/dist/bin.js +7 -1
- package/dist/bin.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +3 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/generate.d.ts +2 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +10 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +36 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/queries.d.ts +2 -0
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +4 -4
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schedule-queries.d.ts +59 -0
- package/dist/db/schedule-queries.d.ts.map +1 -0
- package/dist/db/schedule-queries.js +78 -0
- package/dist/db/schedule-queries.js.map +1 -0
- package/dist/generate.d.ts +12 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +103 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +12 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +15 -0
- package/dist/manifest.js.map +1 -0
- package/dist/schedule-ticker.d.ts +16 -0
- package/dist/schedule-ticker.d.ts.map +1 -0
- package/dist/schedule-ticker.js +63 -0
- package/dist/schedule-ticker.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +13 -0
- package/dist/server.js.map +1 -1
- package/dist/sync-schedules.d.ts +4 -0
- package/dist/sync-schedules.d.ts.map +1 -0
- package/dist/sync-schedules.js +29 -0
- package/dist/sync-schedules.js.map +1 -0
- package/package.json +4 -3
package/dist/generate.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { extractSchedules } from "@queuebase/core";
|
|
5
|
+
import { getManifestPath } from "./manifest.js";
|
|
6
|
+
const CONVENTION_PATHS = [
|
|
7
|
+
"src/jobs/index.ts",
|
|
8
|
+
"src/jobs/index.js",
|
|
9
|
+
"jobs/index.ts",
|
|
10
|
+
"jobs/index.js",
|
|
11
|
+
];
|
|
12
|
+
const CONFIG_FILENAMES = [
|
|
13
|
+
"queuebase.config.ts",
|
|
14
|
+
"queuebase.config.js",
|
|
15
|
+
];
|
|
16
|
+
async function importModule(filePath) {
|
|
17
|
+
const { tsImport } = await import("tsx/esm/api");
|
|
18
|
+
const fileUrl = pathToFileURL(filePath).href;
|
|
19
|
+
try {
|
|
20
|
+
const mod = (await tsImport(fileUrl, import.meta.url));
|
|
21
|
+
// tsx wraps ESM modules in an extra layer: mod.default is the actual
|
|
22
|
+
// module namespace. If the source has `export default X`, the namespace
|
|
23
|
+
// will have a .default property containing X. If not, there is no
|
|
24
|
+
// .default on the namespace, meaning no default export exists.
|
|
25
|
+
if (mod.default &&
|
|
26
|
+
typeof mod.default === "object" &&
|
|
27
|
+
Object.getPrototypeOf(mod.default) === null) {
|
|
28
|
+
const inner = mod.default;
|
|
29
|
+
if ("default" in inner) {
|
|
30
|
+
return { ...mod, default: inner.default };
|
|
31
|
+
}
|
|
32
|
+
// The inner module has no default export — remove the wrapping
|
|
33
|
+
const { default: _, ...rest } = mod;
|
|
34
|
+
return rest;
|
|
35
|
+
}
|
|
36
|
+
return mod;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new Error(`Failed to load ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function discoverRouterPath(cwd) {
|
|
43
|
+
for (const relative of CONVENTION_PATHS) {
|
|
44
|
+
const absolute = path.join(cwd, relative);
|
|
45
|
+
if (fs.existsSync(absolute)) {
|
|
46
|
+
return absolute;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (const configName of CONFIG_FILENAMES) {
|
|
50
|
+
const configPath = path.join(cwd, configName);
|
|
51
|
+
if (fs.existsSync(configPath)) {
|
|
52
|
+
const configModule = await importModule(configPath);
|
|
53
|
+
const config = configModule.default;
|
|
54
|
+
if (!config || typeof config.routerPath !== "string") {
|
|
55
|
+
throw new Error(`Found ${configName} but it is missing routerPath. Export default { routerPath: './path/to/jobs/index.ts' }`);
|
|
56
|
+
}
|
|
57
|
+
const resolvedPath = path.resolve(cwd, config.routerPath);
|
|
58
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
59
|
+
throw new Error(`Config routerPath "${config.routerPath}" does not exist (resolved to ${resolvedPath}).`);
|
|
60
|
+
}
|
|
61
|
+
return resolvedPath;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
throw new Error(`Could not find job router. Expected a default export at one of:\n${CONVENTION_PATHS.map((p) => ` - ${p}`).join("\n")}\n\nOr create a queuebase.config.ts with a routerPath property.`);
|
|
65
|
+
}
|
|
66
|
+
export function buildManifest(router) {
|
|
67
|
+
const schedules = extractSchedules(router);
|
|
68
|
+
const scheduleMap = new Map(schedules.map((s) => [s.jobName, s.schedule]));
|
|
69
|
+
const jobs = {};
|
|
70
|
+
for (const jobName of Object.keys(router)) {
|
|
71
|
+
const schedule = scheduleMap.get(jobName);
|
|
72
|
+
jobs[jobName] = schedule ? { schedule } : {};
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
version: 1,
|
|
76
|
+
generatedAt: new Date().toISOString(),
|
|
77
|
+
jobs,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export function writeManifest(manifest, cwd) {
|
|
81
|
+
const manifestPath = getManifestPath(cwd);
|
|
82
|
+
const dir = path.dirname(manifestPath);
|
|
83
|
+
if (!fs.existsSync(dir)) {
|
|
84
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
85
|
+
}
|
|
86
|
+
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
87
|
+
}
|
|
88
|
+
export async function loadRouter(routerPath) {
|
|
89
|
+
const mod = await importModule(routerPath);
|
|
90
|
+
if (!mod.default || typeof mod.default !== "object") {
|
|
91
|
+
throw new Error(`Expected default export from ${routerPath}. Make sure your router file uses: export default createJobRouter({ ... })`);
|
|
92
|
+
}
|
|
93
|
+
return mod.default;
|
|
94
|
+
}
|
|
95
|
+
export async function generate(cwd) {
|
|
96
|
+
const resolvedCwd = cwd ?? process.cwd();
|
|
97
|
+
const routerPath = await discoverRouterPath(resolvedCwd);
|
|
98
|
+
const router = await loadRouter(routerPath);
|
|
99
|
+
const manifest = buildManifest(router);
|
|
100
|
+
writeManifest(manifest, resolvedCwd);
|
|
101
|
+
return { manifest, routerPath };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export { createDevServer, type DevServerOptions } from './server.js';
|
|
2
2
|
export { devCommand } from './commands/dev.js';
|
|
3
|
+
export { generate, type GenerateResult } from './generate.js';
|
|
4
|
+
export { readManifest, type Manifest, type ManifestJob } from './manifest.js';
|
|
5
|
+
export { generateCommand } from './commands/generate.js';
|
|
3
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export { createDevServer } from './server.js';
|
|
2
2
|
export { devCommand } from './commands/dev.js';
|
|
3
|
+
export { generate } from './generate.js';
|
|
4
|
+
export { readManifest } from './manifest.js';
|
|
5
|
+
export { generateCommand } from './commands/generate.js';
|
|
3
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAuB,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAmC,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ResolvedSchedule } from "@queuebase/core";
|
|
2
|
+
export interface ManifestJob {
|
|
3
|
+
schedule?: ResolvedSchedule;
|
|
4
|
+
}
|
|
5
|
+
export interface Manifest {
|
|
6
|
+
version: number;
|
|
7
|
+
generatedAt: string;
|
|
8
|
+
jobs: Record<string, ManifestJob>;
|
|
9
|
+
}
|
|
10
|
+
export declare function getManifestPath(cwd: string): string;
|
|
11
|
+
export declare function readManifest(cwd: string): Manifest;
|
|
12
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CAClC;AAID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAWlD"}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const MANIFEST_FILENAME = "queuebase.manifest.json";
|
|
4
|
+
export function getManifestPath(cwd) {
|
|
5
|
+
return path.join(cwd, ".queuebase", MANIFEST_FILENAME);
|
|
6
|
+
}
|
|
7
|
+
export function readManifest(cwd) {
|
|
8
|
+
const manifestPath = getManifestPath(cwd);
|
|
9
|
+
if (!fs.existsSync(manifestPath)) {
|
|
10
|
+
throw new Error(`Manifest not found at ${manifestPath}. Run \`queuebase generate\` first.`);
|
|
11
|
+
}
|
|
12
|
+
const raw = fs.readFileSync(manifestPath, "utf-8");
|
|
13
|
+
return JSON.parse(raw);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAa7B,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAEpD,MAAM,UAAU,eAAe,CAAC,GAAW;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACvC,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAE1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACd,yBAAyB,YAAY,qCAAqC,CAC1E,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
export interface ScheduleTickerOptions {
|
|
3
|
+
pollInterval?: number;
|
|
4
|
+
callbackUrl: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ScheduleTickerHandle {
|
|
7
|
+
start(): void;
|
|
8
|
+
stop(): void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Single tick: check all due schedules and enqueue jobs.
|
|
12
|
+
* Exported for testing.
|
|
13
|
+
*/
|
|
14
|
+
export declare function tick(db: DatabaseSync, callbackUrl: string): void;
|
|
15
|
+
export declare function createScheduleTicker(db: DatabaseSync, options: ScheduleTickerOptions): ScheduleTickerHandle;
|
|
16
|
+
//# sourceMappingURL=schedule-ticker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-ticker.d.ts","sourceRoot":"","sources":["../src/schedule-ticker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,MAAM,WAAW,qBAAqB;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;CACb;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAqDhE;AAED,wBAAgB,oBAAoB,CACnC,EAAE,EAAE,YAAY,EAChB,OAAO,EAAE,qBAAqB,GAC5B,oBAAoB,CAiBtB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { nextRun } from "@queuebase/core";
|
|
2
|
+
import { enqueueJob, getJobIdByPublicId, insertJobLog } from "./db/queries.js";
|
|
3
|
+
import { claimScheduleTick, hasRunningJobsForSchedule, listActiveSchedules, } from "./db/schedule-queries.js";
|
|
4
|
+
/**
|
|
5
|
+
* Single tick: check all due schedules and enqueue jobs.
|
|
6
|
+
* Exported for testing.
|
|
7
|
+
*/
|
|
8
|
+
export function tick(db, callbackUrl) {
|
|
9
|
+
const now = Date.now();
|
|
10
|
+
const schedules = listActiveSchedules(db);
|
|
11
|
+
for (const schedule of schedules) {
|
|
12
|
+
if (schedule.next_run_at === null || schedule.next_run_at > now) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const nextRunDate = nextRun(schedule.cron_expr, schedule.timezone);
|
|
16
|
+
if (nextRunDate === null) {
|
|
17
|
+
console.info(`⚠️ Schedule "${schedule.job_name}" has no future runs, skipping`);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const newNextRunAt = nextRunDate.getTime();
|
|
21
|
+
if (schedule.overlap === "skip") {
|
|
22
|
+
if (hasRunningJobsForSchedule(db, schedule.id)) {
|
|
23
|
+
claimScheduleTick(db, schedule.id, schedule.next_run_at, newNextRunAt);
|
|
24
|
+
console.info(`⏭️ Skipped scheduled job "${schedule.job_name}" (previous run still active)`);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const claimed = claimScheduleTick(db, schedule.id, schedule.next_run_at, newNextRunAt);
|
|
29
|
+
if (!claimed) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const result = enqueueJob(db, {
|
|
33
|
+
name: schedule.job_name,
|
|
34
|
+
payload: {},
|
|
35
|
+
callbackUrl,
|
|
36
|
+
scheduleId: schedule.id,
|
|
37
|
+
});
|
|
38
|
+
const jobId = getJobIdByPublicId(db, result.jobId);
|
|
39
|
+
if (jobId != null) {
|
|
40
|
+
insertJobLog(db, jobId, "enqueued");
|
|
41
|
+
}
|
|
42
|
+
console.info(`⏰ Enqueued scheduled job "${schedule.job_name}"`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function createScheduleTicker(db, options) {
|
|
46
|
+
const pollInterval = options.pollInterval ?? 5000;
|
|
47
|
+
let timer = null;
|
|
48
|
+
return {
|
|
49
|
+
start() {
|
|
50
|
+
if (timer)
|
|
51
|
+
return;
|
|
52
|
+
tick(db, options.callbackUrl);
|
|
53
|
+
timer = setInterval(() => tick(db, options.callbackUrl), pollInterval);
|
|
54
|
+
},
|
|
55
|
+
stop() {
|
|
56
|
+
if (timer) {
|
|
57
|
+
clearInterval(timer);
|
|
58
|
+
timer = null;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=schedule-ticker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-ticker.js","sourceRoot":"","sources":["../src/schedule-ticker.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA2IpE"}
|
package/dist/server.js
CHANGED
|
@@ -5,13 +5,20 @@ import { cors } from "hono/cors";
|
|
|
5
5
|
import { logger } from "hono/logger";
|
|
6
6
|
import { createSqliteClient } from "./db/client.js";
|
|
7
7
|
import { runMigrations } from "./db/migrations.js";
|
|
8
|
+
import { readManifest } from "./manifest.js";
|
|
9
|
+
import { syncSchedules } from "./sync-schedules.js";
|
|
8
10
|
import { enqueueJob, getJobByPublicId, getJobIdByPublicId, insertJobLog, listRecentJobs, } from "./db/queries.js";
|
|
9
11
|
import { createWorkerDb } from "./db/worker-db.js";
|
|
12
|
+
import { createScheduleTicker } from "./schedule-ticker.js";
|
|
10
13
|
export function createDevServer(options) {
|
|
11
14
|
const { port, dbPath, callbackUrl } = options;
|
|
12
15
|
// Initialize SQLite database
|
|
13
16
|
const { db, close } = createSqliteClient(dbPath);
|
|
14
17
|
runMigrations(db);
|
|
18
|
+
// Sync schedules from manifest
|
|
19
|
+
const manifest = readManifest(options.cwd);
|
|
20
|
+
const scheduledCount = syncSchedules(db, manifest);
|
|
21
|
+
console.info(`📅 Synced ${scheduledCount} schedules`);
|
|
15
22
|
const workerDb = createWorkerDb(db);
|
|
16
23
|
// Create Hono app
|
|
17
24
|
const app = new Hono();
|
|
@@ -83,6 +90,11 @@ export function createDevServer(options) {
|
|
|
83
90
|
});
|
|
84
91
|
// Start worker
|
|
85
92
|
executor.start();
|
|
93
|
+
// Create and start schedule ticker
|
|
94
|
+
const ticker = createScheduleTicker(db, {
|
|
95
|
+
callbackUrl,
|
|
96
|
+
});
|
|
97
|
+
ticker.start();
|
|
86
98
|
// biome-ignore lint/suspicious/noConsoleLog: cli
|
|
87
99
|
console.log(`🚀 Queuebase dev server running on http://localhost:${port}`);
|
|
88
100
|
// biome-ignore lint/suspicious/noConsoleLog: cli
|
|
@@ -97,6 +109,7 @@ export function createDevServer(options) {
|
|
|
97
109
|
const cleanup = () => {
|
|
98
110
|
// biome-ignore lint/suspicious/noConsoleLog: cli
|
|
99
111
|
console.log("\nShutting down...");
|
|
112
|
+
ticker.stop();
|
|
100
113
|
executor.stop();
|
|
101
114
|
close();
|
|
102
115
|
server.close();
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-schedules.d.ts","sourceRoot":"","sources":["../src/sync-schedules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAmC1E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { nextRun } from "@queuebase/core";
|
|
2
|
+
import { deleteAllSchedules, insertSchedule, } from "./db/schedule-queries.js";
|
|
3
|
+
export function syncSchedules(db, manifest) {
|
|
4
|
+
deleteAllSchedules(db);
|
|
5
|
+
let synced = 0;
|
|
6
|
+
for (const [jobName, job] of Object.entries(manifest.jobs)) {
|
|
7
|
+
if (!job.schedule) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
const { cronExpression, timezone, enabled, overlap, timeoutMs } = job.schedule;
|
|
11
|
+
const nextRunDate = nextRun(cronExpression, timezone);
|
|
12
|
+
if (nextRunDate === null) {
|
|
13
|
+
console.info(`⚠️ Skipping schedule for "${jobName}": nextRun returned null for "${cronExpression}"`);
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
insertSchedule(db, {
|
|
17
|
+
jobName,
|
|
18
|
+
cronExpression,
|
|
19
|
+
timezone,
|
|
20
|
+
enabled,
|
|
21
|
+
overlap,
|
|
22
|
+
timeoutMs,
|
|
23
|
+
nextRunAt: nextRunDate.getTime(),
|
|
24
|
+
});
|
|
25
|
+
synced++;
|
|
26
|
+
}
|
|
27
|
+
return synced;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=sync-schedules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-schedules.js","sourceRoot":"","sources":["../src/sync-schedules.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EACN,kBAAkB,EAClB,cAAc,GACd,MAAM,0BAA0B,CAAC;AAGlC,MAAM,UAAU,aAAa,CAAC,EAAgB,EAAE,QAAkB;IACjE,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAEvB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACnB,SAAS;QACV,CAAC;QAED,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAC9D,GAAG,CAAC,QAAQ,CAAC;QAEd,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACtD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CACX,8BAA8B,OAAO,iCAAiC,cAAc,GAAG,CACvF,CAAC;YACF,SAAS;QACV,CAAC;QAED,cAAc,CAAC,EAAE,EAAE;YAClB,OAAO;YACP,cAAc;YACd,QAAQ;YACR,OAAO;YACP,OAAO;YACP,SAAS;YACT,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE;SAChC,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC;IACV,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@queuebase/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"queuebase": "./dist/bin.js"
|
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@hono/node-server": "^1.13.7",
|
|
16
16
|
"hono": "^4.6.16",
|
|
17
|
-
"
|
|
18
|
-
"@queuebase/worker": "1.
|
|
17
|
+
"tsx": "^4.21.0",
|
|
18
|
+
"@queuebase/worker": "1.5.1",
|
|
19
|
+
"@queuebase/core": "1.5.1"
|
|
19
20
|
},
|
|
20
21
|
"devDependencies": {
|
|
21
22
|
"@types/node": "^22.10.5",
|