@tinyrack/tinyauth-server 0.0.13 → 0.0.15

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 (152) hide show
  1. package/dist/entities/background-job.entity.d.ts +111 -0
  2. package/dist/entities/background-job.entity.d.ts.map +1 -0
  3. package/dist/entities/background-job.entity.js +41 -0
  4. package/dist/entities/background-job.entity.js.map +1 -0
  5. package/dist/entities/oauth-client.entity.d.ts.map +1 -1
  6. package/dist/entities/oauth-client.entity.js +2 -2
  7. package/dist/entities/oauth-client.entity.js.map +1 -1
  8. package/dist/entities/scheduler-job.entity.d.ts +134 -0
  9. package/dist/entities/scheduler-job.entity.d.ts.map +1 -0
  10. package/dist/entities/scheduler-job.entity.js +48 -0
  11. package/dist/entities/scheduler-job.entity.js.map +1 -0
  12. package/dist/entities/user.entity.d.ts.map +1 -1
  13. package/dist/entities/user.entity.js +2 -2
  14. package/dist/entities/user.entity.js.map +1 -1
  15. package/dist/entrypoints/app.d.ts +1 -1
  16. package/dist/entrypoints/database/postgres/compiled-functions.d.ts +280 -170
  17. package/dist/entrypoints/database/postgres/compiled-functions.d.ts.map +1 -1
  18. package/dist/entrypoints/database/postgres/compiled-functions.js +3435 -2167
  19. package/dist/entrypoints/database/postgres/compiled-functions.js.map +1 -1
  20. package/dist/entrypoints/database/postgres/postgres.d.ts +7 -2
  21. package/dist/entrypoints/database/postgres/postgres.d.ts.map +1 -1
  22. package/dist/entrypoints/database/postgres/postgres.js +4 -5
  23. package/dist/entrypoints/database/postgres/postgres.js.map +1 -1
  24. package/dist/entrypoints/database/sqlite/compiled-functions.d.ts +280 -170
  25. package/dist/entrypoints/database/sqlite/compiled-functions.d.ts.map +1 -1
  26. package/dist/entrypoints/database/sqlite/compiled-functions.js +3435 -2167
  27. package/dist/entrypoints/database/sqlite/compiled-functions.js.map +1 -1
  28. package/dist/entrypoints/database/sqlite/sqlite.d.ts +6 -2
  29. package/dist/entrypoints/database/sqlite/sqlite.d.ts.map +1 -1
  30. package/dist/entrypoints/database/sqlite/sqlite.js +3 -4
  31. package/dist/entrypoints/database/sqlite/sqlite.js.map +1 -1
  32. package/dist/entrypoints/frontend/index.d.ts +0 -2
  33. package/dist/entrypoints/frontend/index.d.ts.map +1 -1
  34. package/dist/entrypoints/frontend/index.js +0 -1
  35. package/dist/entrypoints/frontend/index.js.map +1 -1
  36. package/dist/entrypoints/scheduler/cron.d.ts +3 -0
  37. package/dist/entrypoints/scheduler/cron.d.ts.map +1 -0
  38. package/dist/entrypoints/scheduler/cron.js +34 -0
  39. package/dist/entrypoints/scheduler/cron.js.map +1 -0
  40. package/dist/entrypoints/scheduler/croner.d.ts +1 -1
  41. package/dist/entrypoints/scheduler/croner.d.ts.map +1 -1
  42. package/dist/entrypoints/scheduler/croner.js +27 -7
  43. package/dist/entrypoints/scheduler/croner.js.map +1 -1
  44. package/dist/entrypoints/scheduler/database.d.ts +38 -0
  45. package/dist/entrypoints/scheduler/database.d.ts.map +1 -0
  46. package/dist/entrypoints/scheduler/database.js +444 -0
  47. package/dist/entrypoints/scheduler/database.js.map +1 -0
  48. package/dist/entrypoints/scheduler/distributed-runner.d.ts +134 -0
  49. package/dist/entrypoints/scheduler/distributed-runner.d.ts.map +1 -0
  50. package/dist/entrypoints/scheduler/distributed-runner.js +327 -0
  51. package/dist/entrypoints/scheduler/distributed-runner.js.map +1 -0
  52. package/dist/lib/config/client.d.ts.map +1 -1
  53. package/dist/lib/config/client.js +5 -1
  54. package/dist/lib/config/client.js.map +1 -1
  55. package/dist/lib/config/index.d.ts +2 -2
  56. package/dist/lib/config/index.d.ts.map +1 -1
  57. package/dist/lib/config/index.js +1 -1
  58. package/dist/lib/config/index.js.map +1 -1
  59. package/dist/lib/config/resolved.d.ts +1 -1
  60. package/dist/lib/config/resolved.d.ts.map +1 -1
  61. package/dist/lib/config/resolved.js +1 -1
  62. package/dist/lib/config/resolved.js.map +1 -1
  63. package/dist/lib/config/scheduler.d.ts +41 -2
  64. package/dist/lib/config/scheduler.d.ts.map +1 -1
  65. package/dist/lib/config/scheduler.js +9 -3
  66. package/dist/lib/config/scheduler.js.map +1 -1
  67. package/dist/lib/config/user.d.ts.map +1 -1
  68. package/dist/lib/config/user.js +5 -1
  69. package/dist/lib/config/user.js.map +1 -1
  70. package/dist/lib/database/entities.d.ts.map +1 -1
  71. package/dist/lib/database/entities.js +4 -0
  72. package/dist/lib/database/entities.js.map +1 -1
  73. package/dist/migrations/postgres/Migration20260509171036_initial.d.ts.map +1 -1
  74. package/dist/migrations/postgres/Migration20260509171036_initial.js +14 -14
  75. package/dist/migrations/postgres/Migration20260509171036_initial.js.map +1 -1
  76. package/dist/migrations/postgres/Migration20260512120000_add_scheduler_jobs.d.ts +5 -0
  77. package/dist/migrations/postgres/Migration20260512120000_add_scheduler_jobs.d.ts.map +1 -0
  78. package/dist/migrations/postgres/Migration20260512120000_add_scheduler_jobs.js +15 -0
  79. package/dist/migrations/postgres/Migration20260512120000_add_scheduler_jobs.js.map +1 -0
  80. package/dist/migrations/postgres/index.d.ts.map +1 -1
  81. package/dist/migrations/postgres/index.js +5 -1
  82. package/dist/migrations/postgres/index.js.map +1 -1
  83. package/dist/migrations/sqlite/Migration20260512120000_add_scheduler_jobs.d.ts +5 -0
  84. package/dist/migrations/sqlite/Migration20260512120000_add_scheduler_jobs.d.ts.map +1 -0
  85. package/dist/migrations/sqlite/Migration20260512120000_add_scheduler_jobs.js +13 -0
  86. package/dist/migrations/sqlite/Migration20260512120000_add_scheduler_jobs.js.map +1 -0
  87. package/dist/migrations/sqlite/index.d.ts.map +1 -1
  88. package/dist/migrations/sqlite/index.js +5 -1
  89. package/dist/migrations/sqlite/index.js.map +1 -1
  90. package/dist/repositories/background-job.repository.d.ts +5 -0
  91. package/dist/repositories/background-job.repository.d.ts.map +1 -0
  92. package/dist/repositories/background-job.repository.js +4 -0
  93. package/dist/repositories/background-job.repository.js.map +1 -0
  94. package/dist/repositories/scheduler-job.repository.d.ts +5 -0
  95. package/dist/repositories/scheduler-job.repository.d.ts.map +1 -0
  96. package/dist/repositories/scheduler-job.repository.js +4 -0
  97. package/dist/repositories/scheduler-job.repository.js.map +1 -0
  98. package/dist/schemas/field.d.ts +2 -1
  99. package/dist/schemas/field.d.ts.map +1 -1
  100. package/dist/schemas/field.js +6 -1
  101. package/dist/schemas/field.js.map +1 -1
  102. package/dist/schemas/oauth.js +1 -1
  103. package/dist/schemas/oauth.js.map +1 -1
  104. package/dist/schemas/response.d.ts +12 -12
  105. package/dist/schemas/response.js +2 -2
  106. package/dist/schemas/response.js.map +1 -1
  107. package/dist/services/container.d.ts +2 -2
  108. package/dist/services/container.d.ts.map +1 -1
  109. package/dist/services/container.js +7 -1
  110. package/dist/services/container.js.map +1 -1
  111. package/dist/services/mikro.service.d.ts +4 -0
  112. package/dist/services/mikro.service.d.ts.map +1 -1
  113. package/dist/services/mikro.service.js +6 -0
  114. package/dist/services/mikro.service.js.map +1 -1
  115. package/dist/services/scheduler.service.d.ts +6 -1
  116. package/dist/services/scheduler.service.d.ts.map +1 -1
  117. package/dist/services/scheduler.service.js +44 -11
  118. package/dist/services/scheduler.service.js.map +1 -1
  119. package/package.json +8 -18
  120. package/readme.md +0 -1
  121. package/dist/entrypoints/database/d1/cli.d.ts +0 -4
  122. package/dist/entrypoints/database/d1/cli.d.ts.map +0 -1
  123. package/dist/entrypoints/database/d1/cli.js +0 -45
  124. package/dist/entrypoints/database/d1/cli.js.map +0 -1
  125. package/dist/entrypoints/database/d1/compiled-functions.d.ts +0 -691
  126. package/dist/entrypoints/database/d1/compiled-functions.d.ts.map +0 -1
  127. package/dist/entrypoints/database/d1/compiled-functions.js +0 -8616
  128. package/dist/entrypoints/database/d1/compiled-functions.js.map +0 -1
  129. package/dist/entrypoints/database/d1/d1.d.ts +0 -5
  130. package/dist/entrypoints/database/d1/d1.d.ts.map +0 -1
  131. package/dist/entrypoints/database/d1/d1.js +0 -35
  132. package/dist/entrypoints/database/d1/d1.js.map +0 -1
  133. package/dist/entrypoints/frontend/cloudflare.d.ts +0 -2
  134. package/dist/entrypoints/frontend/cloudflare.d.ts.map +0 -1
  135. package/dist/entrypoints/frontend/cloudflare.js +0 -2
  136. package/dist/entrypoints/frontend/cloudflare.js.map +0 -1
  137. package/dist/lib/database/compiled-functions.d.ts +0 -16
  138. package/dist/lib/database/compiled-functions.d.ts.map +0 -1
  139. package/dist/lib/database/compiled-functions.js +0 -66
  140. package/dist/lib/database/compiled-functions.js.map +0 -1
  141. package/dist/lib/frontend/cloudflare.d.ts +0 -12
  142. package/dist/lib/frontend/cloudflare.d.ts.map +0 -1
  143. package/dist/lib/frontend/cloudflare.js +0 -34
  144. package/dist/lib/frontend/cloudflare.js.map +0 -1
  145. package/dist/migrations/d1/Migration20260509172833_initial.d.ts +0 -5
  146. package/dist/migrations/d1/Migration20260509172833_initial.d.ts.map +0 -1
  147. package/dist/migrations/d1/Migration20260509172833_initial.js +0 -62
  148. package/dist/migrations/d1/Migration20260509172833_initial.js.map +0 -1
  149. package/dist/migrations/d1/index.d.ts +0 -3
  150. package/dist/migrations/d1/index.d.ts.map +0 -1
  151. package/dist/migrations/d1/index.js +0 -3
  152. package/dist/migrations/d1/index.js.map +0 -1
