pg-boss 12.18.2 → 12.19.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 +2 -2
- package/dist/adapters/drizzle.d.ts +3 -1
- package/dist/adapters/drizzle.d.ts.map +1 -1
- package/dist/adapters/drizzle.js +2 -1
- package/dist/adapters/knex.d.ts +3 -1
- package/dist/adapters/knex.d.ts.map +1 -1
- package/dist/adapters/knex.js +2 -2
- package/dist/attorney.d.ts +2 -1
- package/dist/attorney.d.ts.map +1 -1
- package/dist/attorney.js +91 -1
- package/dist/boss.d.ts.map +1 -1
- package/dist/boss.js +2 -0
- package/dist/db.d.ts +1 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +20 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/manager.d.ts +4 -0
- package/dist/manager.d.ts.map +1 -1
- package/dist/manager.js +136 -1
- package/dist/migrationStore.d.ts.map +1 -1
- package/dist/migrationStore.js +197 -0
- package/dist/plans.d.ts +74 -63
- package/dist/plans.d.ts.map +1 -1
- package/dist/plans.js +203 -81
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +10 -10
package/README.md
CHANGED
|
@@ -40,7 +40,7 @@ pg-boss relies on Postgres's SKIP LOCKED, a feature built specifically for messa
|
|
|
40
40
|
This will likely cater the most to teams already familiar with the simplicity of relational database semantics and operations (SQL, querying, and backups). It will be especially useful to those already relying on PostgreSQL that want to limit how many systems are required to monitor and support in their architecture.
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
## Summary
|
|
43
|
+
## Summary
|
|
44
44
|
* Exactly-once job delivery
|
|
45
45
|
* Create jobs within your existing database transaction
|
|
46
46
|
* Backpressure-compatible polling workers
|
|
@@ -56,7 +56,7 @@ This will likely cater the most to teams already familiar with the simplicity of
|
|
|
56
56
|
|
|
57
57
|
pg-boss includes a command-line interface if needed for managing database migrations without writing code. This is useful for CI/CD pipelines, database setup scripts, or manual schema management.
|
|
58
58
|
|
|
59
|
-
See the [CLI documentation](https://timgit.github.io/pg-boss
|
|
59
|
+
See the [CLI documentation](https://timgit.github.io/pg-boss/cli) for details.
|
|
60
60
|
|
|
61
61
|
## Dashboard
|
|
62
62
|
|
|
@@ -2,7 +2,9 @@ import type { IDatabase } from '../types.ts';
|
|
|
2
2
|
export interface DrizzleTransactionLike {
|
|
3
3
|
execute(query: unknown): Promise<{
|
|
4
4
|
rows: any[];
|
|
5
|
-
}
|
|
5
|
+
} | {
|
|
6
|
+
rows: any[];
|
|
7
|
+
}[]>;
|
|
6
8
|
}
|
|
7
9
|
export interface DrizzleSqlTagLike {
|
|
8
10
|
(strings: TemplateStringsArray, ...values: unknown[]): unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drizzle.d.ts","sourceRoot":"","sources":["../../src/adapters/drizzle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"drizzle.d.ts","sourceRoot":"","sources":["../../src/adapters/drizzle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAI5C,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,GAAG,EAAE,CAAA;KAAE,EAAE,CAAC,CAAA;CACtE;AAED,MAAM,WAAW,iBAAiB;IAChC,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;CAC/D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAE,EAAE,EAAE,sBAAsB,EAAE,GAAG,EAAE,iBAAiB,GAAG,SAAS,CAQ1F"}
|
package/dist/adapters/drizzle.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { parsePlaceholders } from "./placeholders.js";
|
|
2
|
+
import { unwrapSQLResult } from '../tools.js';
|
|
2
3
|
/**
|
|
3
4
|
* Wraps a drizzle-orm transaction as an {@link IDatabase}.
|
|
4
5
|
*
|
|
@@ -21,7 +22,7 @@ export function fromDrizzle(tx, sql) {
|
|
|
21
22
|
async executeSql(text, values) {
|
|
22
23
|
const { parts, reordered } = parsePlaceholders(text, values);
|
|
23
24
|
const strings = Object.assign([...parts], { raw: [...parts] });
|
|
24
|
-
return tx.execute(sql(strings, ...reordered));
|
|
25
|
+
return unwrapSQLResult(await tx.execute(sql(strings, ...reordered)));
|
|
25
26
|
}
|
|
26
27
|
};
|
|
27
28
|
}
|
package/dist/adapters/knex.d.ts
CHANGED
|
@@ -2,7 +2,9 @@ import type { IDatabase } from '../types.ts';
|
|
|
2
2
|
export interface KnexTransactionLike {
|
|
3
3
|
raw<T = any>(sql: string, bindings?: readonly unknown[]): Promise<{
|
|
4
4
|
rows: T[];
|
|
5
|
-
}
|
|
5
|
+
} | {
|
|
6
|
+
rows: any[];
|
|
7
|
+
}[]>;
|
|
6
8
|
}
|
|
7
9
|
export declare function fromKnex(trx: KnexTransactionLike): IDatabase;
|
|
8
10
|
//# sourceMappingURL=knex.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knex.d.ts","sourceRoot":"","sources":["../../src/adapters/knex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"knex.d.ts","sourceRoot":"","sources":["../../src/adapters/knex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAI5C,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,GAAG,EAAE,CAAA;KAAE,EAAE,CAAC,CAAA;CACrG;AAED,wBAAgB,QAAQ,CAAE,GAAG,EAAE,mBAAmB,GAAG,SAAS,CAW7D"}
|
package/dist/adapters/knex.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { parsePlaceholders } from "./placeholders.js";
|
|
2
|
+
import { unwrapSQLResult } from '../tools.js';
|
|
2
3
|
export function fromKnex(trx) {
|
|
3
4
|
return {
|
|
4
5
|
async executeSql(text, values) {
|
|
@@ -7,8 +8,7 @@ export function fromKnex(trx) {
|
|
|
7
8
|
// mapped to its own ? with the value duplicated in textual order.
|
|
8
9
|
const { parts, reordered } = parsePlaceholders(text, values);
|
|
9
10
|
const knexSql = parts.join('?');
|
|
10
|
-
|
|
11
|
-
return { rows: result.rows };
|
|
11
|
+
return unwrapSQLResult(await trx.raw(knexSql, reordered));
|
|
12
12
|
}
|
|
13
13
|
};
|
|
14
14
|
}
|
package/dist/attorney.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ declare const POLICY: {
|
|
|
6
6
|
};
|
|
7
7
|
declare function validateQueueArgs(config?: any): void;
|
|
8
8
|
declare function checkSendArgs(args: any): types.Request;
|
|
9
|
+
declare function validateFlowJobs(jobs: types.FlowJob[]): void;
|
|
9
10
|
declare function checkWorkArgs(name: string, args: any[]): {
|
|
10
11
|
options: types.ResolvedWorkOptions;
|
|
11
12
|
callback: types.WorkHandler<any>;
|
|
@@ -15,5 +16,5 @@ declare function getConfig(value: string | types.ConstructorOptions): types.Reso
|
|
|
15
16
|
declare function assertPostgresObjectName(name: string): void;
|
|
16
17
|
declare function assertQueueName(name: string): void;
|
|
17
18
|
declare function assertKey(key: string): void;
|
|
18
|
-
export { assertKey, assertPostgresObjectName, assertQueueName, checkFetchArgs, checkSendArgs, checkWorkArgs, getConfig, POLICY, validateQueueArgs };
|
|
19
|
+
export { assertKey, assertPostgresObjectName, assertQueueName, checkFetchArgs, checkSendArgs, checkWorkArgs, getConfig, POLICY, validateFlowJobs, validateQueueArgs };
|
|
19
20
|
//# sourceMappingURL=attorney.d.ts.map
|
package/dist/attorney.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attorney.d.ts","sourceRoot":"","sources":["../src/attorney.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,YAAY,CAAA;AAExC,QAAA,MAAM,MAAM;;;;CAIX,CAAA;AAMD,iBAAS,iBAAiB,CAAE,MAAM,GAAE,GAAQ,QAY3C;AAED,iBAAS,aAAa,CAAE,IAAI,EAAE,GAAG,GAAG,KAAK,CAAC,OAAO,CAgDhD;
|
|
1
|
+
{"version":3,"file":"attorney.d.ts","sourceRoot":"","sources":["../src/attorney.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,YAAY,CAAA;AAExC,QAAA,MAAM,MAAM;;;;CAIX,CAAA;AAMD,iBAAS,iBAAiB,CAAE,MAAM,GAAE,GAAQ,QAY3C;AAED,iBAAS,aAAa,CAAE,IAAI,EAAE,GAAG,GAAG,KAAK,CAAC,OAAO,CAgDhD;AAWD,iBAAS,gBAAgB,CAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,QA2D/C;AA2GD,iBAAS,aAAa,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG;IAClD,OAAO,EAAE,KAAK,CAAC,mBAAmB,CAAA;IAClC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;CACjC,CA6BA;AAED,iBAAS,cAAc,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,QAQlD;AAED,iBAAS,SAAS,CAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,kBAAkB,GAAG,KAAK,CAAC,0BAA0B,CAoB9F;AAwBD,iBAAS,wBAAwB,CAAE,IAAI,EAAE,MAAM,QAK9C;AAED,iBAAS,eAAe,CAAE,IAAI,EAAE,MAAM,QAIrC;AAED,iBAAS,SAAS,CAAE,GAAG,EAAE,MAAM,QAI9B;AA2GD,OAAO,EACL,SAAS,EACT,wBAAwB,EACxB,eAAe,EACf,cAAc,EACd,aAAa,EACb,aAAa,EACb,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,iBAAiB,EAClB,CAAA"}
|
package/dist/attorney.js
CHANGED
|
@@ -64,6 +64,96 @@ function validateGroupConfig(config) {
|
|
|
64
64
|
assert(typeof config.group.id === 'string' && config.group.id.length > 0, 'group.id must be a non-empty string');
|
|
65
65
|
assert(!('tier' in config.group) || (typeof config.group.tier === 'string' && config.group.tier.length > 0), 'group.tier must be a non-empty string if provided');
|
|
66
66
|
}
|
|
67
|
+
function validateFlowJobs(jobs) {
|
|
68
|
+
assert(Array.isArray(jobs), 'flow requires an array of jobs');
|
|
69
|
+
assert(jobs.length >= 2, 'flow requires at least 2 jobs');
|
|
70
|
+
const refs = new Set();
|
|
71
|
+
for (const job of jobs) {
|
|
72
|
+
assert(typeof job.ref === 'string' && job.ref.length > 0, 'each flow job must have a non-empty ref');
|
|
73
|
+
assert(!refs.has(job.ref), `duplicate ref: "${job.ref}"`);
|
|
74
|
+
refs.add(job.ref);
|
|
75
|
+
assert(typeof job.name === 'string' && job.name.length > 0, 'each flow job must have a non-empty name');
|
|
76
|
+
assertObjectName(job.name);
|
|
77
|
+
}
|
|
78
|
+
const hasDeps = jobs.some(j => j.dependsOn && j.dependsOn.length > 0);
|
|
79
|
+
assert(hasDeps, 'flow requires at least one job with dependsOn');
|
|
80
|
+
for (const job of jobs) {
|
|
81
|
+
if (!job.dependsOn)
|
|
82
|
+
continue;
|
|
83
|
+
assert(Array.isArray(job.dependsOn), `dependsOn for ref "${job.ref}" must be an array`);
|
|
84
|
+
for (const dep of job.dependsOn) {
|
|
85
|
+
assert(typeof dep === 'string' && dep.length > 0, 'dependsOn entries must be non-empty strings');
|
|
86
|
+
assert(dep !== job.ref, `job "${job.ref}" cannot depend on itself`);
|
|
87
|
+
assert(refs.has(dep), `dependsOn ref "${dep}" not found in flow`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Cycle detection via topological sort
|
|
91
|
+
const inDegree = new Map();
|
|
92
|
+
const edges = new Map();
|
|
93
|
+
for (const job of jobs) {
|
|
94
|
+
inDegree.set(job.ref, 0);
|
|
95
|
+
edges.set(job.ref, []);
|
|
96
|
+
}
|
|
97
|
+
for (const job of jobs) {
|
|
98
|
+
if (!job.dependsOn)
|
|
99
|
+
continue;
|
|
100
|
+
for (const dep of job.dependsOn) {
|
|
101
|
+
edges.get(dep).push(job.ref);
|
|
102
|
+
inDegree.set(job.ref, inDegree.get(job.ref) + 1);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const queue = [];
|
|
106
|
+
for (const [ref, deg] of inDegree) {
|
|
107
|
+
if (deg === 0)
|
|
108
|
+
queue.push(ref);
|
|
109
|
+
}
|
|
110
|
+
let visited = 0;
|
|
111
|
+
while (queue.length > 0) {
|
|
112
|
+
const current = queue.shift();
|
|
113
|
+
visited++;
|
|
114
|
+
for (const child of edges.get(current)) {
|
|
115
|
+
const newDeg = inDegree.get(child) - 1;
|
|
116
|
+
inDegree.set(child, newDeg);
|
|
117
|
+
if (newDeg === 0)
|
|
118
|
+
queue.push(child);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (visited !== jobs.length) {
|
|
122
|
+
const cycle = findDependencyCycle(edges);
|
|
123
|
+
assert(false, `flow contains a dependency cycle: ${cycle.join(' -> ')}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function findDependencyCycle(edges) {
|
|
127
|
+
const visiting = new Set();
|
|
128
|
+
const visited = new Set();
|
|
129
|
+
const path = [];
|
|
130
|
+
function visit(ref) {
|
|
131
|
+
if (visiting.has(ref)) {
|
|
132
|
+
const start = path.indexOf(ref);
|
|
133
|
+
return [...path.slice(start), ref];
|
|
134
|
+
}
|
|
135
|
+
if (visited.has(ref))
|
|
136
|
+
return null;
|
|
137
|
+
visiting.add(ref);
|
|
138
|
+
path.push(ref);
|
|
139
|
+
for (const child of edges.get(ref) || []) {
|
|
140
|
+
const cycle = visit(child);
|
|
141
|
+
if (cycle)
|
|
142
|
+
return cycle;
|
|
143
|
+
}
|
|
144
|
+
path.pop();
|
|
145
|
+
visiting.delete(ref);
|
|
146
|
+
visited.add(ref);
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
let cycle = null;
|
|
150
|
+
for (const ref of edges.keys()) {
|
|
151
|
+
cycle = visit(ref);
|
|
152
|
+
if (cycle)
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
return cycle;
|
|
156
|
+
}
|
|
67
157
|
function validateGroupConcurrencyValue(value, optionName) {
|
|
68
158
|
if (typeof value === 'number') {
|
|
69
159
|
assert(Number.isInteger(value) && value >= 1, `${optionName} must be an integer >= 1`);
|
|
@@ -250,4 +340,4 @@ function applyBamConfig(config) {
|
|
|
250
340
|
assert(!('bamIntervalSeconds' in config) || config.bamIntervalSeconds >= minInterval, `configuration assert: bamIntervalSeconds must be at least ${minInterval} seconds`);
|
|
251
341
|
config.bamIntervalSeconds = config.bamIntervalSeconds || 60;
|
|
252
342
|
}
|
|
253
|
-
export { assertKey, assertPostgresObjectName, assertQueueName, checkFetchArgs, checkSendArgs, checkWorkArgs, getConfig, POLICY, validateQueueArgs };
|
|
343
|
+
export { assertKey, assertPostgresObjectName, assertQueueName, checkFetchArgs, checkSendArgs, checkWorkArgs, getConfig, POLICY, validateFlowJobs, validateQueueArgs };
|
package/dist/boss.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boss.d.ts","sourceRoot":"","sources":["../src/boss.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAkBnC,cAAM,IAAK,SAAQ,YAAa,YAAW,KAAK,CAAC,WAAW;;IAS1D,MAAM;;;MAAS;gBAGb,EAAE,EAAE,KAAK,CAAC,SAAS,EACnB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,KAAK,CAAC,0BAA0B;IAmB1C,IAAI,WAAW,IAAK,OAAO,CAE1B;IAEK,KAAK;IAWL,IAAI;IA+EJ,SAAS,CAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE;
|
|
1
|
+
{"version":3,"file":"boss.d.ts","sourceRoot":"","sources":["../src/boss.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAkBnC,cAAM,IAAK,SAAQ,YAAa,YAAW,KAAK,CAAC,WAAW;;IAS1D,MAAM;;;MAAS;gBAGb,EAAE,EAAE,KAAK,CAAC,SAAS,EACnB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,KAAK,CAAC,0BAA0B;IAmB1C,IAAI,WAAW,IAAK,OAAO,CAE1B;IAEK,KAAK;IAWL,IAAI;IA+EJ,SAAS,CAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE;CAwGtD;AAED,eAAe,IAAI,CAAA"}
|
package/dist/boss.js
CHANGED
|
@@ -181,6 +181,8 @@ class Boss extends EventEmitter {
|
|
|
181
181
|
const queues = rows.map((q) => q.name);
|
|
182
182
|
const sql = plans.deletion(this.#config.schema, table, queues);
|
|
183
183
|
await this.#executeQuery(sql);
|
|
184
|
+
const depSql = plans.cleanupDependencies(this.#config.schema, table, queues);
|
|
185
|
+
await this.#executeQuery(depSql);
|
|
184
186
|
}
|
|
185
187
|
}
|
|
186
188
|
}
|
package/dist/db.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ declare class Db extends EventEmitter implements types.IDatabase, types.EventsMi
|
|
|
11
11
|
open(): Promise<void>;
|
|
12
12
|
close(): Promise<void>;
|
|
13
13
|
executeSql(text: string, values?: unknown[]): Promise<import("pg").QueryResult<any>>;
|
|
14
|
+
withTransaction<T>(fn: (db: types.IDatabase) => Promise<T>): Promise<T>;
|
|
14
15
|
}
|
|
15
16
|
export default Db;
|
|
16
17
|
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;AAGtC,OAAO,KAAK,KAAK,KAAK,MAAM,YAAY,CAAA;AAExC,cAAM,EAAG,SAAQ,YAAa,YAAW,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW;IACzE,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,MAAM,CAAuB;IAGrC,MAAM,EAAE,OAAO,CAAA;gBAEF,MAAM,EAAE,KAAK,CAAC,eAAe;IAY1C,MAAM;;MAEL;IAEK,IAAI;IAMJ,KAAK;IAOL,UAAU,CAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;AAGtC,OAAO,KAAK,KAAK,KAAK,MAAM,YAAY,CAAA;AAExC,cAAM,EAAG,SAAQ,YAAa,YAAW,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW;IACzE,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,MAAM,CAAuB;IAGrC,MAAM,EAAE,OAAO,CAAA;gBAEF,MAAM,EAAE,KAAK,CAAC,eAAe;IAY1C,MAAM;;MAEL;IAEK,IAAI;IAMJ,KAAK;IAOL,UAAU,CAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE;IAgB5C,eAAe,CAAC,CAAC,EAAG,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAmB/E;AAED,eAAe,EAAE,CAAA"}
|
package/dist/db.js
CHANGED
|
@@ -42,5 +42,25 @@ class Db extends EventEmitter {
|
|
|
42
42
|
// }
|
|
43
43
|
return await this.pool.query(text, values);
|
|
44
44
|
}
|
|
45
|
+
async withTransaction(fn) {
|
|
46
|
+
assert(this.opened, 'Database not opened. Call open() before executing SQL.');
|
|
47
|
+
const client = await this.pool.connect();
|
|
48
|
+
try {
|
|
49
|
+
await client.query('BEGIN');
|
|
50
|
+
const txDb = {
|
|
51
|
+
executeSql: (text, values) => client.query(text, values)
|
|
52
|
+
};
|
|
53
|
+
const result = await fn(txDb);
|
|
54
|
+
await client.query('COMMIT');
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
await client.query('ROLLBACK');
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
client.release();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
45
65
|
}
|
|
46
66
|
export default Db;
|
package/dist/index.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export declare class PgBoss extends EventEmitter<types.PgBossEventMap> {
|
|
|
21
21
|
sendThrottled(name: string, data: object | null, options: types.SendOptions | null, seconds: number, key?: string): Promise<string | null>;
|
|
22
22
|
sendDebounced(name: string, data: object | null, options: types.SendOptions | null, seconds: number, key?: string): Promise<string | null>;
|
|
23
23
|
insert(name: string, jobs: types.JobInsert[], options?: types.InsertOptions): Promise<string[] | null>;
|
|
24
|
+
flow(jobs: types.FlowJob[], options?: types.ConnectionOptions): Promise<Record<string, string>>;
|
|
24
25
|
fetch<T>(name: string, options: types.FetchOptions & {
|
|
25
26
|
includeMetadata: true;
|
|
26
27
|
}): Promise<types.JobWithMetadata<T>[]>;
|
|
@@ -52,6 +53,8 @@ export declare class PgBoss extends EventEmitter<types.PgBossEventMap> {
|
|
|
52
53
|
findJobs<T>(name: string, options?: types.FindJobsOptions): Promise<types.JobWithMetadata<T>[]>;
|
|
53
54
|
createQueue(name: string, options?: Omit<types.Queue, 'name'>): Promise<void>;
|
|
54
55
|
getBlockedKeys(name: string): Promise<string[]>;
|
|
56
|
+
getDependencies(name: string, id: string, options?: types.ConnectionOptions): Promise<types.DependencyRef[]>;
|
|
57
|
+
getDependents(name: string, id: string, options?: types.ConnectionOptions): Promise<types.DependencyRef[]>;
|
|
55
58
|
updateQueue(name: string, options?: types.UpdateQueueOptions): Promise<void>;
|
|
56
59
|
deleteQueue(name: string): Promise<void>;
|
|
57
60
|
getQueues(names?: string[]): Promise<types.QueueResult[]>;
|
|
@@ -75,7 +78,7 @@ export declare class PgBoss extends EventEmitter<types.PgBossEventMap> {
|
|
|
75
78
|
getBamEntries(): Promise<types.BamEntry[]>;
|
|
76
79
|
getDb(): types.IDatabase;
|
|
77
80
|
}
|
|
78
|
-
export type { BamEntry, BamEvent, BamStatusSummary, CommandResponse, CompleteOptions, ConnectionOptions, ConstructorOptions, FetchOptions, FindJobsOptions, GroupConcurrencyConfig, GroupOptions, IDatabase as Db, InsertOptions, Job, JobFetchOptions, JobInsert, JobOptions, JobPollingOptions, JobStates, Events, JobWithMetadata, MaintenanceOptions, OffWorkOptions, Queue, QueueOptions, QueuePolicy, QueueResult, Request, Schedule, ScheduleOptions, SchedulingOptions, SendOptions, StopOptions, WipData, WorkHandler, WorkOptions, WorkWithMetadataHandler, } from './types.ts';
|
|
81
|
+
export type { BamEntry, BamEvent, BamStatusSummary, CommandResponse, CompleteOptions, ConnectionOptions, ConstructorOptions, DatabaseOptions, FetchGroupConcurrencyOptions, DependencyRef, FetchOptions, FindJobsOptions, FlowJob, GroupConcurrencyConfig, GroupOptions, IDatabase as Db, InsertOptions, Job, JobFetchOptions, JobInsert, JobOptions, JobPollingOptions, JobStates, Events, JobWithMetadata, MaintenanceOptions, OffWorkOptions, PgBossEventMap, Queue, QueueOptions, QueuePolicy, QueueResult, Request, Schedule, ScheduleOptions, SchedulingOptions, SendOptions, StopOptions, UpdateQueueOptions, Warning, WipData, WorkConcurrencyOptions, WorkerState, WorkHandler, WorkOptions, WorkWithMetadataHandler, } from './types.ts';
|
|
79
82
|
export type { JobSpyInterface, JobSpyState, JobDataSelector, JobSelector, SpyJob, } from './spy.ts';
|
|
80
83
|
export { fromKnex, fromKysely, fromDrizzle, fromPrisma, } from './adapters/index.ts';
|
|
81
84
|
export type { KnexTransactionLike, KyselyTransactionLike, DrizzleTransactionLike, DrizzleSqlTagLike, PrismaTransactionLike, } from './adapters/index.ts';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAA;AAQtC,OAAO,KAAK,KAAK,KAAK,MAAM,YAAY,CAAA;AAGxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE/C,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAA;AACvD,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,MAMzB,CAAA;AAEF,wBAAgB,oBAAoB,CAAE,MAAM,CAAC,EAAE,MAAM,UAEpD;AAED,wBAAgB,iBAAiB,CAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,UAEnE;AAED,wBAAgB,gBAAgB,CAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,UAElE;AAED,qBAAa,MAAO,SAAQ,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC;;gBAa/C,gBAAgB,EAAE,MAAM;gBACxB,OAAO,EAAE,KAAK,CAAC,kBAAkB;IA6CxC,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAsCvB,IAAI,CAAE,OAAO,GAAE,KAAK,CAAC,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4C3D,IAAI,CAAE,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IACrD,IAAI,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAK9F,SAAS,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IACpH,SAAS,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAC5H,SAAS,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKzH,aAAa,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI3I,aAAa,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI3I,MAAM,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAIvG,IAAI,CAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIhG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,GAAG;QAAE,eAAe,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACpH,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAK7E,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG;QAAE,eAAe,EAAE,IAAI,CAAA;KAAE,EAAE,OAAO,EAAE,KAAK,CAAC,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7K,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAKrI,OAAO,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,YAAY,CAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIrC,SAAS,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,WAAW,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,OAAO,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlF,MAAM,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;IAI/G,MAAM,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;IAI/G,KAAK,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;IAI9G,SAAS,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;IAIlH,gBAAgB,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,gBAAgB,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,aAAa,CAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,QAAQ,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;IAIrI,IAAI,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;IAInI,KAAK,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;IAI9G;;OAEG;IACH,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAIpH,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAI/F,WAAW,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9E,cAAc,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIhD,eAAe,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAI7G,aAAa,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAI3G,WAAW,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7E,WAAW,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAI1D,QAAQ,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;IAI1D,aAAa,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;IAIxD,aAAa,IAAK,OAAO;IAIzB,YAAY,IAAK,OAAO;IAIxB,cAAc,IAAK,OAAO;IAI1B,SAAS,CAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,UAAU,CAAE,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,KAAK,CAAC,OAAO,EAAE;IAIrE,MAAM,CAAC,CAAC,GAAG,MAAM,EAAG,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;IAIrD,UAAU,IAAK,IAAI;IAInB,WAAW,IAAK,OAAO,CAAC,OAAO,CAAC;IAIhC,aAAa,IAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,QAAQ,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3G,UAAU,CAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,YAAY,CAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAI/D,YAAY,IAAK,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAMlD,aAAa,IAAK,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAMjD,KAAK,IAAK,KAAK,CAAC,SAAS;CAW1B;AAED,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,4BAA4B,EAC5B,aAAa,EACb,YAAY,EACZ,eAAe,EACf,OAAO,EACP,sBAAsB,EACtB,YAAY,EACZ,SAAS,IAAI,EAAE,EACf,aAAa,EACb,GAAG,EACH,eAAe,EACf,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,MAAM,EACN,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,KAAK,EACL,YAAY,EACZ,WAAW,EACX,WAAW,EACX,OAAO,EACP,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,OAAO,EACP,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,WAAW,EACX,uBAAuB,GACxB,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,eAAe,EACf,WAAW,EACX,eAAe,EACf,WAAW,EACX,MAAM,GACP,MAAM,UAAU,CAAA;AAEjB,OAAO,EACL,QAAQ,EACR,UAAU,EACV,WAAW,EACX,UAAU,GACX,MAAM,qBAAqB,CAAA;AAE5B,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,qBAAqB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -145,6 +145,9 @@ export class PgBoss extends EventEmitter {
|
|
|
145
145
|
insert(name, jobs, options) {
|
|
146
146
|
return this.#manager.insert(name, jobs, options);
|
|
147
147
|
}
|
|
148
|
+
flow(jobs, options) {
|
|
149
|
+
return this.#manager.flow(jobs, options);
|
|
150
|
+
}
|
|
148
151
|
fetch(name, options = {}) {
|
|
149
152
|
return this.#manager.fetch(name, options);
|
|
150
153
|
}
|
|
@@ -211,6 +214,12 @@ export class PgBoss extends EventEmitter {
|
|
|
211
214
|
getBlockedKeys(name) {
|
|
212
215
|
return this.#manager.getBlockedKeys(name);
|
|
213
216
|
}
|
|
217
|
+
getDependencies(name, id, options) {
|
|
218
|
+
return this.#manager.getDependencies(name, id, options);
|
|
219
|
+
}
|
|
220
|
+
getDependents(name, id, options) {
|
|
221
|
+
return this.#manager.getDependents(name, id, options);
|
|
222
|
+
}
|
|
214
223
|
updateQueue(name, options) {
|
|
215
224
|
return this.#manager.updateQueue(name, options);
|
|
216
225
|
}
|
package/dist/manager.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ declare class Manager extends EventEmitter implements types.EventsMixin {
|
|
|
18
18
|
workers: Map<string, Worker>;
|
|
19
19
|
stopped: boolean | undefined;
|
|
20
20
|
queueCacheInterval: NodeJS.Timeout | undefined;
|
|
21
|
+
wipInterval: NodeJS.Timeout | undefined;
|
|
21
22
|
timekeeper: Timekeeper | undefined;
|
|
22
23
|
queues: Record<string, types.QueueResult> | null;
|
|
23
24
|
pendingOffWorkCleanups: Set<Promise<any>>;
|
|
@@ -56,6 +57,7 @@ declare class Manager extends EventEmitter implements types.EventsMixin {
|
|
|
56
57
|
sendDebounced(name: string, data: object | null, options: types.SendOptions | null, seconds: number, key?: string): Promise<string | null>;
|
|
57
58
|
createJob(request: types.Request): Promise<string | null>;
|
|
58
59
|
insert(name: string, jobs: types.JobInsert[], options?: types.InsertOptions): Promise<string[] | null>;
|
|
60
|
+
flow(jobs: types.FlowJob[], options?: types.ConnectionOptions): Promise<Record<string, string>>;
|
|
59
61
|
getDebounceStartAfter(singletonSeconds: number, clockOffset: number): number;
|
|
60
62
|
fetch<T>(name: string): Promise<types.Job<T>[]>;
|
|
61
63
|
fetch<T>(name: string, options: types.FetchOptions & {
|
|
@@ -87,6 +89,8 @@ declare class Manager extends EventEmitter implements types.EventsMixin {
|
|
|
87
89
|
getQueueStats(name: string): Promise<any>;
|
|
88
90
|
getJobById<T>(name: string, id: string, options?: types.ConnectionOptions): Promise<types.JobWithMetadata<T> | null>;
|
|
89
91
|
findJobs<T>(name: string, options?: types.FindJobsOptions): Promise<types.JobWithMetadata<T>[]>;
|
|
92
|
+
getDependencies(name: string, id: string, options?: types.ConnectionOptions): Promise<types.DependencyRef[]>;
|
|
93
|
+
getDependents(name: string, id: string, options?: types.ConnectionOptions): Promise<types.DependencyRef[]>;
|
|
90
94
|
private assertDb;
|
|
91
95
|
}
|
|
92
96
|
export default Manager;
|
package/dist/manager.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAEA,OAAO,YAAY,MAAM,aAAa,CAAA;AAGtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAE7B,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAG7C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAU,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/manager.js
CHANGED
|
@@ -14,6 +14,16 @@ const events = {
|
|
|
14
14
|
error: 'error',
|
|
15
15
|
wip: 'wip'
|
|
16
16
|
};
|
|
17
|
+
// Standard translation of low-level Postgres errors raised by job-creation SQL
|
|
18
|
+
// into actionable pg-boss errors. Centralized so any write path can reuse it.
|
|
19
|
+
// Always throws; rethrows untranslated errors unchanged.
|
|
20
|
+
function rethrowWriteError(err) {
|
|
21
|
+
// the in-SQL insert guard raises division_by_zero when ON CONFLICT skipped a job
|
|
22
|
+
if (err?.code === plans.PG_ERROR.divisionByZero) {
|
|
23
|
+
throw new Error('one or more jobs could not be created. This usually means a job id was duplicated, collided with an existing job, or was rejected by a queue policy (short, singleton, stately, or exclusive).', { cause: err });
|
|
24
|
+
}
|
|
25
|
+
throw err;
|
|
26
|
+
}
|
|
17
27
|
class Manager extends EventEmitter {
|
|
18
28
|
events = events;
|
|
19
29
|
db;
|
|
@@ -22,6 +32,7 @@ class Manager extends EventEmitter {
|
|
|
22
32
|
workers;
|
|
23
33
|
stopped;
|
|
24
34
|
queueCacheInterval;
|
|
35
|
+
wipInterval;
|
|
25
36
|
timekeeper;
|
|
26
37
|
queues;
|
|
27
38
|
pendingOffWorkCleanups;
|
|
@@ -228,6 +239,17 @@ class Manager extends EventEmitter {
|
|
|
228
239
|
async start() {
|
|
229
240
|
this.stopped = false;
|
|
230
241
|
this.queueCacheInterval = setInterval(() => this.onCacheQueues({ emit: true }), this.config.queueCacheIntervalSeconds * 1000);
|
|
242
|
+
this.wipInterval = setInterval(() => {
|
|
243
|
+
const now = Date.now();
|
|
244
|
+
if ((now - this.wipTs) < 2000) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const wip = this.getWipData();
|
|
248
|
+
if (wip.some(w => w.count > 0)) {
|
|
249
|
+
this.emit(events.wip, wip);
|
|
250
|
+
this.wipTs = now;
|
|
251
|
+
}
|
|
252
|
+
}, 2000);
|
|
231
253
|
await this.onCacheQueues();
|
|
232
254
|
}
|
|
233
255
|
async onCacheQueues({ emit = false } = {}) {
|
|
@@ -256,6 +278,7 @@ class Manager extends EventEmitter {
|
|
|
256
278
|
async stop() {
|
|
257
279
|
this.stopped = true;
|
|
258
280
|
clearInterval(this.queueCacheInterval);
|
|
281
|
+
clearInterval(this.wipInterval);
|
|
259
282
|
await Promise.allSettled([...this.workers.values()]
|
|
260
283
|
.filter(worker => !INTERNAL_QUEUES[worker.name])
|
|
261
284
|
.map(async (worker) => await this.offWork(worker.name, { wait: false })));
|
|
@@ -503,12 +526,16 @@ class Manager extends EventEmitter {
|
|
|
503
526
|
}
|
|
504
527
|
}
|
|
505
528
|
}
|
|
529
|
+
const insertPayload = jobs.map(j => {
|
|
530
|
+
const { blocked, blocking, pendingDependencies, ...rest } = j;
|
|
531
|
+
return rest;
|
|
532
|
+
});
|
|
506
533
|
const db = this.assertDb(options);
|
|
507
534
|
const spy = this.config.__test__enableSpies ? this.#spies.get(name) : undefined;
|
|
508
535
|
// Return IDs if spy is active for this queue (needed for job tracking)
|
|
509
536
|
const returnId = !!spy || !!options.returnId;
|
|
510
537
|
const sql = plans.insertJobs(this.config.schema, { table, name, returnId });
|
|
511
|
-
const { rows } = await db.executeSql(sql, [JSON.stringify(
|
|
538
|
+
const { rows } = await db.executeSql(sql, [JSON.stringify(insertPayload)]);
|
|
512
539
|
if (rows.length) {
|
|
513
540
|
if (spy) {
|
|
514
541
|
for (let i = 0; i < rows.length; i++) {
|
|
@@ -519,6 +546,100 @@ class Manager extends EventEmitter {
|
|
|
519
546
|
}
|
|
520
547
|
return null;
|
|
521
548
|
}
|
|
549
|
+
async flow(jobs, options = {}) {
|
|
550
|
+
Attorney.validateFlowJobs(jobs);
|
|
551
|
+
// validate and normalize each job's options the same way send()/insert() do
|
|
552
|
+
const flowJobs = jobs.map(job => ({
|
|
553
|
+
...job,
|
|
554
|
+
options: Attorney.checkSendArgs([{ name: job.name, data: job.data, options: job.options }]).options
|
|
555
|
+
}));
|
|
556
|
+
const refToId = {};
|
|
557
|
+
for (const job of flowJobs) {
|
|
558
|
+
refToId[job.ref] = job.options?.id ?? randomUUID();
|
|
559
|
+
}
|
|
560
|
+
const refToJob = new Map(flowJobs.map(job => [job.ref, job]));
|
|
561
|
+
const dependencyCountByRef = new Map();
|
|
562
|
+
const parentRefs = new Set();
|
|
563
|
+
const depRows = [];
|
|
564
|
+
for (const job of flowJobs) {
|
|
565
|
+
const dependsOn = [...new Set(job.dependsOn ?? [])];
|
|
566
|
+
dependencyCountByRef.set(job.ref, dependsOn.length);
|
|
567
|
+
for (const depRef of dependsOn) {
|
|
568
|
+
const parentJob = refToJob.get(depRef);
|
|
569
|
+
parentRefs.add(depRef);
|
|
570
|
+
depRows.push({
|
|
571
|
+
child_name: job.name,
|
|
572
|
+
child_id: refToId[job.ref],
|
|
573
|
+
parent_name: parentJob.name,
|
|
574
|
+
parent_id: refToId[depRef]
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
const byQueue = new Map();
|
|
579
|
+
for (const job of flowJobs) {
|
|
580
|
+
const group = byQueue.get(job.name) || [];
|
|
581
|
+
group.push(job);
|
|
582
|
+
byQueue.set(job.name, group);
|
|
583
|
+
}
|
|
584
|
+
// Build one self-contained, parameter-less statement list so the whole flow
|
|
585
|
+
// commits atomically in a single executeSql call, regardless of db adapter.
|
|
586
|
+
// Each insert is guarded so a skipped row (ON CONFLICT) aborts the transaction.
|
|
587
|
+
const statements = [];
|
|
588
|
+
for (const [queueName, queueJobs] of byQueue) {
|
|
589
|
+
const { table } = await this.getQueueCache(queueName);
|
|
590
|
+
const insertPayload = queueJobs.map(j => {
|
|
591
|
+
const dependencyCount = dependencyCountByRef.get(j.ref) ?? 0;
|
|
592
|
+
return {
|
|
593
|
+
id: refToId[j.ref],
|
|
594
|
+
name: queueName,
|
|
595
|
+
data: j.data ?? null,
|
|
596
|
+
priority: j.options?.priority,
|
|
597
|
+
startAfter: j.options?.startAfter,
|
|
598
|
+
singletonKey: j.options?.singletonKey ?? undefined,
|
|
599
|
+
singletonSeconds: j.options?.singletonSeconds,
|
|
600
|
+
groupId: j.options?.group?.id ?? undefined,
|
|
601
|
+
groupTier: j.options?.group?.tier ?? undefined,
|
|
602
|
+
expireInSeconds: j.options?.expireInSeconds,
|
|
603
|
+
deleteAfterSeconds: j.options?.deleteAfterSeconds,
|
|
604
|
+
retentionSeconds: j.options?.retentionSeconds,
|
|
605
|
+
retryLimit: j.options?.retryLimit,
|
|
606
|
+
retryDelay: j.options?.retryDelay,
|
|
607
|
+
retryBackoff: j.options?.retryBackoff,
|
|
608
|
+
retryDelayMax: j.options?.retryDelayMax,
|
|
609
|
+
heartbeatSeconds: j.options?.heartbeatSeconds,
|
|
610
|
+
deadLetter: j.options?.deadLetter ?? undefined,
|
|
611
|
+
blocked: dependencyCount > 0 || undefined,
|
|
612
|
+
blocking: parentRefs.has(j.ref) || undefined,
|
|
613
|
+
pendingDependencies: dependencyCount || undefined
|
|
614
|
+
};
|
|
615
|
+
});
|
|
616
|
+
const insertSql = plans.insertJobs(this.config.schema, { table, name: queueName, returnId: true })
|
|
617
|
+
.replace('$1', () => plans.serializeJsonParam(insertPayload));
|
|
618
|
+
// raises 'division by zero' (aborting the transaction) if any job was skipped.
|
|
619
|
+
// The divisor references the row count so it isn't constant-folded at plan time.
|
|
620
|
+
statements.push(`
|
|
621
|
+
WITH ins AS (
|
|
622
|
+
${insertSql}
|
|
623
|
+
)
|
|
624
|
+
SELECT 1 / (CASE WHEN (SELECT count(*) FROM ins) = ${insertPayload.length} THEN 1 ELSE 0 END)
|
|
625
|
+
`);
|
|
626
|
+
}
|
|
627
|
+
if (depRows.length > 0) {
|
|
628
|
+
statements.push(plans.insertDependencies(this.config.schema)
|
|
629
|
+
.replace('$1', () => plans.serializeJsonParam(depRows)));
|
|
630
|
+
}
|
|
631
|
+
// When the caller provides a db they own the transaction; otherwise wrap the
|
|
632
|
+
// statements so they run atomically as a single round-trip on any adapter.
|
|
633
|
+
const db = options.db ?? this.db;
|
|
634
|
+
const sql = options.db ? statements.join(';\n') : plans.transaction(statements);
|
|
635
|
+
try {
|
|
636
|
+
await db.executeSql(sql);
|
|
637
|
+
}
|
|
638
|
+
catch (err) {
|
|
639
|
+
rethrowWriteError(err);
|
|
640
|
+
}
|
|
641
|
+
return refToId;
|
|
642
|
+
}
|
|
522
643
|
getDebounceStartAfter(singletonSeconds, clockOffset) {
|
|
523
644
|
const debounceInterval = singletonSeconds * 1000;
|
|
524
645
|
const now = Date.now() + clockOffset;
|
|
@@ -791,6 +912,20 @@ class Manager extends EventEmitter {
|
|
|
791
912
|
const result = await db.executeSql(sql, values);
|
|
792
913
|
return result?.rows || [];
|
|
793
914
|
}
|
|
915
|
+
async getDependencies(name, id, options = {}) {
|
|
916
|
+
Attorney.assertQueueName(name);
|
|
917
|
+
const db = this.assertDb(options);
|
|
918
|
+
const sql = plans.getDependencies(this.config.schema);
|
|
919
|
+
const { rows } = await db.executeSql(sql, [name, id]);
|
|
920
|
+
return rows.map((r) => ({ name: r.parentName, id: r.parentId }));
|
|
921
|
+
}
|
|
922
|
+
async getDependents(name, id, options = {}) {
|
|
923
|
+
Attorney.assertQueueName(name);
|
|
924
|
+
const db = this.assertDb(options);
|
|
925
|
+
const sql = plans.getDependents(this.config.schema);
|
|
926
|
+
const { rows } = await db.executeSql(sql, [name, id]);
|
|
927
|
+
return rows.map((r) => ({ name: r.childName, id: r.childId }));
|
|
928
|
+
}
|
|
794
929
|
assertDb(options) {
|
|
795
930
|
if (options.db) {
|
|
796
931
|
return options.db;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrationStore.d.ts","sourceRoot":"","sources":["../src/migrationStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AASnC,iBAAS,QAAQ,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,UAQjF;AAED,iBAAS,IAAI,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,SAAS,UAQxF;AAED,iBAAS,OAAO,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,UAuBhF;AAED,iBAAS,MAAM,CAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"migrationStore.d.ts","sourceRoot":"","sources":["../src/migrationStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AASnC,iBAAS,QAAQ,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,UAQjF;AAED,iBAAS,IAAI,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,SAAS,UAQxF;AAED,iBAAS,OAAO,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,UAuBhF;AAED,iBAAS,MAAM,CAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAq8BlD;AAED,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,MAAM,GACP,CAAA"}
|