@redmix/jobs 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/adapters/BaseAdapter/BaseAdapter.d.ts +64 -0
- package/dist/adapters/BaseAdapter/BaseAdapter.d.ts.map +1 -0
- package/dist/adapters/BaseAdapter/BaseAdapter.js +36 -0
- package/dist/adapters/PrismaAdapter/PrismaAdapter.d.ts +68 -0
- package/dist/adapters/PrismaAdapter/PrismaAdapter.d.ts.map +1 -0
- package/dist/adapters/PrismaAdapter/PrismaAdapter.js +189 -0
- package/dist/adapters/PrismaAdapter/errors.d.ts +8 -0
- package/dist/adapters/PrismaAdapter/errors.d.ts.map +1 -0
- package/dist/adapters/PrismaAdapter/errors.js +33 -0
- package/dist/bins/rw-jobs-worker.d.ts +13 -0
- package/dist/bins/rw-jobs-worker.d.ts.map +1 -0
- package/dist/bins/rw-jobs-worker.js +126 -0
- package/dist/bins/rw-jobs.d.ts +20 -0
- package/dist/bins/rw-jobs.d.ts.map +1 -0
- package/dist/bins/rw-jobs.js +248 -0
- package/dist/consts.d.ts +26 -0
- package/dist/consts.d.ts.map +1 -0
- package/dist/consts.js +81 -0
- package/dist/core/Executor.d.ts +29 -0
- package/dist/core/Executor.d.ts.map +1 -0
- package/dist/core/Executor.js +95 -0
- package/dist/core/JobManager.d.ts +20 -0
- package/dist/core/JobManager.d.ts.map +1 -0
- package/dist/core/JobManager.js +78 -0
- package/dist/core/Scheduler.d.ts +27 -0
- package/dist/core/Scheduler.d.ts.map +1 -0
- package/dist/core/Scheduler.js +91 -0
- package/dist/core/Worker.d.ts +49 -0
- package/dist/core/Worker.d.ts.map +1 -0
- package/dist/core/Worker.js +143 -0
- package/dist/errors.d.ts +104 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +156 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/loaders.d.ts +13 -0
- package/dist/loaders.d.ts.map +1 -0
- package/dist/loaders.js +71 -0
- package/dist/setupEnv.d.ts +2 -0
- package/dist/setupEnv.d.ts.map +1 -0
- package/dist/setupEnv.js +34 -0
- package/dist/types.d.ts +175 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/util.d.ts +2 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +31 -0
- package/package.json +58 -0
@@ -0,0 +1,91 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
+
var __export = (target, all) => {
|
7
|
+
for (var name in all)
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
9
|
+
};
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
12
|
+
for (let key of __getOwnPropNames(from))
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
15
|
+
}
|
16
|
+
return to;
|
17
|
+
};
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
19
|
+
var Scheduler_exports = {};
|
20
|
+
__export(Scheduler_exports, {
|
21
|
+
Scheduler: () => Scheduler
|
22
|
+
});
|
23
|
+
module.exports = __toCommonJS(Scheduler_exports);
|
24
|
+
var import_consts = require("../consts.js");
|
25
|
+
var import_errors = require("../errors.js");
|
26
|
+
class Scheduler {
|
27
|
+
adapter;
|
28
|
+
logger;
|
29
|
+
constructor({ adapter, logger }) {
|
30
|
+
this.logger = logger ?? import_consts.DEFAULT_LOGGER;
|
31
|
+
this.adapter = adapter;
|
32
|
+
if (!this.adapter) {
|
33
|
+
throw new import_errors.AdapterNotConfiguredError();
|
34
|
+
}
|
35
|
+
}
|
36
|
+
computeRunAt({ wait, waitUntil }) {
|
37
|
+
if (wait && wait > 0) {
|
38
|
+
return new Date(Date.now() + wait * 1e3);
|
39
|
+
} else if (waitUntil) {
|
40
|
+
return waitUntil;
|
41
|
+
} else {
|
42
|
+
return /* @__PURE__ */ new Date();
|
43
|
+
}
|
44
|
+
}
|
45
|
+
buildPayload({
|
46
|
+
job,
|
47
|
+
args,
|
48
|
+
options
|
49
|
+
}) {
|
50
|
+
const queue = job.queue;
|
51
|
+
const priority = job.priority ?? import_consts.DEFAULT_PRIORITY;
|
52
|
+
const wait = options?.wait ?? import_consts.DEFAULT_WAIT;
|
53
|
+
const waitUntil = options?.waitUntil ?? import_consts.DEFAULT_WAIT_UNTIL;
|
54
|
+
if (!queue) {
|
55
|
+
throw new import_errors.QueueNotDefinedError();
|
56
|
+
}
|
57
|
+
return {
|
58
|
+
name: job.name,
|
59
|
+
path: job.path,
|
60
|
+
args: args ?? [],
|
61
|
+
runAt: this.computeRunAt({ wait, waitUntil }),
|
62
|
+
queue,
|
63
|
+
priority
|
64
|
+
};
|
65
|
+
}
|
66
|
+
async schedule({
|
67
|
+
job,
|
68
|
+
args,
|
69
|
+
options
|
70
|
+
}) {
|
71
|
+
const payload = this.buildPayload({
|
72
|
+
job,
|
73
|
+
args,
|
74
|
+
options
|
75
|
+
});
|
76
|
+
this.logger.info(payload, `[RedwoodJob] Scheduling ${job.name}`);
|
77
|
+
try {
|
78
|
+
await this.adapter.schedule(payload);
|
79
|
+
return true;
|
80
|
+
} catch (e) {
|
81
|
+
throw new import_errors.SchedulingError(
|
82
|
+
`[RedwoodJob] Exception when scheduling ${payload.name}`,
|
83
|
+
e
|
84
|
+
);
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
// Annotate the CommonJS export names for ESM import in node:
|
89
|
+
0 && (module.exports = {
|
90
|
+
Scheduler
|
91
|
+
});
|
@@ -0,0 +1,49 @@
|
|
1
|
+
import type { BaseAdapter } from '../adapters/BaseAdapter/BaseAdapter.js';
|
2
|
+
import type { BasicLogger, WorkerSharedOptions } from '../types.js';
|
3
|
+
export interface WorkerOptions extends WorkerSharedOptions {
|
4
|
+
adapter: BaseAdapter;
|
5
|
+
/** Used to set the `lockedBy` field in the database */
|
6
|
+
processName: string;
|
7
|
+
/** If not given a queue name then will work on jobs in any queue */
|
8
|
+
queues: string[];
|
9
|
+
logger?: BasicLogger;
|
10
|
+
/** If true, will clear the queue of all jobs and then exit */
|
11
|
+
clear?: boolean;
|
12
|
+
/**
|
13
|
+
* Set to `false` and the work loop will quit when the current job is done
|
14
|
+
* running (regardless of how many outstanding jobs there are to be worked
|
15
|
+
* on). The worker process will set this to `false` as soon as the user hits
|
16
|
+
* ctrl-c so any current job will complete before exiting.
|
17
|
+
*/
|
18
|
+
workoff?: boolean;
|
19
|
+
/**
|
20
|
+
* If set to `true` will run the worker forever looking for new jobs. Otherwise
|
21
|
+
* will only look for jobs one time and then exit.
|
22
|
+
*
|
23
|
+
* Useful for testing to avoid infinite loops!
|
24
|
+
*/
|
25
|
+
forever?: boolean;
|
26
|
+
}
|
27
|
+
type CompleteOptions = Required<WorkerOptions>;
|
28
|
+
export declare class Worker {
|
29
|
+
#private;
|
30
|
+
options: CompleteOptions;
|
31
|
+
adapter: CompleteOptions['adapter'];
|
32
|
+
logger: CompleteOptions['logger'];
|
33
|
+
clear: CompleteOptions['clear'];
|
34
|
+
processName: CompleteOptions['processName'];
|
35
|
+
queues: CompleteOptions['queues'];
|
36
|
+
maxAttempts: CompleteOptions['maxAttempts'];
|
37
|
+
maxRuntime: CompleteOptions['maxRuntime'];
|
38
|
+
deleteSuccessfulJobs: CompleteOptions['deleteSuccessfulJobs'];
|
39
|
+
deleteFailedJobs: CompleteOptions['deleteFailedJobs'];
|
40
|
+
sleepDelay: CompleteOptions['sleepDelay'];
|
41
|
+
forever: CompleteOptions['forever'];
|
42
|
+
workoff: CompleteOptions['workoff'];
|
43
|
+
lastCheckTime: Date;
|
44
|
+
constructor(options: WorkerOptions);
|
45
|
+
run(): Promise<void>;
|
46
|
+
get queueNames(): string;
|
47
|
+
}
|
48
|
+
export {};
|
49
|
+
//# sourceMappingURL=Worker.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../../src/core/Worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAA;AAUzE,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAInE,MAAM,WAAW,aAAc,SAAQ,mBAAmB;IAGxD,OAAO,EAAE,WAAW,CAAA;IACpB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAA;IACnB,oEAAoE;IACpE,MAAM,EAAE,MAAM,EAAE,CAAA;IAIhB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,KAAK,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA;AAc9C,qBAAa,MAAM;;IACjB,OAAO,EAAE,eAAe,CAAA;IACxB,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACnC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;IAC/B,WAAW,EAAE,eAAe,CAAC,aAAa,CAAC,CAAA;IAC3C,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IACjC,WAAW,EAAE,eAAe,CAAC,aAAa,CAAC,CAAA;IAC3C,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,oBAAoB,EAAE,eAAe,CAAC,sBAAsB,CAAC,CAAA;IAC7D,gBAAgB,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAA;IACrD,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACnC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACnC,aAAa,EAAE,IAAI,CAAA;gBAEP,OAAO,EAAE,aAAa;IAwElC,GAAG;IAQH,IAAI,UAAU,WAMb;CAmDF"}
|
@@ -0,0 +1,143 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
+
var __export = (target, all) => {
|
7
|
+
for (var name in all)
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
9
|
+
};
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
12
|
+
for (let key of __getOwnPropNames(from))
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
15
|
+
}
|
16
|
+
return to;
|
17
|
+
};
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
19
|
+
var Worker_exports = {};
|
20
|
+
__export(Worker_exports, {
|
21
|
+
Worker: () => Worker
|
22
|
+
});
|
23
|
+
module.exports = __toCommonJS(Worker_exports);
|
24
|
+
var import_node_timers = require("node:timers");
|
25
|
+
var import_consts = require("../consts.js");
|
26
|
+
var import_errors = require("../errors.js");
|
27
|
+
var import_Executor = require("./Executor.js");
|
28
|
+
const DEFAULT_OPTIONS = {
|
29
|
+
logger: import_consts.DEFAULT_LOGGER,
|
30
|
+
clear: false,
|
31
|
+
maxAttempts: import_consts.DEFAULT_MAX_ATTEMPTS,
|
32
|
+
maxRuntime: import_consts.DEFAULT_MAX_RUNTIME,
|
33
|
+
deleteSuccessfulJobs: import_consts.DEFAULT_DELETE_SUCCESSFUL_JOBS,
|
34
|
+
deleteFailedJobs: import_consts.DEFAULT_DELETE_FAILED_JOBS,
|
35
|
+
sleepDelay: import_consts.DEFAULT_SLEEP_DELAY,
|
36
|
+
workoff: false,
|
37
|
+
forever: true
|
38
|
+
};
|
39
|
+
class Worker {
|
40
|
+
options;
|
41
|
+
adapter;
|
42
|
+
logger;
|
43
|
+
clear;
|
44
|
+
processName;
|
45
|
+
queues;
|
46
|
+
maxAttempts;
|
47
|
+
maxRuntime;
|
48
|
+
deleteSuccessfulJobs;
|
49
|
+
deleteFailedJobs;
|
50
|
+
sleepDelay;
|
51
|
+
forever;
|
52
|
+
workoff;
|
53
|
+
lastCheckTime;
|
54
|
+
constructor(options) {
|
55
|
+
const nonUndefinedOptions = Object.fromEntries(
|
56
|
+
Object.entries(options ?? {}).filter(([_, value]) => value !== void 0)
|
57
|
+
);
|
58
|
+
this.options = {
|
59
|
+
...DEFAULT_OPTIONS,
|
60
|
+
...nonUndefinedOptions,
|
61
|
+
adapter: options?.adapter,
|
62
|
+
processName: options?.processName,
|
63
|
+
queues: options?.queues
|
64
|
+
};
|
65
|
+
if (!options?.adapter) {
|
66
|
+
throw new import_errors.AdapterRequiredError();
|
67
|
+
}
|
68
|
+
if (!options?.queues || options.queues.length === 0) {
|
69
|
+
throw new import_errors.QueuesRequiredError();
|
70
|
+
}
|
71
|
+
this.adapter = this.options.adapter;
|
72
|
+
this.logger = this.options.logger;
|
73
|
+
this.clear = this.options.clear;
|
74
|
+
this.processName = this.options.processName;
|
75
|
+
this.queues = this.options.queues;
|
76
|
+
this.maxAttempts = this.options.maxAttempts;
|
77
|
+
this.maxRuntime = this.options.maxRuntime;
|
78
|
+
this.deleteSuccessfulJobs = this.options.deleteSuccessfulJobs;
|
79
|
+
this.deleteFailedJobs = this.options.deleteFailedJobs;
|
80
|
+
this.sleepDelay = (this.options.sleepDelay ?? DEFAULT_OPTIONS.sleepDelay) * 1e3;
|
81
|
+
this.forever = this.options.forever;
|
82
|
+
this.workoff = this.options.workoff;
|
83
|
+
this.lastCheckTime = /* @__PURE__ */ new Date();
|
84
|
+
}
|
85
|
+
// Workers run forever unless:
|
86
|
+
// `this.forever` to false (loop only runs once, then exits)
|
87
|
+
// `this.workoff` is true (run all jobs in the queue, then exits)
|
88
|
+
run() {
|
89
|
+
if (this.clear) {
|
90
|
+
return this.#clearQueue();
|
91
|
+
} else {
|
92
|
+
return this.#work();
|
93
|
+
}
|
94
|
+
}
|
95
|
+
get queueNames() {
|
96
|
+
if (this.queues.length === 1 && this.queues[0] === "*") {
|
97
|
+
return "all (*)";
|
98
|
+
} else {
|
99
|
+
return this.queues.join(", ");
|
100
|
+
}
|
101
|
+
}
|
102
|
+
async #clearQueue() {
|
103
|
+
return await this.adapter.clear();
|
104
|
+
}
|
105
|
+
async #work() {
|
106
|
+
do {
|
107
|
+
this.lastCheckTime = /* @__PURE__ */ new Date();
|
108
|
+
this.logger.debug(
|
109
|
+
`[${this.processName}] Checking for jobs in ${this.queueNames} queues...`
|
110
|
+
);
|
111
|
+
const job = await this.adapter.find({
|
112
|
+
processName: this.processName,
|
113
|
+
maxRuntime: this.maxRuntime,
|
114
|
+
queues: this.queues
|
115
|
+
});
|
116
|
+
if (job) {
|
117
|
+
await new import_Executor.Executor({
|
118
|
+
adapter: this.adapter,
|
119
|
+
logger: this.logger,
|
120
|
+
job,
|
121
|
+
maxAttempts: this.maxAttempts,
|
122
|
+
deleteSuccessfulJobs: this.deleteSuccessfulJobs,
|
123
|
+
deleteFailedJobs: this.deleteFailedJobs
|
124
|
+
}).perform();
|
125
|
+
} else if (this.workoff) {
|
126
|
+
break;
|
127
|
+
}
|
128
|
+
if (!job && this.forever) {
|
129
|
+
const millsSinceLastCheck = (/* @__PURE__ */ new Date()).getTime() - this.lastCheckTime.getTime();
|
130
|
+
if (millsSinceLastCheck < this.sleepDelay) {
|
131
|
+
await this.#wait(this.sleepDelay - millsSinceLastCheck);
|
132
|
+
}
|
133
|
+
}
|
134
|
+
} while (this.forever);
|
135
|
+
}
|
136
|
+
#wait(ms) {
|
137
|
+
return new Promise((resolve) => (0, import_node_timers.setTimeout)(resolve, ms));
|
138
|
+
}
|
139
|
+
}
|
140
|
+
// Annotate the CommonJS export names for ESM import in node:
|
141
|
+
0 && (module.exports = {
|
142
|
+
Worker
|
143
|
+
});
|
package/dist/errors.d.ts
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
/**
|
2
|
+
* Parent class for any RedwoodJob-related error
|
3
|
+
*/
|
4
|
+
export declare class RedwoodJobError extends Error {
|
5
|
+
constructor(message: string);
|
6
|
+
}
|
7
|
+
/**
|
8
|
+
* Thrown when trying to configure a scheduler without an adapter
|
9
|
+
*/
|
10
|
+
export declare class AdapterNotConfiguredError extends RedwoodJobError {
|
11
|
+
constructor();
|
12
|
+
}
|
13
|
+
/**
|
14
|
+
* Thrown when the Worker or Executor is instantiated without an adapter
|
15
|
+
*/
|
16
|
+
export declare class AdapterRequiredError extends RedwoodJobError {
|
17
|
+
constructor();
|
18
|
+
}
|
19
|
+
/**
|
20
|
+
* Thrown when the Worker is instantiated without an array of queues
|
21
|
+
*/
|
22
|
+
export declare class QueuesRequiredError extends RedwoodJobError {
|
23
|
+
constructor();
|
24
|
+
}
|
25
|
+
/**
|
26
|
+
* Thrown when the Executor is instantiated without a job
|
27
|
+
*/
|
28
|
+
export declare class JobRequiredError extends RedwoodJobError {
|
29
|
+
constructor();
|
30
|
+
}
|
31
|
+
/**
|
32
|
+
* Thrown when a job with the given handler is not found in the filesystem
|
33
|
+
*/
|
34
|
+
export declare class JobNotFoundError extends RedwoodJobError {
|
35
|
+
constructor(name: string);
|
36
|
+
}
|
37
|
+
/**
|
38
|
+
* Thrown when a job file exists, but the export does not match the filename
|
39
|
+
*/
|
40
|
+
export declare class JobExportNotFoundError extends RedwoodJobError {
|
41
|
+
constructor(name: string);
|
42
|
+
}
|
43
|
+
/**
|
44
|
+
* Thrown when the runner tries to import `adapter` from api/src/lib/jobs.js|ts and
|
45
|
+
* the file does not exist
|
46
|
+
*/
|
47
|
+
export declare class JobsLibNotFoundError extends RedwoodJobError {
|
48
|
+
constructor();
|
49
|
+
}
|
50
|
+
/**
|
51
|
+
* Thrown when the runner tries to import `adapter` from api/src/lib/jobs.js|ts
|
52
|
+
*/
|
53
|
+
export declare class AdapterNotFoundError extends RedwoodJobError {
|
54
|
+
constructor(name: string);
|
55
|
+
}
|
56
|
+
/**
|
57
|
+
* Thrown when the runner tries to import `logger` from api/src/lib/jobs.js|ts
|
58
|
+
*/
|
59
|
+
export declare class LoggerNotFoundError extends RedwoodJobError {
|
60
|
+
constructor(name: string);
|
61
|
+
}
|
62
|
+
/**
|
63
|
+
* Thrown when the runner tries to import `workerConfig` from api/src/lib/jobs.js|ts
|
64
|
+
*/
|
65
|
+
export declare class WorkerConfigNotFoundError extends RedwoodJobError {
|
66
|
+
constructor(name: string);
|
67
|
+
}
|
68
|
+
/**
|
69
|
+
* Parent class for any job error where we want to wrap the underlying error
|
70
|
+
* in our own. Use by extending this class and passing the original error to
|
71
|
+
* the constructor:
|
72
|
+
*
|
73
|
+
* ```typescript
|
74
|
+
* try {
|
75
|
+
* throw new Error('Generic error')
|
76
|
+
* } catch (e) {
|
77
|
+
* throw new RethrowJobError('Custom Error Message', e)
|
78
|
+
* }
|
79
|
+
* ```
|
80
|
+
*/
|
81
|
+
export declare class RethrownJobError extends RedwoodJobError {
|
82
|
+
originalError: Error;
|
83
|
+
stackBeforeRethrow: string | undefined;
|
84
|
+
constructor(message: string, error: Error);
|
85
|
+
}
|
86
|
+
/**
|
87
|
+
* Thrown when there is an error scheduling a job, wraps the underlying error
|
88
|
+
*/
|
89
|
+
export declare class SchedulingError extends RethrownJobError {
|
90
|
+
constructor(message: string, error: Error);
|
91
|
+
}
|
92
|
+
/**
|
93
|
+
* Thrown when there is an error performing a job, wraps the underlying error
|
94
|
+
*/
|
95
|
+
export declare class PerformError extends RethrownJobError {
|
96
|
+
constructor(message: string, error: Error);
|
97
|
+
}
|
98
|
+
export declare class QueueNotDefinedError extends RedwoodJobError {
|
99
|
+
constructor();
|
100
|
+
}
|
101
|
+
export declare class WorkerConfigIndexNotFoundError extends RedwoodJobError {
|
102
|
+
constructor(index: number);
|
103
|
+
}
|
104
|
+
//# sourceMappingURL=errors.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,eAAe;;CAI7D;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,eAAe;;CAIxD;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;;CAIvD;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;;CAIpD;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;gBACvC,IAAI,EAAE,MAAM;CAGzB;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,eAAe;gBAC7C,IAAI,EAAE,MAAM;CAGzB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,eAAe;;CAMxD;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,eAAe;gBAC3C,IAAI,EAAE,MAAM;CAKzB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;gBAC1C,IAAI,EAAE,MAAM;CAKzB;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,eAAe;gBAChD,IAAI,EAAE,MAAM;CAGzB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;IACnD,aAAa,EAAE,KAAK,CAAA;IACpB,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAA;gBAE1B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAqB1C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,gBAAgB;gBACvC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAG1C;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,gBAAgB;gBACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAG1C;AAED,qBAAa,oBAAqB,SAAQ,eAAe;;CAIxD;AAED,qBAAa,8BAA+B,SAAQ,eAAe;gBACrD,KAAK,EAAE,MAAM;CAG1B"}
|
package/dist/errors.js
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
+
var __export = (target, all) => {
|
7
|
+
for (var name in all)
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
9
|
+
};
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
12
|
+
for (let key of __getOwnPropNames(from))
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
15
|
+
}
|
16
|
+
return to;
|
17
|
+
};
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
19
|
+
var errors_exports = {};
|
20
|
+
__export(errors_exports, {
|
21
|
+
AdapterNotConfiguredError: () => AdapterNotConfiguredError,
|
22
|
+
AdapterNotFoundError: () => AdapterNotFoundError,
|
23
|
+
AdapterRequiredError: () => AdapterRequiredError,
|
24
|
+
JobExportNotFoundError: () => JobExportNotFoundError,
|
25
|
+
JobNotFoundError: () => JobNotFoundError,
|
26
|
+
JobRequiredError: () => JobRequiredError,
|
27
|
+
JobsLibNotFoundError: () => JobsLibNotFoundError,
|
28
|
+
LoggerNotFoundError: () => LoggerNotFoundError,
|
29
|
+
PerformError: () => PerformError,
|
30
|
+
QueueNotDefinedError: () => QueueNotDefinedError,
|
31
|
+
QueuesRequiredError: () => QueuesRequiredError,
|
32
|
+
RedwoodJobError: () => RedwoodJobError,
|
33
|
+
RethrownJobError: () => RethrownJobError,
|
34
|
+
SchedulingError: () => SchedulingError,
|
35
|
+
WorkerConfigIndexNotFoundError: () => WorkerConfigIndexNotFoundError,
|
36
|
+
WorkerConfigNotFoundError: () => WorkerConfigNotFoundError
|
37
|
+
});
|
38
|
+
module.exports = __toCommonJS(errors_exports);
|
39
|
+
const JOBS_CONFIG_FILENAME = "jobs.{ts,js}";
|
40
|
+
class RedwoodJobError extends Error {
|
41
|
+
constructor(message) {
|
42
|
+
super(message);
|
43
|
+
this.name = this.constructor.name;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
class AdapterNotConfiguredError extends RedwoodJobError {
|
47
|
+
constructor() {
|
48
|
+
super("No adapter configured for the job scheduler");
|
49
|
+
}
|
50
|
+
}
|
51
|
+
class AdapterRequiredError extends RedwoodJobError {
|
52
|
+
constructor() {
|
53
|
+
super("`adapter` is required to perform a job");
|
54
|
+
}
|
55
|
+
}
|
56
|
+
class QueuesRequiredError extends RedwoodJobError {
|
57
|
+
constructor() {
|
58
|
+
super("`queues` is required to find a job to run");
|
59
|
+
}
|
60
|
+
}
|
61
|
+
class JobRequiredError extends RedwoodJobError {
|
62
|
+
constructor() {
|
63
|
+
super("`job` is required to perform a job");
|
64
|
+
}
|
65
|
+
}
|
66
|
+
class JobNotFoundError extends RedwoodJobError {
|
67
|
+
constructor(name) {
|
68
|
+
super(`Job \`${name}\` not found in the filesystem`);
|
69
|
+
}
|
70
|
+
}
|
71
|
+
class JobExportNotFoundError extends RedwoodJobError {
|
72
|
+
constructor(name) {
|
73
|
+
super(`Job file \`${name}\` does not export a class with the same name`);
|
74
|
+
}
|
75
|
+
}
|
76
|
+
class JobsLibNotFoundError extends RedwoodJobError {
|
77
|
+
constructor() {
|
78
|
+
super(
|
79
|
+
`api/src/lib/${JOBS_CONFIG_FILENAME} not found. Run \`yarn rw setup jobs\` to create this file and configure background jobs. Already did that? You'll need to run \`yarn rw dev\` or \`yarn rw build\` before you can start the job workers!`
|
80
|
+
);
|
81
|
+
}
|
82
|
+
}
|
83
|
+
class AdapterNotFoundError extends RedwoodJobError {
|
84
|
+
constructor(name) {
|
85
|
+
super(
|
86
|
+
`api/src/lib/${JOBS_CONFIG_FILENAME} does not export an adapter named \`${name}\``
|
87
|
+
);
|
88
|
+
}
|
89
|
+
}
|
90
|
+
class LoggerNotFoundError extends RedwoodJobError {
|
91
|
+
constructor(name) {
|
92
|
+
super(
|
93
|
+
`api/src/lib/${JOBS_CONFIG_FILENAME} does not export a logger named \`${name}\``
|
94
|
+
);
|
95
|
+
}
|
96
|
+
}
|
97
|
+
class WorkerConfigNotFoundError extends RedwoodJobError {
|
98
|
+
constructor(name) {
|
99
|
+
super(`api/src/lib/#{JOBS_CONFIG_FILENAME} does not export \`${name}\``);
|
100
|
+
}
|
101
|
+
}
|
102
|
+
class RethrownJobError extends RedwoodJobError {
|
103
|
+
originalError;
|
104
|
+
stackBeforeRethrow;
|
105
|
+
constructor(message, error) {
|
106
|
+
super(message);
|
107
|
+
if (!error) {
|
108
|
+
throw new Error(
|
109
|
+
"RethrownJobError requires a message and existing error object"
|
110
|
+
);
|
111
|
+
}
|
112
|
+
this.originalError = error;
|
113
|
+
this.stackBeforeRethrow = this.stack;
|
114
|
+
const messageLines = (this.message.match(/\n/g) || []).length + 1;
|
115
|
+
this.stack = this.stack?.split("\n").slice(0, messageLines + 1).join("\n") + "\n" + error.stack;
|
116
|
+
}
|
117
|
+
}
|
118
|
+
class SchedulingError extends RethrownJobError {
|
119
|
+
constructor(message, error) {
|
120
|
+
super(message, error);
|
121
|
+
}
|
122
|
+
}
|
123
|
+
class PerformError extends RethrownJobError {
|
124
|
+
constructor(message, error) {
|
125
|
+
super(message, error);
|
126
|
+
}
|
127
|
+
}
|
128
|
+
class QueueNotDefinedError extends RedwoodJobError {
|
129
|
+
constructor() {
|
130
|
+
super("Scheduler requires a named `queue` to place jobs in");
|
131
|
+
}
|
132
|
+
}
|
133
|
+
class WorkerConfigIndexNotFoundError extends RedwoodJobError {
|
134
|
+
constructor(index) {
|
135
|
+
super(`Worker index ${index} not found in jobs config`);
|
136
|
+
}
|
137
|
+
}
|
138
|
+
// Annotate the CommonJS export names for ESM import in node:
|
139
|
+
0 && (module.exports = {
|
140
|
+
AdapterNotConfiguredError,
|
141
|
+
AdapterNotFoundError,
|
142
|
+
AdapterRequiredError,
|
143
|
+
JobExportNotFoundError,
|
144
|
+
JobNotFoundError,
|
145
|
+
JobRequiredError,
|
146
|
+
JobsLibNotFoundError,
|
147
|
+
LoggerNotFoundError,
|
148
|
+
PerformError,
|
149
|
+
QueueNotDefinedError,
|
150
|
+
QueuesRequiredError,
|
151
|
+
RedwoodJobError,
|
152
|
+
RethrownJobError,
|
153
|
+
SchedulingError,
|
154
|
+
WorkerConfigIndexNotFoundError,
|
155
|
+
WorkerConfigNotFoundError
|
156
|
+
});
|
package/dist/index.d.ts
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
export * from './errors.js';
|
2
|
+
export { JobManager } from './core/JobManager.js';
|
3
|
+
export { Executor } from './core/Executor.js';
|
4
|
+
export { Worker } from './core/Worker.js';
|
5
|
+
export { BaseAdapter } from './adapters/BaseAdapter/BaseAdapter.js';
|
6
|
+
export { PrismaAdapter } from './adapters/PrismaAdapter/PrismaAdapter.js';
|
7
|
+
export type * from './types.js';
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAE3B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAA;AAEzE,mBAAmB,YAAY,CAAA"}
|
package/dist/index.js
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
+
var __export = (target, all) => {
|
7
|
+
for (var name in all)
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
9
|
+
};
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
12
|
+
for (let key of __getOwnPropNames(from))
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
15
|
+
}
|
16
|
+
return to;
|
17
|
+
};
|
18
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
20
|
+
var index_exports = {};
|
21
|
+
__export(index_exports, {
|
22
|
+
BaseAdapter: () => import_BaseAdapter.BaseAdapter,
|
23
|
+
Executor: () => import_Executor.Executor,
|
24
|
+
JobManager: () => import_JobManager.JobManager,
|
25
|
+
PrismaAdapter: () => import_PrismaAdapter.PrismaAdapter,
|
26
|
+
Worker: () => import_Worker.Worker
|
27
|
+
});
|
28
|
+
module.exports = __toCommonJS(index_exports);
|
29
|
+
__reExport(index_exports, require("./errors.js"), module.exports);
|
30
|
+
var import_JobManager = require("./core/JobManager.js");
|
31
|
+
var import_Executor = require("./core/Executor.js");
|
32
|
+
var import_Worker = require("./core/Worker.js");
|
33
|
+
var import_BaseAdapter = require("./adapters/BaseAdapter/BaseAdapter.js");
|
34
|
+
var import_PrismaAdapter = require("./adapters/PrismaAdapter/PrismaAdapter.js");
|
35
|
+
// Annotate the CommonJS export names for ESM import in node:
|
36
|
+
0 && (module.exports = {
|
37
|
+
BaseAdapter,
|
38
|
+
Executor,
|
39
|
+
JobManager,
|
40
|
+
PrismaAdapter,
|
41
|
+
Worker,
|
42
|
+
...require("./errors.js")
|
43
|
+
});
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import type { JobManager } from './core/JobManager.js';
|
2
|
+
import type { Adapters, BasicLogger, Job, JobComputedProperties, QueueNames } from './types.js';
|
3
|
+
/**
|
4
|
+
* Loads the job manager from the users project
|
5
|
+
*
|
6
|
+
* @returns JobManager
|
7
|
+
*/
|
8
|
+
export declare const loadJobsManager: () => Promise<JobManager<Adapters, QueueNames, BasicLogger>>;
|
9
|
+
/**
|
10
|
+
* Load a specific job implementation from the users project
|
11
|
+
*/
|
12
|
+
export declare const loadJob: ({ name: jobName, path: jobPath, }: JobComputedProperties) => Promise<Job<QueueNames, unknown[]>>;
|
13
|
+
//# sourceMappingURL=loaders.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"loaders.d.ts","sourceRoot":"","sources":["../src/loaders.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,GAAG,EACH,qBAAqB,EACrB,UAAU,EACX,MAAM,YAAY,CAAA;AAGnB;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAa,OAAO,CAC9C,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAgB9C,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,sCAGjB,qBAAqB,KAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAgB5D,CAAA"}
|