@@ -0,0 +1,444 @@
1
+ import os from 'node:os';
2
+ import { BackgroundJobEntitySchema } from "../../entities/background-job.entity.js";
3
+ import { SchedulerJobEntitySchema } from "../../entities/scheduler-job.entity.js";
4
+ import { validateCronExpression } from "./cron.js";
5
+ import { DistributedBackgroundJobRunner, DistributedSchedulerRunner, getDistributedSchedulerNextRunAt, } from "./distributed-runner.js";
6
+ const DEFAULT_CLEANUP_CRON = '0 2 * * *';
7
+ const DEFAULT_POLL_INTERVAL_MS = 5000;
8
+ const DEFAULT_LOCK_TTL_MS = 60000;
9
+ const DEFAULT_BACKGROUND_RETRY_DELAY_MS = 1000;
10
+ const DEFAULT_BACKGROUND_MAX_ATTEMPTS = 3;
11
+ const DEFAULT_BACKGROUND_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
12
+ const MAX_ERROR_LENGTH = 2000;
13
+ const JSON_SAFE_PAYLOAD_ERROR = 'Background job payload must be JSON-safe';
14
+ function createInstanceId(instanceId) {
15
+ return instanceId ?? `${os.hostname()}:${process.pid}:${crypto.randomUUID()}`;
16
+ }
17
+ function resolvePositiveNumber(name, value, defaultValue) {
18
+ const resolved = value ?? defaultValue;
19
+ if (!Number.isFinite(resolved) || resolved <= 0) {
20
+ throw new Error(`${name} must be a positive number`);
21
+ }
22
+ return resolved;
23
+ }
24
+ function resolvePositiveInteger(name, value, defaultValue) {
25
+ const resolved = resolvePositiveNumber(name, value, defaultValue);
26
+ if (!Number.isInteger(resolved)) {
27
+ throw new Error(`${name} must be a positive integer`);
28
+ }
29
+ return resolved;
30
+ }
31
+ function errorToMessage(err) {
32
+ const message = err instanceof Error ? err.message : String(err);
33
+ return message.slice(0, MAX_ERROR_LENGTH);
34
+ }
35
+ function validateJsonSafePayload(value, path, seen) {
36
+ if (value === null) {
37
+ return;
38
+ }
39
+ switch (typeof value) {
40
+ case 'boolean':
41
+ case 'string':
42
+ return;
43
+ case 'number':
44
+ if (!Number.isFinite(value)) {
45
+ throw new Error(`${JSON_SAFE_PAYLOAD_ERROR}: ${path} must be finite`);
46
+ }
47
+ return;
48
+ case 'undefined':
49
+ throw new Error(`${JSON_SAFE_PAYLOAD_ERROR}: ${path} is undefined`);
50
+ case 'bigint':
51
+ case 'function':
52
+ case 'symbol':
53
+ throw new Error(`${JSON_SAFE_PAYLOAD_ERROR}: ${path} has unsupported type ${typeof value}`);
54
+ }
55
+ if (seen.has(value)) {
56
+ throw new Error(`${JSON_SAFE_PAYLOAD_ERROR}: ${path} contains a cycle`);
57
+ }
58
+ if (Object.hasOwn(value, 'toJSON')) {
59
+ throw new Error(`${JSON_SAFE_PAYLOAD_ERROR}: ${path} must not define toJSON`);
60
+ }
61
+ const prototype = Object.getPrototypeOf(value);
62
+ if (!Array.isArray(value) &&
63
+ prototype !== Object.prototype &&
64
+ prototype !== null) {
65
+ throw new Error(`${JSON_SAFE_PAYLOAD_ERROR}: ${path} must be a plain object`);
66
+ }
67
+ seen.add(value);
68
+ if (Array.isArray(value)) {
69
+ for (let index = 0; index < value.length; index += 1) {
70
+ if (!(index in value)) {
71
+ throw new Error(`${JSON_SAFE_PAYLOAD_ERROR}: ${path}[${index}] is undefined`);
72
+ }
73
+ validateJsonSafePayload(value[index], `${path}[${index}]`, seen);
74
+ }
75
+ }
76
+ else {
77
+ for (const [key, child] of Object.entries(value)) {
78
+ validateJsonSafePayload(child, `${path}.${key}`, seen);
79
+ }
80
+ }
81
+ seen.delete(value);
82
+ }
83
+ function stringifyJsonSafePayload(payload) {
84
+ validateJsonSafePayload(payload, 'payload', new WeakSet());
85
+ const serialized = JSON.stringify(payload);
86
+ if (serialized === undefined) {
87
+ throw new Error(`${JSON_SAFE_PAYLOAD_ERROR}: payload is undefined`);
88
+ }
89
+ return serialized;
90
+ }
91
+ function resolveOptions(options) {
92
+ return {
93
+ cleanupCron: validateCronExpression(options.cleanupCron ?? DEFAULT_CLEANUP_CRON),
94
+ pollIntervalMs: resolvePositiveNumber('pollIntervalMs', options.pollIntervalMs, DEFAULT_POLL_INTERVAL_MS),
95
+ lockTtlMs: resolvePositiveNumber('lockTtlMs', options.lockTtlMs, DEFAULT_LOCK_TTL_MS),
96
+ backgroundRetryDelayMs: resolvePositiveNumber('backgroundRetryDelayMs', options.backgroundRetryDelayMs, DEFAULT_BACKGROUND_RETRY_DELAY_MS),
97
+ backgroundMaxAttempts: resolvePositiveInteger('backgroundMaxAttempts', options.backgroundMaxAttempts, DEFAULT_BACKGROUND_MAX_ATTEMPTS),
98
+ backgroundRetentionMs: resolvePositiveNumber('backgroundRetentionMs', options.backgroundRetentionMs, DEFAULT_BACKGROUND_RETENTION_MS),
99
+ instanceId: createInstanceId(options.instanceId),
100
+ };
101
+ }
102
+ export class DatabaseSchedulerStore {
103
+ mikro;
104
+ constructor(mikro) {
105
+ this.mikro = mikro;
106
+ }
107
+ async reconcileJobs(jobs, now) {
108
+ const em = this.mikro.em.fork();
109
+ const repo = em.getRepository(SchedulerJobEntitySchema);
110
+ const jobIds = jobs.map((job) => job.id);
111
+ for (const job of jobs) {
112
+ const existing = await repo.findOne({ id: job.id });
113
+ const nextRunAt = getDistributedSchedulerNextRunAt(job.cron, now);
114
+ const shouldResetNextRunAt = !existing?.nextRunAt || existing.cron !== job.cron;
115
+ await em.upsert(SchedulerJobEntitySchema, {
116
+ id: job.id,
117
+ name: job.name,
118
+ enabled: true,
119
+ cron: job.cron,
120
+ nextRunAt: shouldResetNextRunAt ? nextRunAt : existing.nextRunAt,
121
+ created_at: now,
122
+ updated_at: now,
123
+ }, {
124
+ onConflictFields: ['id'],
125
+ onConflictAction: 'merge',
126
+ onConflictExcludeFields: ['id', 'created_at'],
127
+ });
128
+ }
129
+ const staleJobFilter = jobIds.length > 0 ? { id: { $nin: jobIds } } : {};
130
+ await repo.nativeUpdate(staleJobFilter, { enabled: false });
131
+ }
132
+ async acquireDueJob(now, lockedUntil, instanceId) {
133
+ const em = this.mikro.em.fork();
134
+ const repo = em.getRepository(SchedulerJobEntitySchema);
135
+ const seenCandidateIds = [];
136
+ const eligibleFilter = {
137
+ enabled: true,
138
+ nextRunAt: { $lte: now },
139
+ $or: [{ lockedUntil: null }, { lockedUntil: { $lte: now } }],
140
+ };
141
+ while (true) {
142
+ const candidateFilter = {
143
+ ...eligibleFilter,
144
+ ...(seenCandidateIds.length > 0
145
+ ? { id: { $nin: seenCandidateIds } }
146
+ : {}),
147
+ };
148
+ const candidate = await repo.findOne(candidateFilter, {
149
+ orderBy: { nextRunAt: 'ASC' },
150
+ });
151
+ if (!candidate) {
152
+ return null;
153
+ }
154
+ const updated = await repo.nativeUpdate({
155
+ id: candidate.id,
156
+ ...eligibleFilter,
157
+ }, {
158
+ lockedBy: instanceId,
159
+ lockedUntil,
160
+ lastRunAt: now,
161
+ });
162
+ if (updated !== 1) {
163
+ seenCandidateIds.push(candidate.id);
164
+ continue;
165
+ }
166
+ return {
167
+ id: candidate.id,
168
+ cron: candidate.cron,
169
+ runCount: candidate.runCount,
170
+ failureCount: candidate.failureCount,
171
+ };
172
+ }
173
+ }
174
+ async renewLease(jobId, instanceId, lockedUntil, now) {
175
+ const em = this.mikro.em.fork();
176
+ const repo = em.getRepository(SchedulerJobEntitySchema);
177
+ const updated = await repo.nativeUpdate({
178
+ id: jobId,
179
+ lockedBy: instanceId,
180
+ lockedUntil: { $gt: now, $lt: lockedUntil },
181
+ }, { lockedUntil });
182
+ return updated === 1;
183
+ }
184
+ async completeJobSuccess(input) {
185
+ const em = this.mikro.em.fork();
186
+ const repo = em.getRepository(SchedulerJobEntitySchema);
187
+ const updated = await repo.nativeUpdate({
188
+ id: input.jobId,
189
+ cron: input.cron,
190
+ lockedBy: input.instanceId,
191
+ lockedUntil: { $gt: input.now },
192
+ }, {
193
+ lockedBy: null,
194
+ lockedUntil: null,
195
+ nextRunAt: input.nextRunAt,
196
+ runCount: input.runCount,
197
+ lastSuccessAt: input.now,
198
+ });
199
+ return updated === 1;
200
+ }
201
+ async completeJobFailure(input) {
202
+ const em = this.mikro.em.fork();
203
+ const repo = em.getRepository(SchedulerJobEntitySchema);
204
+ const updated = await repo.nativeUpdate({
205
+ id: input.jobId,
206
+ cron: input.cron,
207
+ lockedBy: input.instanceId,
208
+ lockedUntil: { $gt: input.now },
209
+ }, {
210
+ lockedBy: null,
211
+ lockedUntil: null,
212
+ nextRunAt: input.nextRunAt,
213
+ runCount: input.runCount,
214
+ lastErrorAt: input.now,
215
+ lastError: input.error,
216
+ failureCount: input.failureCount,
217
+ });
218
+ return updated === 1;
219
+ }
220
+ async findNextRunAt() {
221
+ const em = this.mikro.em.fork();
222
+ const repo = em.getRepository(SchedulerJobEntitySchema);
223
+ const next = await repo.findOne({ enabled: true, nextRunAt: { $ne: null } }, { orderBy: { nextRunAt: 'ASC' } });
224
+ return next?.nextRunAt ?? null;
225
+ }
226
+ }
227
+ export class DatabaseBackgroundJobStore {
228
+ mikro;
229
+ constructor(mikro) {
230
+ this.mikro = mikro;
231
+ }
232
+ async enqueue(input) {
233
+ const em = this.mikro.em.fork();
234
+ const id = crypto.randomUUID();
235
+ const job = em.create(BackgroundJobEntitySchema, {
236
+ id,
237
+ jobId: input.jobId,
238
+ payload: stringifyJsonSafePayload(input.payload),
239
+ status: 'pending',
240
+ availableAt: input.availableAt,
241
+ lockedBy: null,
242
+ lockedUntil: null,
243
+ attemptCount: 0,
244
+ maxAttempts: input.maxAttempts,
245
+ lastError: null,
246
+ completedAt: null,
247
+ created_at: input.now,
248
+ updated_at: input.now,
249
+ });
250
+ em.persist(job);
251
+ await em.flush();
252
+ return id;
253
+ }
254
+ async acquireDueJob(now, lockedUntil, instanceId) {
255
+ const em = this.mikro.em.fork();
256
+ const repo = em.getRepository(BackgroundJobEntitySchema);
257
+ const seenCandidateIds = [];
258
+ const eligibleFilter = {
259
+ $or: [
260
+ {
261
+ status: 'pending',
262
+ availableAt: { $lte: now },
263
+ },
264
+ {
265
+ status: 'running',
266
+ lockedUntil: { $lte: now },
267
+ },
268
+ ],
269
+ };
270
+ while (true) {
271
+ const candidateFilter = {
272
+ ...eligibleFilter,
273
+ ...(seenCandidateIds.length > 0
274
+ ? { id: { $nin: seenCandidateIds } }
275
+ : {}),
276
+ };
277
+ const candidate = await repo.findOne(candidateFilter, {
278
+ orderBy: { availableAt: 'ASC' },
279
+ });
280
+ if (!candidate) {
281
+ return null;
282
+ }
283
+ if (candidate.status === 'running' &&
284
+ candidate.attemptCount >= candidate.maxAttempts) {
285
+ await repo.nativeUpdate({ id: candidate.id, ...eligibleFilter }, {
286
+ status: 'failed',
287
+ availableAt: now,
288
+ lockedBy: null,
289
+ lockedUntil: null,
290
+ lastError: 'Background job exceeded maximum attempts',
291
+ completedAt: now,
292
+ });
293
+ continue;
294
+ }
295
+ const attemptCount = candidate.attemptCount + 1;
296
+ const updated = await repo.nativeUpdate({ id: candidate.id, ...eligibleFilter }, {
297
+ status: 'running',
298
+ lockedBy: instanceId,
299
+ lockedUntil,
300
+ attemptCount,
301
+ });
302
+ if (updated !== 1) {
303
+ seenCandidateIds.push(candidate.id);
304
+ continue;
305
+ }
306
+ let payload;
307
+ try {
308
+ payload = JSON.parse(candidate.payload);
309
+ }
310
+ catch (err) {
311
+ await repo.nativeUpdate({
312
+ id: candidate.id,
313
+ lockedBy: instanceId,
314
+ status: 'running',
315
+ lockedUntil: { $gt: now },
316
+ }, {
317
+ status: 'failed',
318
+ availableAt: now,
319
+ lockedBy: null,
320
+ lockedUntil: null,
321
+ attemptCount,
322
+ lastError: errorToMessage(err),
323
+ completedAt: now,
324
+ });
325
+ continue;
326
+ }
327
+ return {
328
+ id: candidate.id,
329
+ jobId: candidate.jobId,
330
+ payload,
331
+ attemptCount,
332
+ maxAttempts: candidate.maxAttempts,
333
+ };
334
+ }
335
+ }
336
+ async renewLease(id, instanceId, lockedUntil, now) {
337
+ const em = this.mikro.em.fork();
338
+ const repo = em.getRepository(BackgroundJobEntitySchema);
339
+ const updated = await repo.nativeUpdate({
340
+ id,
341
+ lockedBy: instanceId,
342
+ status: 'running',
343
+ lockedUntil: { $gt: now, $lt: lockedUntil },
344
+ }, { lockedUntil });
345
+ return updated === 1;
346
+ }
347
+ async completeJobSuccess(input) {
348
+ const em = this.mikro.em.fork();
349
+ const repo = em.getRepository(BackgroundJobEntitySchema);
350
+ const updated = await repo.nativeUpdate({
351
+ id: input.id,
352
+ lockedBy: input.instanceId,
353
+ status: 'running',
354
+ lockedUntil: { $gt: input.now },
355
+ }, {
356
+ status: 'succeeded',
357
+ lockedBy: null,
358
+ lockedUntil: null,
359
+ completedAt: input.now,
360
+ });
361
+ return updated === 1;
362
+ }
363
+ async completeJobFailure(input) {
364
+ const em = this.mikro.em.fork();
365
+ const repo = em.getRepository(BackgroundJobEntitySchema);
366
+ const updated = await repo.nativeUpdate({
367
+ id: input.id,
368
+ lockedBy: input.instanceId,
369
+ status: 'running',
370
+ lockedUntil: { $gt: input.now },
371
+ }, {
372
+ status: input.retryAt ? 'pending' : 'failed',
373
+ availableAt: input.retryAt ?? input.now,
374
+ lockedBy: null,
375
+ lockedUntil: null,
376
+ attemptCount: input.attemptCount,
377
+ lastError: input.error,
378
+ completedAt: input.retryAt ? null : input.now,
379
+ });
380
+ return updated === 1;
381
+ }
382
+ async cleanupCompletedJobs(before) {
383
+ const em = this.mikro.em.fork();
384
+ const repo = em.getRepository(BackgroundJobEntitySchema);
385
+ return repo.nativeDelete({
386
+ status: { $in: ['succeeded', 'failed'] },
387
+ completedAt: { $lte: before },
388
+ });
389
+ }
390
+ }
391
+ function createDatabaseSchedulerConfig(options, mikro) {
392
+ return {
393
+ cleanupCron: options.cleanupCron,
394
+ async start({ scheduledJobs, backgroundJobs, logger }) {
395
+ const scheduledRunner = new DistributedSchedulerRunner({
396
+ name: 'Database',
397
+ pollIntervalMs: options.pollIntervalMs,
398
+ lockTtlMs: options.lockTtlMs,
399
+ instanceId: options.instanceId,
400
+ jobs: scheduledJobs,
401
+ logger,
402
+ store: new DatabaseSchedulerStore(mikro),
403
+ });
404
+ const backgroundRunner = new DistributedBackgroundJobRunner({
405
+ name: 'Database',
406
+ pollIntervalMs: options.pollIntervalMs,
407
+ lockTtlMs: options.lockTtlMs,
408
+ retryDelayMs: options.backgroundRetryDelayMs,
409
+ maxAttempts: options.backgroundMaxAttempts,
410
+ retentionMs: options.backgroundRetentionMs,
411
+ instanceId: options.instanceId,
412
+ jobs: backgroundJobs,
413
+ logger,
414
+ store: new DatabaseBackgroundJobStore(mikro),
415
+ });
416
+ const scheduledHandle = await scheduledRunner.start();
417
+ const backgroundHandle = backgroundRunner.start();
418
+ return {
419
+ stop: async () => {
420
+ await backgroundHandle.stop();
421
+ await scheduledHandle.stop();
422
+ },
423
+ getNextRunAt: () => scheduledHandle.getNextRunAt?.() ?? null,
424
+ enqueue: async (enqueueOptions) => {
425
+ if (!backgroundHandle.enqueue) {
426
+ throw new Error('Background jobs require a durable scheduler backend');
427
+ }
428
+ return backgroundHandle.enqueue(enqueueOptions);
429
+ },
430
+ };
431
+ },
432
+ };
433
+ }
434
+ function hasBoundMikro(options) {
435
+ return 'mikro' in options;
436
+ }
437
+ export function database(options = {}) {
438
+ const resolved = resolveOptions(options);
439
+ if (hasBoundMikro(options)) {
440
+ return createDatabaseSchedulerConfig(resolved, options.mikro);
441
+ }
442
+ return ({ mikro }) => createDatabaseSchedulerConfig(resolved, mikro);
443
+ }
444
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/entrypoints/scheduler/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import type { BackgroundJobConfig, EnqueueBackgroundJobOptions, JobPayload, ScheduledJobConfig, SchedulerHandle } from '../../lib/config/index.ts';
2
+ import type { Logger } from '../../lib/logger.ts';
3
+ export interface PersistedSchedulerJobDefinition {
4
+ id: string;
5
+ name: string;
6
+ cron: string;
7
+ }
8
+ export interface AcquiredSchedulerJob {
9
+ id: string;
10
+ cron: string;
11
+ runCount: number;
12
+ failureCount: number;
13
+ }
14
+ export interface AcquiredBackgroundJob {
15
+ id: string;
16
+ jobId: string;
17
+ payload: JobPayload;
18
+ attemptCount: number;
19
+ maxAttempts: number;
20
+ }
21
+ export interface SchedulerCompletionInput {
22
+ jobId: string;
23
+ cron: string;
24
+ instanceId: string;
25
+ nextRunAt: Date;
26
+ now: Date;
27
+ runCount: number;
28
+ }
29
+ export interface SchedulerFailureCompletionInput extends SchedulerCompletionInput {
30
+ failureCount: number;
31
+ error: string;
32
+ }
33
+ export interface BackgroundJobEnqueueInput {
34
+ jobId: string;
35
+ payload: JobPayload;
36
+ availableAt: Date;
37
+ maxAttempts: number;
38
+ now: Date;
39
+ }
40
+ export interface BackgroundJobCompletionInput {
41
+ id: string;
42
+ instanceId: string;
43
+ now: Date;
44
+ }
45
+ export interface BackgroundJobFailureCompletionInput extends BackgroundJobCompletionInput {
46
+ error: string;
47
+ retryAt: Date | null;
48
+ attemptCount: number;
49
+ }
50
+ export interface DistributedSchedulerStore {
51
+ reconcileJobs: (jobs: readonly PersistedSchedulerJobDefinition[], now: Date) => Promise<void>;
52
+ acquireDueJob: (now: Date, lockedUntil: Date, instanceId: string) => Promise<AcquiredSchedulerJob | null>;
53
+ renewLease: (jobId: string, instanceId: string, lockedUntil: Date, now: Date) => Promise<boolean>;
54
+ completeJobSuccess: (input: SchedulerCompletionInput) => Promise<boolean>;
55
+ completeJobFailure: (input: SchedulerFailureCompletionInput) => Promise<boolean>;
56
+ findNextRunAt: () => Promise<Date | null>;
57
+ }
58
+ export interface DistributedBackgroundJobStore {
59
+ enqueue: (input: BackgroundJobEnqueueInput) => Promise<string>;
60
+ acquireDueJob: (now: Date, lockedUntil: Date, instanceId: string) => Promise<AcquiredBackgroundJob | null>;
61
+ renewLease: (id: string, instanceId: string, lockedUntil: Date, now: Date) => Promise<boolean>;
62
+ completeJobSuccess: (input: BackgroundJobCompletionInput) => Promise<boolean>;
63
+ completeJobFailure: (input: BackgroundJobFailureCompletionInput) => Promise<boolean>;
64
+ cleanupCompletedJobs?: (before: Date) => Promise<number>;
65
+ }
66
+ interface DistributedSchedulerRunnerOptions {
67
+ name: string;
68
+ pollIntervalMs: number;
69
+ lockTtlMs: number;
70
+ instanceId: string;
71
+ jobs: readonly ScheduledJobConfig[];
72
+ logger?: Logger | undefined;
73
+ store: DistributedSchedulerStore;
74
+ }
75
+ interface DistributedBackgroundJobRunnerOptions {
76
+ name: string;
77
+ pollIntervalMs: number;
78
+ lockTtlMs: number;
79
+ retryDelayMs: number;
80
+ maxAttempts: number;
81
+ retentionMs: number;
82
+ instanceId: string;
83
+ jobs: readonly BackgroundJobConfig[];
84
+ logger?: Logger | undefined;
85
+ store: DistributedBackgroundJobStore;
86
+ }
87
+ export declare class DistributedSchedulerRunner {
88
+ private readonly name;
89
+ private readonly pollIntervalMs;
90
+ private readonly lockTtlMs;
91
+ private readonly instanceId;
92
+ private readonly jobs;
93
+ private readonly logger;
94
+ private readonly store;
95
+ private interval;
96
+ private runningTick;
97
+ private nextRunAt;
98
+ private stopped;
99
+ constructor(options: DistributedSchedulerRunnerOptions);
100
+ start(): Promise<SchedulerHandle>;
101
+ private queueTick;
102
+ private reconcileJobs;
103
+ private runTick;
104
+ private startLeaseRenewal;
105
+ private completeJob;
106
+ }
107
+ export declare class DistributedBackgroundJobRunner {
108
+ private readonly name;
109
+ private readonly pollIntervalMs;
110
+ private readonly lockTtlMs;
111
+ private readonly retryDelayMs;
112
+ private readonly maxAttempts;
113
+ private readonly retentionMs;
114
+ private readonly cleanupIntervalMs;
115
+ private readonly instanceId;
116
+ private readonly jobs;
117
+ private readonly logger;
118
+ private readonly store;
119
+ private interval;
120
+ private runningTick;
121
+ private nextCleanupAt;
122
+ private stopped;
123
+ constructor(options: DistributedBackgroundJobRunnerOptions);
124
+ start(): SchedulerHandle;
125
+ enqueue<TPayload extends JobPayload>(options: EnqueueBackgroundJobOptions<TPayload>): Promise<string>;
126
+ private queueTick;
127
+ private runTick;
128
+ private cleanupCompletedJobs;
129
+ private startLeaseRenewal;
130
+ private completeJob;
131
+ }
132
+ export declare function getDistributedSchedulerNextRunAt(cron: string, from: Date): Date;
133
+ export {};
134
+ //# sourceMappingURL=distributed-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distributed-runner.d.ts","sourceRoot":"","sources":["../../../src/entrypoints/scheduler/distributed-runner.ts"],"names":[],"mappings":"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"}