@ceramicnetwork/job-queue 1.0.1-rc.0

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/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Ceramic job queue
2
+
3
+ ## Installation
4
+
5
+ ```
6
+ $ npm install @ceramicnetwork/job-queue
7
+ ```
8
+
9
+ ## Development
10
+
11
+ Run tests:
12
+
13
+ ```shell
14
+ npm test
15
+ ```
16
+
17
+ Run linter:
18
+
19
+ ```shell
20
+ npm run lint
21
+ ```
22
+
23
+ ## Contributing
24
+
25
+ We are happy to accept small and large contributions. Make sure to check out the
26
+ [Ceramic specifications](https://github.com/ceramicnetwork/ceramic/blob/main/SPECIFICATION.md)
27
+ for details of how the protocol works.
28
+
29
+ ## License
30
+
31
+ MIT or Apache-2.0
package/lib/index.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ import { default as PgBoss, type SendOptions } from 'pg-boss';
2
+ import { DiagnosticsLogger } from '@ceramicnetwork/common';
3
+ export interface Job<T extends Record<any, any>> {
4
+ name: string;
5
+ data: T;
6
+ id?: string;
7
+ options?: SendOptions;
8
+ }
9
+ export interface JobWithMetadata<T> extends Job<T> {
10
+ startedOn: Date;
11
+ createdOn: Date;
12
+ completedOn: Date | null;
13
+ }
14
+ export declare type JobState = 'created' | 'retry' | 'active' | 'completed' | 'expired' | 'cancelled' | 'failed';
15
+ export interface IJobQueue<T extends Record<any, any>> {
16
+ init: (workersByJob: Record<string, Worker<T>>) => Promise<void>;
17
+ addJob: (job: Job<T>) => Promise<void>;
18
+ addJobs: (jobs: Job<T>[]) => Promise<void>;
19
+ updateJob: (jobId: string, data: T) => Promise<void>;
20
+ stop: () => Promise<void>;
21
+ getJobs(state: JobState, jobTypes: Array<string>): Promise<Record<string, Array<JobWithMetadata<T>>>>;
22
+ }
23
+ export declare type Worker<T> = {
24
+ handler: (job: PgBoss.Job<T>) => any;
25
+ };
26
+ export declare class JobQueue<T extends Record<any, any>> implements IJobQueue<T> {
27
+ private readonly logger;
28
+ private queue;
29
+ private dbConnection;
30
+ private jobs;
31
+ constructor(db: string, logger: DiagnosticsLogger);
32
+ _getJobIds(state?: JobState, jobTypes?: string[]): Promise<string[]>;
33
+ getJobs(state?: JobState, jobTypes?: string[]): Promise<Record<string, Array<JobWithMetadata<T>>>>;
34
+ init(workersByJob: Record<string, Worker<T>>, resumeActive?: boolean): Promise<void>;
35
+ _workerExistsForJob(jobName: string): boolean;
36
+ addJob(job: Job<T>): Promise<void>;
37
+ addJobs(jobs: Job<T>[]): Promise<void>;
38
+ stop(): Promise<void>;
39
+ updateJob(jobId: string, data: T): Promise<void>;
40
+ _clearAllJobs(): Promise<void>;
41
+ _waitForAllJobsToComplete(): Promise<void>;
42
+ }
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/lib/index.js ADDED
@@ -0,0 +1,109 @@
1
+ import { default as PgBoss, } from 'pg-boss';
2
+ import Pg from 'pg';
3
+ import { fromEvent, firstValueFrom, timeout, throwError, filter, interval, mergeMap } from 'rxjs';
4
+ class PgWrapper {
5
+ constructor(db) {
6
+ this.db = db;
7
+ }
8
+ executeSql(text, values) {
9
+ return this.db.query(text, values);
10
+ }
11
+ }
12
+ export class JobQueue {
13
+ constructor(db, logger) {
14
+ this.logger = logger;
15
+ this.jobs = [];
16
+ this.dbConnection = new Pg.Pool({
17
+ connectionString: db,
18
+ });
19
+ this.queue = new PgBoss({ db: new PgWrapper(this.dbConnection) });
20
+ this.queue.on('error', (err) => {
21
+ this.logger.err(`Error received by job queue: ${err}`);
22
+ });
23
+ }
24
+ async _getJobIds(state = 'active', jobTypes = this.jobs) {
25
+ const result = await this.dbConnection.query(`SELECT id FROM pgboss.job WHERE state = '${state}' and name IN (${jobTypes
26
+ .map((jobName) => `'${jobName}'`)
27
+ .join(', ')})`);
28
+ return result.rows.map(({ id }) => id);
29
+ }
30
+ async getJobs(state = 'active', jobTypes = this.jobs) {
31
+ const activeJobsIds = await this._getJobIds(state, jobTypes);
32
+ const jobs = await Promise.all(activeJobsIds.map((jobId) => this.queue.getJobById(jobId)));
33
+ return jobs.reduce((jobsByJobName, job) => {
34
+ if (job == null) {
35
+ return jobsByJobName;
36
+ }
37
+ if (!jobsByJobName[job.name])
38
+ jobsByJobName[job.name] = [];
39
+ jobsByJobName[job.name].push({
40
+ name: job.name,
41
+ data: job.data,
42
+ id: job.id,
43
+ startedOn: job.startedon,
44
+ createdOn: job.createdon,
45
+ completedOn: job.completedon,
46
+ });
47
+ return jobsByJobName;
48
+ }, {});
49
+ }
50
+ async init(workersByJob, resumeActive = true) {
51
+ this.jobs = Object.keys(workersByJob);
52
+ await this.dbConnection.query('CREATE EXTENSION IF NOT EXISTS "pgcrypto"');
53
+ await this.queue.start();
54
+ if (resumeActive) {
55
+ const activeJobsIds = await this._getJobIds('active');
56
+ if (activeJobsIds.length > 0) {
57
+ await this.queue.cancel(activeJobsIds);
58
+ await this.queue.resume(activeJobsIds);
59
+ }
60
+ }
61
+ await Promise.all(Object.entries(workersByJob).map(([jobName, worker]) => this.queue.work(jobName, { teamRefill: true }, worker.handler.bind(worker))));
62
+ }
63
+ _workerExistsForJob(jobName) {
64
+ return this.jobs.includes(jobName);
65
+ }
66
+ async addJob(job) {
67
+ if (!this._workerExistsForJob(job.name)) {
68
+ throw Error(`Cannot add job ${job.name} to queue because no workers for that job exist`);
69
+ }
70
+ await this.queue.send(job.name, job.data, job.options);
71
+ }
72
+ async addJobs(jobs) {
73
+ const jobWithoutWorker = jobs.find((job) => !this._workerExistsForJob(job.name));
74
+ if (jobWithoutWorker) {
75
+ throw Error(`Cannot add job ${jobWithoutWorker.name} to queue because no workers for that job exist`);
76
+ }
77
+ await this.queue.insert(jobs.map((job) => ({
78
+ name: job.name,
79
+ data: job.data,
80
+ })));
81
+ }
82
+ async stop() {
83
+ await this.queue.stop({ graceful: true });
84
+ await this.queue.boss.stop();
85
+ await firstValueFrom(fromEvent(this.queue, 'stopped'));
86
+ if (this.dbConnection) {
87
+ await this.dbConnection.end();
88
+ this.dbConnection = null;
89
+ }
90
+ }
91
+ async updateJob(jobId, data) {
92
+ const text = 'UPDATE pgboss.job set data = $1 WHERE id = $2';
93
+ const values = [data, jobId];
94
+ const result = await this.dbConnection.query(text, values);
95
+ if (result.rowCount !== 1) {
96
+ throw Error(`Unable to update job with id ${jobId}`);
97
+ }
98
+ }
99
+ async _clearAllJobs() {
100
+ await this.queue.clearStorage();
101
+ }
102
+ async _waitForAllJobsToComplete() {
103
+ await firstValueFrom(interval(500).pipe(mergeMap(() => Promise.all(this.jobs.map(async (jobName) => this.queue.getQueueSize(jobName, { before: 'completed' })))), filter((jobCounts) => jobCounts.every((count) => count === 0)), timeout({
104
+ each: 30000,
105
+ with: () => throwError(() => new Error(`Timeout waiting for jobs to complete`)),
106
+ })));
107
+ }
108
+ }
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@ceramicnetwork/job-queue",
3
+ "version": "1.0.1-rc.0",
4
+ "description": "Ceramic persistent job queue",
5
+ "keywords": [
6
+ "ceramic",
7
+ "job",
8
+ "queue"
9
+ ],
10
+ "main": "./lib/index.js",
11
+ "types": "./lib/index.d.ts",
12
+ "type": "module",
13
+ "files": [
14
+ "lib"
15
+ ],
16
+ "directories": {
17
+ "lib": "./lib"
18
+ },
19
+ "sideEffects": false,
20
+ "exports": {
21
+ ".": "./lib/index.js"
22
+ },
23
+ "scripts": {
24
+ "test": "NODE_OPTIONS=--experimental-vm-modules npx jest --silent --coverage --forceExit",
25
+ "build": "npx tsc --project tsconfig.json",
26
+ "prepublishOnly": "npm run build",
27
+ "prebuild": "npm run clean",
28
+ "lint": "npx eslint ./src --ext .js,.jsx,.ts,.tsx",
29
+ "clean": "npx rimraf ./lib"
30
+ },
31
+ "author": "3Box Labs",
32
+ "license": "(Apache-2.0 OR MIT)",
33
+ "dependencies": {
34
+ "@ceramicnetwork/common": "^2.34.0-rc.1",
35
+ "pg": "^8.11.3",
36
+ "pg-boss": "^8.2.0",
37
+ "rxjs": "^7.8.1"
38
+ },
39
+ "devDependencies": {
40
+ "@databases/pg-test": "^3.1.2",
41
+ "@jest/globals": "^29.6.4",
42
+ "@types/pg": "^8.10.2"
43
+ },
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "gitHead": "60949ec2f542a82d0eb0e88899fa397c9f0a0910"
48
+ }