oqronkit 0.0.1-alpha.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.
Files changed (109) hide show
  1. package/README.md +127 -0
  2. package/dist/chunk-I6QFT3MR.mjs +1732 -0
  3. package/dist/chunk-PLN5A6LU.mjs +1447 -0
  4. package/dist/core/config/config-loader.d.ts +3 -0
  5. package/dist/core/config/config-loader.d.ts.map +1 -0
  6. package/dist/core/config/default-config.d.ts +4 -0
  7. package/dist/core/config/default-config.d.ts.map +1 -0
  8. package/dist/core/config/define-config.d.ts +3 -0
  9. package/dist/core/config/define-config.d.ts.map +1 -0
  10. package/dist/core/config/find-up.d.ts +2 -0
  11. package/dist/core/config/find-up.d.ts.map +1 -0
  12. package/dist/core/config/schema.d.ts +306 -0
  13. package/dist/core/config/schema.d.ts.map +1 -0
  14. package/dist/core/context/cron-context.d.ts +14 -0
  15. package/dist/core/context/cron-context.d.ts.map +1 -0
  16. package/dist/core/context/cron-context.interface.d.ts +14 -0
  17. package/dist/core/context/cron-context.interface.d.ts.map +1 -0
  18. package/dist/core/context/job-context.d.ts +22 -0
  19. package/dist/core/context/job-context.d.ts.map +1 -0
  20. package/dist/core/context/schedule-context.d.ts +31 -0
  21. package/dist/core/context/schedule-context.d.ts.map +1 -0
  22. package/dist/core/errors/base.error.d.ts +13 -0
  23. package/dist/core/errors/base.error.d.ts.map +1 -0
  24. package/dist/core/events/event-bus.d.ts +16 -0
  25. package/dist/core/events/event-bus.d.ts.map +1 -0
  26. package/dist/core/index.d.ts +24 -0
  27. package/dist/core/index.d.ts.map +1 -0
  28. package/dist/core/logger/index.d.ts +30 -0
  29. package/dist/core/logger/index.d.ts.map +1 -0
  30. package/dist/core/registry.d.ts +13 -0
  31. package/dist/core/registry.d.ts.map +1 -0
  32. package/dist/core/types/config.types.d.ts +119 -0
  33. package/dist/core/types/config.types.d.ts.map +1 -0
  34. package/dist/core/types/cron.types.d.ts +53 -0
  35. package/dist/core/types/cron.types.d.ts.map +1 -0
  36. package/dist/core/types/db.types.d.ts +32 -0
  37. package/dist/core/types/db.types.d.ts.map +1 -0
  38. package/dist/core/types/index.d.ts +7 -0
  39. package/dist/core/types/index.d.ts.map +1 -0
  40. package/dist/core/types/lock.types.d.ts +7 -0
  41. package/dist/core/types/lock.types.d.ts.map +1 -0
  42. package/dist/core/types/module.types.d.ts +8 -0
  43. package/dist/core/types/module.types.d.ts.map +1 -0
  44. package/dist/core/types/scheduler.types.d.ts +62 -0
  45. package/dist/core/types/scheduler.types.d.ts.map +1 -0
  46. package/dist/cron-V0k1GcxJ.d.mts +102 -0
  47. package/dist/cron-V0k1GcxJ.d.ts +102 -0
  48. package/dist/cron.d.mts +2 -0
  49. package/dist/cron.d.ts +2 -0
  50. package/dist/cron.d.ts.map +1 -0
  51. package/dist/cron.js +215 -0
  52. package/dist/cron.mjs +1 -0
  53. package/dist/db/adapters/memory.adapter.d.ts +25 -0
  54. package/dist/db/adapters/memory.adapter.d.ts.map +1 -0
  55. package/dist/db/adapters/namespaced.adapter.d.ts +26 -0
  56. package/dist/db/adapters/namespaced.adapter.d.ts.map +1 -0
  57. package/dist/db/adapters/sqlite.adapter.d.ts +30 -0
  58. package/dist/db/adapters/sqlite.adapter.d.ts.map +1 -0
  59. package/dist/db/index.d.ts +4 -0
  60. package/dist/db/index.d.ts.map +1 -0
  61. package/dist/index.d.mts +797 -0
  62. package/dist/index.d.ts +32 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +2738 -0
  65. package/dist/index.mjs +747 -0
  66. package/dist/lock/adapters/db-lock.adapter.d.ts +17 -0
  67. package/dist/lock/adapters/db-lock.adapter.d.ts.map +1 -0
  68. package/dist/lock/adapters/memory-lock.adapter.d.ts +13 -0
  69. package/dist/lock/adapters/memory-lock.adapter.d.ts.map +1 -0
  70. package/dist/lock/adapters/namespaced-lock.adapter.d.ts +12 -0
  71. package/dist/lock/adapters/namespaced-lock.adapter.d.ts.map +1 -0
  72. package/dist/lock/heartbeat-worker.d.ts +16 -0
  73. package/dist/lock/heartbeat-worker.d.ts.map +1 -0
  74. package/dist/lock/index.d.ts +7 -0
  75. package/dist/lock/index.d.ts.map +1 -0
  76. package/dist/lock/leader-election.d.ts +16 -0
  77. package/dist/lock/leader-election.d.ts.map +1 -0
  78. package/dist/lock/stall-detector.d.ts +23 -0
  79. package/dist/lock/stall-detector.d.ts.map +1 -0
  80. package/dist/scheduler/cron-engine.d.ts +42 -0
  81. package/dist/scheduler/cron-engine.d.ts.map +1 -0
  82. package/dist/scheduler/define-cron.d.ts +36 -0
  83. package/dist/scheduler/define-cron.d.ts.map +1 -0
  84. package/dist/scheduler/define-schedule.d.ts +52 -0
  85. package/dist/scheduler/define-schedule.d.ts.map +1 -0
  86. package/dist/scheduler/expression-parser.d.ts +2 -0
  87. package/dist/scheduler/expression-parser.d.ts.map +1 -0
  88. package/dist/scheduler/index.d.ts +10 -0
  89. package/dist/scheduler/index.d.ts.map +1 -0
  90. package/dist/scheduler/missed-fire.handler.d.ts +8 -0
  91. package/dist/scheduler/missed-fire.handler.d.ts.map +1 -0
  92. package/dist/scheduler/registry-schedule.d.ts +6 -0
  93. package/dist/scheduler/registry-schedule.d.ts.map +1 -0
  94. package/dist/scheduler/registry.d.ts +6 -0
  95. package/dist/scheduler/registry.d.ts.map +1 -0
  96. package/dist/scheduler/schedule-engine.d.ts +36 -0
  97. package/dist/scheduler/schedule-engine.d.ts.map +1 -0
  98. package/dist/scheduler-HRR3UXGE.mjs +1 -0
  99. package/dist/scheduler.d.mts +248 -0
  100. package/dist/scheduler.d.ts +248 -0
  101. package/dist/scheduler.js +1461 -0
  102. package/dist/scheduler.mjs +1 -0
  103. package/dist/server/express.d.ts +9 -0
  104. package/dist/server/express.d.ts.map +1 -0
  105. package/dist/server/fastify.d.ts +9 -0
  106. package/dist/server/fastify.d.ts.map +1 -0
  107. package/dist/server/handlers.d.ts +15 -0
  108. package/dist/server/handlers.d.ts.map +1 -0
  109. package/package.json +59 -0
