mongo-job-scheduler 0.1.1 → 0.1.2

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.
@@ -1,8 +1,11 @@
1
- import { SchedulerEmitter } from "../events";
2
- import { Worker } from "../worker";
3
- export class Scheduler {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Scheduler = void 0;
4
+ const events_1 = require("../events");
5
+ const worker_1 = require("../worker");
6
+ class Scheduler {
4
7
  constructor(options = {}) {
5
- this.emitter = new SchedulerEmitter();
8
+ this.emitter = new events_1.SchedulerEmitter();
6
9
  this.workers = [];
7
10
  this.started = false;
8
11
  this.id = options.id ?? `scheduler-${Math.random().toString(36).slice(2)}`;
@@ -68,7 +71,7 @@ export class Scheduler {
68
71
  // start workers
69
72
  // -------------------------------
70
73
  for (let i = 0; i < this.workerCount; i++) {
71
- const worker = new Worker(this.store, this.emitter, this.handler, {
74
+ const worker = new worker_1.Worker(this.store, this.emitter, this.handler, {
72
75
  pollIntervalMs: this.pollInterval,
73
76
  lockTimeoutMs: this.lockTimeout,
74
77
  workerId: `${this.id}-w${i}`,
@@ -95,3 +98,4 @@ export class Scheduler {
95
98
  return this.id;
96
99
  }
97
100
  }
101
+ exports.Scheduler = Scheduler;
@@ -1,5 +1,8 @@
1
- import { TypedEventEmitter } from "./typed-emitter";
2
- export class SchedulerEmitter extends TypedEventEmitter {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SchedulerEmitter = void 0;
4
+ const typed_emitter_1 = require("./typed-emitter");
5
+ class SchedulerEmitter extends typed_emitter_1.TypedEventEmitter {
3
6
  emitSafe(event, payload) {
4
7
  try {
5
8
  this.emitUnsafe(event, payload);
@@ -15,3 +18,4 @@ export class SchedulerEmitter extends TypedEventEmitter {
15
18
  }
16
19
  }
17
20
  }
21
+ exports.SchedulerEmitter = SchedulerEmitter;
@@ -1,2 +1,18 @@
1
- export * from "./emitter";
2
- export * from "./typed-emitter";
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./emitter"), exports);
18
+ __exportStar(require("./typed-emitter"), exports);
@@ -1,7 +1,10 @@
1
- import { EventEmitter } from "events";
2
- export class TypedEventEmitter {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypedEventEmitter = void 0;
4
+ const events_1 = require("events");
5
+ class TypedEventEmitter {
3
6
  constructor() {
4
- this.emitter = new EventEmitter();
7
+ this.emitter = new events_1.EventEmitter();
5
8
  }
6
9
  on(event, listener) {
7
10
  this.emitter.on(event, listener);
@@ -19,3 +22,4 @@ export class TypedEventEmitter {
19
22
  this.emitter.emit(event, payload);
20
23
  }
21
24
  }
25
+ exports.TypedEventEmitter = TypedEventEmitter;
package/dist/index.js CHANGED
@@ -1,6 +1,26 @@
1
- export { Scheduler } from "./core/scheduler";
2
- export { MongoJobStore } from "./store/mongo/mongo-job-store";
3
- export { InMemoryJobStore } from "./store/in-memory-job-store";
4
- export * from "./types/job";
5
- export * from "./types/retry";
6
- export * from "./types/repeat";
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.InMemoryJobStore = exports.MongoJobStore = exports.Scheduler = void 0;
18
+ var scheduler_1 = require("./core/scheduler");
19
+ Object.defineProperty(exports, "Scheduler", { enumerable: true, get: function () { return scheduler_1.Scheduler; } });
20
+ var mongo_job_store_1 = require("./store/mongo/mongo-job-store");
21
+ Object.defineProperty(exports, "MongoJobStore", { enumerable: true, get: function () { return mongo_job_store_1.MongoJobStore; } });
22
+ var in_memory_job_store_1 = require("./store/in-memory-job-store");
23
+ Object.defineProperty(exports, "InMemoryJobStore", { enumerable: true, get: function () { return in_memory_job_store_1.InMemoryJobStore; } });
24
+ __exportStar(require("./types/job"), exports);
25
+ __exportStar(require("./types/retry"), exports);
26
+ __exportStar(require("./types/repeat"), exports);
@@ -1,9 +1,12 @@
1
- import { JobNotFoundError } from "./store-errors";
2
- import { Mutex } from "./mutex";
3
- export class InMemoryJobStore {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryJobStore = void 0;
4
+ const store_errors_1 = require("./store-errors");
5
+ const mutex_1 = require("./mutex");
6
+ class InMemoryJobStore {
4
7
  constructor() {
5
8
  this.jobs = new Map();
6
- this.mutex = new Mutex();
9
+ this.mutex = new mutex_1.Mutex();
7
10
  }
8
11
  generateId() {
9
12
  return Math.random().toString(36).slice(2);
@@ -48,7 +51,7 @@ export class InMemoryJobStore {
48
51
  async markCompleted(jobId) {
49
52
  const job = this.jobs.get(String(jobId));
50
53
  if (!job)
51
- throw new JobNotFoundError();
54
+ throw new store_errors_1.JobNotFoundError();
52
55
  job.status = "completed";
53
56
  job.lastRunAt = new Date();
54
57
  job.updatedAt = new Date();
@@ -56,7 +59,7 @@ export class InMemoryJobStore {
56
59
  async markFailed(jobId, error) {
57
60
  const job = this.jobs.get(String(jobId));
58
61
  if (!job)
59
- throw new JobNotFoundError();
62
+ throw new store_errors_1.JobNotFoundError();
60
63
  job.status = "failed";
61
64
  job.lastError = error;
62
65
  job.updatedAt = new Date();
@@ -64,7 +67,7 @@ export class InMemoryJobStore {
64
67
  async reschedule(jobId, nextRunAt, updates) {
65
68
  const job = this.jobs.get(String(jobId));
66
69
  if (!job)
67
- throw new JobNotFoundError();
70
+ throw new store_errors_1.JobNotFoundError();
68
71
  job.status = "pending";
69
72
  job.nextRunAt = nextRunAt;
70
73
  if (updates?.attempts != null) {
@@ -96,8 +99,9 @@ export class InMemoryJobStore {
96
99
  async cancel(jobId) {
97
100
  const job = this.jobs.get(String(jobId));
98
101
  if (!job)
99
- throw new JobNotFoundError();
102
+ throw new store_errors_1.JobNotFoundError();
100
103
  job.status = "cancelled";
101
104
  job.updatedAt = new Date();
102
105
  }
103
106
  }
107
+ exports.InMemoryJobStore = InMemoryJobStore;
@@ -1,3 +1,19 @@
1
- export * from "./job-store";
2
- export * from "./store-errors";
3
- export * from "./in-memory-job-store";
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./job-store"), exports);
18
+ __exportStar(require("./store-errors"), exports);
19
+ __exportStar(require("./in-memory-job-store"), exports);
@@ -1 +1,2 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,6 +1,9 @@
1
- import { MongoClient } from "mongodb";
2
- export async function connectMongo(options) {
3
- const client = new MongoClient(options.uri);
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.connectMongo = connectMongo;
4
+ const mongodb_1 = require("mongodb");
5
+ async function connectMongo(options) {
6
+ const client = new mongodb_1.MongoClient(options.uri);
4
7
  await client.connect();
5
8
  return client.db(options.dbName);
6
9
  }
@@ -1,2 +1,18 @@
1
- export * from "./mongo-job-store";
2
- export * from "./connect";
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mongo-job-store"), exports);
18
+ __exportStar(require("./connect"), exports);
@@ -1,4 +1,7 @@
1
- export class MongoJobStore {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MongoJobStore = void 0;
4
+ class MongoJobStore {
2
5
  constructor(db, options = {}) {
3
6
  this.collection = db.collection(options.collectionName ?? "scheduler_jobs");
4
7
  this.defaultLockTimeoutMs = options.lockTimeoutMs ?? 30000;
@@ -131,3 +134,4 @@ export class MongoJobStore {
131
134
  return result.modifiedCount;
132
135
  }
133
136
  }
137
+ exports.MongoJobStore = MongoJobStore;
@@ -1,4 +1,7 @@
1
- export class Mutex {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Mutex = void 0;
4
+ class Mutex {
2
5
  constructor() {
3
6
  this.locked = false;
4
7
  this.waiting = [];
@@ -22,3 +25,4 @@ export class Mutex {
22
25
  });
23
26
  }
24
27
  }
28
+ exports.Mutex = Mutex;
@@ -1,12 +1,17 @@
1
- export class JobNotFoundError extends Error {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JobLockError = exports.JobNotFoundError = void 0;
4
+ class JobNotFoundError extends Error {
2
5
  constructor(message = "Job not found") {
3
6
  super(message);
4
7
  this.name = "JobNotFoundError";
5
8
  }
6
9
  }
7
- export class JobLockError extends Error {
10
+ exports.JobNotFoundError = JobNotFoundError;
11
+ class JobLockError extends Error {
8
12
  constructor(message = "Failed to acquire job lock") {
9
13
  super(message);
10
14
  this.name = "JobLockError";
11
15
  }
12
16
  }
17
+ exports.JobLockError = JobLockError;
@@ -1 +1,2 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,6 +1,22 @@
1
- export * from "./job";
2
- export * from "./retry";
3
- export * from "./repeat";
4
- export * from "./lifecycle";
5
- export * from "./events";
6
- export * from "./schedule";
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./job"), exports);
18
+ __exportStar(require("./retry"), exports);
19
+ __exportStar(require("./repeat"), exports);
20
+ __exportStar(require("./lifecycle"), exports);
21
+ __exportStar(require("./events"), exports);
22
+ __exportStar(require("./schedule"), exports);
package/dist/types/job.js CHANGED
@@ -1 +1,2 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1 +1,2 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1 +1,2 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1 +1,2 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1 +1,2 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +1,18 @@
1
- export * from "./worker";
2
- export * from "./types";
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./worker"), exports);
18
+ __exportStar(require("./types"), exports);
@@ -1,10 +1,13 @@
1
- import { parseExpression } from "cron-parser";
2
- export function getNextRunAt(repeat, base, defaultTimezone) {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNextRunAt = getNextRunAt;
4
+ const cron_parser_1 = require("cron-parser");
5
+ function getNextRunAt(repeat, base, defaultTimezone) {
3
6
  if (repeat.every != null) {
4
7
  return new Date(base.getTime() + repeat.every);
5
8
  }
6
9
  if (repeat.cron) {
7
- const interval = parseExpression(repeat.cron, {
10
+ const interval = (0, cron_parser_1.parseExpression)(repeat.cron, {
8
11
  currentDate: base,
9
12
  tz: repeat.timezone ?? defaultTimezone ?? "UTC",
10
13
  });
@@ -1,4 +1,7 @@
1
- export function getRetryDelay(retry, attempt) {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRetryDelay = getRetryDelay;
4
+ function getRetryDelay(retry, attempt) {
2
5
  if (typeof retry.delay === "function") {
3
6
  return retry.delay(attempt);
4
7
  }
@@ -1 +1,2 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,6 +1,9 @@
1
- import { getRetryDelay } from "./retry";
2
- import { getNextRunAt } from "./repeat";
3
- export class Worker {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Worker = void 0;
4
+ const retry_1 = require("./retry");
5
+ const repeat_1 = require("./repeat");
6
+ class Worker {
4
7
  constructor(store, emitter, handler, options = {}) {
5
8
  this.store = store;
6
9
  this.emitter = emitter;
@@ -53,11 +56,11 @@ export class Worker {
53
56
  // ---------------------------
54
57
  if (job.repeat?.cron) {
55
58
  let base = job.lastScheduledAt ?? job.nextRunAt ?? new Date(now);
56
- let next = getNextRunAt(job.repeat, base, this.defaultTimezone);
59
+ let next = (0, repeat_1.getNextRunAt)(job.repeat, base, this.defaultTimezone);
57
60
  // skip missed cron slots
58
61
  while (next.getTime() <= now) {
59
62
  base = next;
60
- next = getNextRunAt(job.repeat, base, this.defaultTimezone);
63
+ next = (0, repeat_1.getNextRunAt)(job.repeat, base, this.defaultTimezone);
61
64
  }
62
65
  // persist schedule immediately
63
66
  job.lastScheduledAt = next;
@@ -83,7 +86,7 @@ export class Worker {
83
86
  const attempts = (job.attempts ?? 0) + 1;
84
87
  const retry = job.retry;
85
88
  if (retry && attempts < retry.maxAttempts) {
86
- const nextRunAt = new Date(Date.now() + getRetryDelay(retry, attempts));
89
+ const nextRunAt = new Date(Date.now() + (0, retry_1.getRetryDelay)(retry, attempts));
87
90
  await this.store.reschedule(job._id, nextRunAt, { attempts });
88
91
  this.emitter.emitSafe("job:retry", {
89
92
  ...job,
@@ -100,3 +103,4 @@ export class Worker {
100
103
  return new Promise((resolve) => setTimeout(resolve, ms));
101
104
  }
102
105
  }
106
+ exports.Worker = Worker;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mongo-job-scheduler",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Production-grade MongoDB-backed job scheduler with retries, cron, timezone support, and crash recovery",
5
5
  "license": "MIT",
6
6
  "author": "Darshan Bhut",