package/dist/cron.js ADDED
@@ -0,0 +1,215 @@
1
+ 'use strict';
2
+
3
+ require('crypto');
4
+ require('url');
5
+ require('find-up');
6
+ var zod = require('zod');
7
+ var eventemitter3 = require('eventemitter3');
8
+ require('voltlog-io');
9
+ require('better-sqlite3');
10
+ var _cronParser = require('cron-parser');
11
+ require('rrule');
12
+
13
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
14
+
15
+ var _cronParser__default = /*#__PURE__*/_interopDefault(_cronParser);
16
+
17
+ // src/scheduler/cron-engine.ts
18
+ var isIOqronAdapter = (val) => {
19
+ if (!val || typeof val !== "object") return false;
20
+ return typeof val.upsertSchedule === "function" && typeof val.getDueSchedules === "function";
21
+ };
22
+ var isILockAdapter = (val) => {
23
+ if (!val || typeof val !== "object") return false;
24
+ return typeof val.acquire === "function" && typeof val.renew === "function";
25
+ };
26
+ zod.z.object({
27
+ project: zod.z.string().optional(),
28
+ environment: zod.z.string().default("development"),
29
+ // Infrastructure — Union of explicit DI or declarative config
30
+ db: zod.z.union([
31
+ zod.z.custom(
32
+ isIOqronAdapter,
33
+ "db must be an instance of IOqronAdapter"
34
+ ),
35
+ zod.z.object({
36
+ adapter: zod.z.enum([
37
+ "sqlite",
38
+ "memory",
39
+ "postgres",
40
+ "mysql",
41
+ "mongodb",
42
+ "redis"
43
+ ]),
44
+ url: zod.z.string().optional(),
45
+ poolMin: zod.z.number().default(2),
46
+ poolMax: zod.z.number().default(10),
47
+ tablePrefix: zod.z.string().default("chrono_"),
48
+ migrations: zod.z.union([zod.z.enum(["auto", "manual"]), zod.z.literal(false)]).default("auto"),
49
+ ssl: zod.z.boolean().default(false)
50
+ })
51
+ ]).optional(),
52
+ lock: zod.z.union([
53
+ zod.z.custom(
54
+ isILockAdapter,
55
+ "lock must be an instance of ILockAdapter"
56
+ ),
57
+ zod.z.object({
58
+ adapter: zod.z.enum(["db", "memory", "redis"]),
59
+ url: zod.z.string().optional(),
60
+ ttl: zod.z.number().default(3e4),
61
+ retryDelay: zod.z.number().default(200),
62
+ retryCount: zod.z.number().default(5)
63
+ })
64
+ ]).optional(),
65
+ broker: zod.z.any().optional(),
66
+ // Modules
67
+ modules: zod.z.array(
68
+ zod.z.enum([
69
+ "cron",
70
+ "scheduler",
71
+ "queue",
72
+ "workflow",
73
+ "batch",
74
+ "webhook",
75
+ "pipeline"
76
+ ])
77
+ ).default([]),
78
+ // Module-specific configs
79
+ cron: zod.z.object({
80
+ enable: zod.z.boolean().default(true),
81
+ timezone: zod.z.string().optional(),
82
+ tickInterval: zod.z.number().default(1e3),
83
+ missedFirePolicy: zod.z.enum(["skip", "run-once", "run-all"]).default("run-once"),
84
+ maxConcurrentJobs: zod.z.number().default(5),
85
+ leaderElection: zod.z.boolean().default(true),
86
+ keepJobHistory: zod.z.union([zod.z.boolean(), zod.z.number()]).default(true),
87
+ keepFailedJobHistory: zod.z.union([zod.z.boolean(), zod.z.number()]).default(true)
88
+ }).default({}),
89
+ scheduler: zod.z.object({
90
+ enable: zod.z.boolean().default(true),
91
+ tickInterval: zod.z.number().default(1e3),
92
+ keepJobHistory: zod.z.union([zod.z.boolean(), zod.z.number()]).default(true),
93
+ keepFailedJobHistory: zod.z.union([zod.z.boolean(), zod.z.number()]).default(true)
94
+ }).default({}),
95
+ // Auto-discovery directory
96
+ jobsDir: zod.z.string().default("./src/jobs"),
97
+ // Global tags
98
+ tags: zod.z.array(zod.z.string()).default([]),
99
+ // Worker
100
+ worker: zod.z.object({
101
+ concurrency: zod.z.number().default(50),
102
+ gracefulShutdownMs: zod.z.number().default(3e4)
103
+ }).default({ concurrency: 50, gracefulShutdownMs: 3e4 }),
104
+ // Logger (voltlog-io config or false to disable)
105
+ logger: zod.z.union([
106
+ zod.z.literal(false),
107
+ zod.z.object({
108
+ enabled: zod.z.boolean().default(true),
109
+ level: zod.z.string().default("info"),
110
+ prettify: zod.z.boolean().default(false),
111
+ showMetadata: zod.z.boolean().default(true),
112
+ redact: zod.z.array(zod.z.string()).default([])
113
+ })
114
+ ]).default({
115
+ enabled: true,
116
+ level: "info",
117
+ prettify: false,
118
+ showMetadata: true,
119
+ redact: []
120
+ }),
121
+ // Telemetry
122
+ telemetry: zod.z.object({
123
+ prometheus: zod.z.object({
124
+ enabled: zod.z.boolean().default(false),
125
+ path: zod.z.string().default("/metrics")
126
+ }).default({}),
127
+ opentelemetry: zod.z.object({
128
+ enabled: zod.z.boolean().default(false)
129
+ }).default({})
130
+ }).default({}),
131
+ // Shutdown
132
+ shutdown: zod.z.object({
133
+ enabled: zod.z.boolean().default(true),
134
+ timeout: zod.z.number().default(3e4),
135
+ signals: zod.z.array(zod.z.string()).default(["SIGINT", "SIGTERM"])
136
+ }).default({})
137
+ });
138
+ var OqronEventBusClass = class _OqronEventBusClass extends eventemitter3.EventEmitter {
139
+ static _instance;
140
+ static getInstance() {
141
+ if (!_OqronEventBusClass._instance) {
142
+ _OqronEventBusClass._instance = new _OqronEventBusClass();
143
+ }
144
+ return _OqronEventBusClass._instance;
145
+ }
146
+ };
147
+ OqronEventBusClass.getInstance();
148
+ _cronParser__default.default.default ?? _cronParser__default.default;
149
+ _cronParser__default.default.default ?? _cronParser__default.default;
150
+
151
+ // src/scheduler/registry.ts
152
+ var GLOBAL_KEY = "__oqronkit_pending_crons__";
153
+ function _getPending() {
154
+ if (!globalThis[GLOBAL_KEY]) {
155
+ globalThis[GLOBAL_KEY] = [];
156
+ }
157
+ return globalThis[GLOBAL_KEY];
158
+ }
159
+ function _registerCron(def) {
160
+ _getPending().push(def);
161
+ }
162
+
163
+ // src/scheduler/define-cron.ts
164
+ var cronParser3 = _cronParser__default.default.default ?? _cronParser__default.default;
165
+ function everyToIntervalMs(every) {
166
+ let ms = 0;
167
+ if (every.seconds) ms += every.seconds * 1e3;
168
+ if (every.minutes) ms += every.minutes * 6e4;
169
+ if (every.hours) ms += every.hours * 36e5;
170
+ if (ms <= 0)
171
+ throw new Error(
172
+ "[OqronKit] `every` config must resolve to a positive interval"
173
+ );
174
+ return ms;
175
+ }
176
+ var cron = (options) => {
177
+ let expression;
178
+ let intervalMs;
179
+ if ("expression" in options && options.expression) {
180
+ try {
181
+ cronParser3.parseExpression(options.expression, { tz: options.timezone });
182
+ } catch {
183
+ throw new Error(
184
+ `[OqronKit] Invalid cron expression for "${options.name}": "${options.expression}"`
185
+ );
186
+ }
187
+ expression = options.expression;
188
+ } else if ("every" in options && options.every) {
189
+ intervalMs = everyToIntervalMs(options.every);
190
+ } else {
191
+ throw new Error(
192
+ `[OqronKit] Cron "${options.name}" must specify either "expression" or "every"`
193
+ );
194
+ }
195
+ const def = {
196
+ name: options.name,
197
+ expression,
198
+ intervalMs,
199
+ timezone: options.timezone,
200
+ missedFire: options.missedFire ?? "skip",
201
+ overlap: options.overlap ?? "skip",
202
+ guaranteedWorker: options.guaranteedWorker ?? false,
203
+ heartbeatMs: options.heartbeatMs,
204
+ lockTtlMs: options.lockTtlMs,
205
+ timeout: options.timeout,
206
+ tags: options.tags ?? [],
207
+ handler: options.handler,
208
+ hooks: options.hooks,
209
+ retries: options.retries
210
+ };
211
+ _registerCron(def);
212
+ return def;
213
+ };
214
+
215
+ exports.cron = cron;
package/dist/cron.mjs ADDED
@@ -0,0 +1 @@
1
+ export { cron } from './chunk-PLN5A6LU.mjs';
@@ -0,0 +1,25 @@
1
+ import type { CronDefinition, JobRecord } from "../../core/types/cron.types.js";
2
+ import type { IOqronAdapter } from "../../core/types/db.types.js";
3
+ import type { ScheduleDefinition } from "../../core/types/scheduler.types.js";
4
+ export declare class MemoryOqronAdapter implements IOqronAdapter {
5
+ private schedules;
6
+ private jobs;
7
+ upsertSchedule(def: CronDefinition | ScheduleDefinition): Promise<void>;
8
+ getDueSchedules(now: Date, limit: number, prefix?: string): Promise<Pick<CronDefinition | ScheduleDefinition, "name">[]>;
9
+ getSchedules(prefix?: string): Promise<Array<{
10
+ name: string;
11
+ lastRunAt: Date | null;
12
+ nextRunAt: Date | null;
13
+ }>>;
14
+ updateNextRun(scheduleId: string, nextRunAt: Date | null): Promise<void>;
15
+ recordExecution(job: JobRecord): Promise<void>;
16
+ updateJobProgress(id: string, progressPercent: number, progressLabel?: string): Promise<void>;
17
+ getExecutions(scheduleId: string, opts: {
18
+ limit: number;
19
+ offset: number;
20
+ }): Promise<JobRecord[]>;
21
+ getActiveJobs(): Promise<JobRecord[]>;
22
+ cleanOldExecutions(before: Date): Promise<number>;
23
+ pruneHistoryForSchedule(scheduleId: string, keepJobHistory: number | boolean, keepFailedJobHistory: number | boolean): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=memory.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.adapter.d.ts","sourceRoot":"","sources":["../../../src/db/adapters/memory.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAQ9E,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,IAAI,CAAgC;IAEtC,cAAc,CAClB,GAAG,EAAE,cAAc,GAAG,kBAAkB,GACvC,OAAO,CAAC,IAAI,CAAC;IAUV,eAAe,CACnB,GAAG,EAAE,IAAI,EACT,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,kBAAkB,EAAE,MAAM,CAAC,EAAE,CAAC;IAYzD,YAAY,CAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CACR,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE,CAAC,CACxE;IAcK,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,IAAI,GAAG,IAAI,GACrB,OAAO,CAAC,IAAI,CAAC;IAOV,eAAe,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB9C,iBAAiB,CACrB,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,MAAM,EACvB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC;IAQV,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACtC,OAAO,CAAC,SAAS,EAAE,CAAC;IAOjB,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIrC,kBAAkB,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAWjD,uBAAuB,CAC3B,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GAAG,OAAO,EAChC,oBAAoB,EAAE,MAAM,GAAG,OAAO,GACrC,OAAO,CAAC,IAAI,CAAC;CA8BjB"}
@@ -0,0 +1,26 @@
1
+ import type { CronDefinition, IOqronAdapter, JobRecord, ScheduleDefinition } from "../../core/index.js";
2
+ export declare class NamespacedOqronAdapter implements IOqronAdapter {
3
+ private readonly base;
4
+ private readonly prefix;
5
+ constructor(base: IOqronAdapter, project?: string, environment?: string);
6
+ private ns;
7
+ private un;
8
+ upsertSchedule(def: CronDefinition | ScheduleDefinition): Promise<void>;
9
+ getDueSchedules(now: Date, limit: number, prefix?: string): Promise<Pick<CronDefinition | ScheduleDefinition, "name">[]>;
10
+ getSchedules(prefix?: string): Promise<Array<{
11
+ name: string;
12
+ lastRunAt: Date | null;
13
+ nextRunAt: Date | null;
14
+ }>>;
15
+ updateNextRun(scheduleId: string, nextRunAt: Date | null): Promise<void>;
16
+ recordExecution(job: JobRecord): Promise<void>;
17
+ updateJobProgress(id: string, progressPercent: number, progressLabel?: string): Promise<void>;
18
+ getExecutions(scheduleId: string, opts: {
19
+ limit: number;
20
+ offset: number;
21
+ }): Promise<JobRecord[]>;
22
+ getActiveJobs(): Promise<JobRecord[]>;
23
+ cleanOldExecutions(before: Date): Promise<number>;
24
+ pruneHistoryForSchedule(scheduleId: string, keepJobHistory: number | boolean, keepFailedJobHistory: number | boolean): Promise<void>;
25
+ }
26
+ //# sourceMappingURL=namespaced.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespaced.adapter.d.ts","sourceRoot":"","sources":["../../../src/db/adapters/namespaced.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,SAAS,EACT,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,sBAAuB,YAAW,aAAa;IAIxD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAGb,IAAI,EAAE,aAAa,EACpC,OAAO,GAAE,MAAkB,EAC3B,WAAW,GAAE,MAAsB;IAKrC,OAAO,CAAC,EAAE;IAIV,OAAO,CAAC,EAAE;IAIJ,cAAc,CAClB,GAAG,EAAE,cAAc,GAAG,kBAAkB,GACvC,OAAO,CAAC,IAAI,CAAC;IAIV,eAAe,CACnB,GAAG,EAAE,IAAI,EACT,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,kBAAkB,EAAE,MAAM,CAAC,EAAE,CAAC;IAQzD,YAAY,CAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CACR,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE,CAAC,CACxE;IAWK,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,IAAI,GAAG,IAAI,GACrB,OAAO,CAAC,IAAI,CAAC;IAIV,eAAe,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9C,iBAAiB,CACrB,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,MAAM,EACvB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC;IAIV,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACtC,OAAO,CAAC,SAAS,EAAE,CAAC;IAQjB,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAUrC,kBAAkB,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAMjD,uBAAuB,CAC3B,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GAAG,OAAO,EAChC,oBAAoB,EAAE,MAAM,GAAG,OAAO,GACrC,OAAO,CAAC,IAAI,CAAC;CAOjB"}
@@ -0,0 +1,30 @@
1
+ import Database from "better-sqlite3";
2
+ import type { CronDefinition, IOqronAdapter, JobRecord, ScheduleDefinition } from "../../core/index.js";
3
+ export declare class SqliteAdapter implements IOqronAdapter {
4
+ private readonly db;
5
+ /**
6
+ * @param dbOrPath - Either a `better-sqlite3` Database instance (for testing with `:memory:`)
7
+ * or a file path string. Defaults to `"oqron.sqlite"`.
8
+ */
9
+ constructor(dbOrPath?: Database.Database | string);
10
+ /** Create tables if they don't exist */
11
+ migrate(): void;
12
+ upsertSchedule(def: CronDefinition | ScheduleDefinition): Promise<void>;
13
+ getDueSchedules(now: Date, limit: number, prefix?: string): Promise<Pick<CronDefinition, "name">[]>;
14
+ getSchedules(prefix?: string): Promise<Array<{
15
+ name: string;
16
+ lastRunAt: Date | null;
17
+ nextRunAt: Date | null;
18
+ }>>;
19
+ updateNextRun(scheduleId: string, nextRunAt: Date | null): Promise<void>;
20
+ updateJobProgress(id: string, progressPercent: number, progressLabel?: string): Promise<void>;
21
+ recordExecution(job: JobRecord): Promise<void>;
22
+ getExecutions(scheduleId: string, opts: {
23
+ limit: number;
24
+ offset: number;
25
+ }): Promise<JobRecord[]>;
26
+ getActiveJobs(): Promise<JobRecord[]>;
27
+ cleanOldExecutions(before: Date): Promise<number>;
28
+ pruneHistoryForSchedule(scheduleId: string, keepJobHistory: number | boolean, keepFailedJobHistory: number | boolean): Promise<void>;
29
+ }
30
+ //# sourceMappingURL=sqlite.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.adapter.d.ts","sourceRoot":"","sources":["../../../src/db/adapters/sqlite.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,SAAS,EACT,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IAEvC;;;OAGG;gBACS,QAAQ,GAAE,QAAQ,CAAC,QAAQ,GAAG,MAAuB;IAYjE,wCAAwC;IACxC,OAAO,IAAI,IAAI;IA8DT,cAAc,CAClB,GAAG,EAAE,cAAc,GAAG,kBAAkB,GACvC,OAAO,CAAC,IAAI,CAAC;IA4CV,eAAe,CACnB,GAAG,EAAE,IAAI,EACT,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC;IAepC,YAAY,CAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CACR,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE,CAAC,CACxE;IAqBK,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,IAAI,GAAG,IAAI,GACrB,OAAO,CAAC,IAAI,CAAC;IAMV,iBAAiB,CACrB,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,MAAM,EACvB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC;IAQV,eAAe,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAuC9C,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACtC,OAAO,CAAC,SAAS,EAAE,CAAC;IAqCjB,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAmCrC,kBAAkB,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAOjD,uBAAuB,CAC3B,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GAAG,OAAO,EAChC,oBAAoB,EAAE,MAAM,GAAG,OAAO,GACrC,OAAO,CAAC,IAAI,CAAC;CAmCjB"}
@@ -0,0 +1,4 @@
1
+ export { MemoryOqronAdapter } from "./adapters/memory.adapter.js";
2
+ export { NamespacedOqronAdapter } from "./adapters/namespaced.adapter.js";
3
+ export { SqliteAdapter } from "./adapters/sqlite.adapter.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC"}