pg-boss 12.18.3 → 12.19.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/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 +32 -17
- package/dist/manager.d.ts +3 -0
- package/dist/manager.d.ts.map +1 -1
- package/dist/manager.js +123 -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 +2 -2
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, DatabaseOptions, FetchGroupConcurrencyOptions, FetchOptions, FindJobsOptions, 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';
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -75,24 +75,30 @@ export class PgBoss extends EventEmitter {
|
|
|
75
75
|
return this;
|
|
76
76
|
}
|
|
77
77
|
this.#starting = true;
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
78
|
+
try {
|
|
79
|
+
if (this.#db._pgbdb && !this.#db.opened) {
|
|
80
|
+
await this.#db.open();
|
|
81
|
+
}
|
|
82
|
+
if (this.#config.migrate) {
|
|
83
|
+
await this.#contractor.start();
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
await this.#contractor.check();
|
|
87
|
+
}
|
|
88
|
+
await this.#manager.start();
|
|
89
|
+
if (this.#config.supervise) {
|
|
90
|
+
await this.#boss.start();
|
|
91
|
+
}
|
|
92
|
+
if (this.#config.schedule) {
|
|
93
|
+
await this.#timekeeper.start();
|
|
94
|
+
}
|
|
95
|
+
if (this.#config.migrate) {
|
|
96
|
+
await this.#bam.start();
|
|
97
|
+
}
|
|
93
98
|
}
|
|
94
|
-
|
|
95
|
-
|
|
99
|
+
catch (err) {
|
|
100
|
+
this.#starting = false;
|
|
101
|
+
throw err;
|
|
96
102
|
}
|
|
97
103
|
this.#starting = false;
|
|
98
104
|
this.#started = true;
|
|
@@ -145,6 +151,9 @@ export class PgBoss extends EventEmitter {
|
|
|
145
151
|
insert(name, jobs, options) {
|
|
146
152
|
return this.#manager.insert(name, jobs, options);
|
|
147
153
|
}
|
|
154
|
+
flow(jobs, options) {
|
|
155
|
+
return this.#manager.flow(jobs, options);
|
|
156
|
+
}
|
|
148
157
|
fetch(name, options = {}) {
|
|
149
158
|
return this.#manager.fetch(name, options);
|
|
150
159
|
}
|
|
@@ -211,6 +220,12 @@ export class PgBoss extends EventEmitter {
|
|
|
211
220
|
getBlockedKeys(name) {
|
|
212
221
|
return this.#manager.getBlockedKeys(name);
|
|
213
222
|
}
|
|
223
|
+
getDependencies(name, id, options) {
|
|
224
|
+
return this.#manager.getDependencies(name, id, options);
|
|
225
|
+
}
|
|
226
|
+
getDependents(name, id, options) {
|
|
227
|
+
return this.#manager.getDependents(name, id, options);
|
|
228
|
+
}
|
|
214
229
|
updateQueue(name, options) {
|
|
215
230
|
return this.#manager.updateQueue(name, options);
|
|
216
231
|
}
|
package/dist/manager.d.ts
CHANGED
|
@@ -57,6 +57,7 @@ declare class Manager extends EventEmitter implements types.EventsMixin {
|
|
|
57
57
|
sendDebounced(name: string, data: object | null, options: types.SendOptions | null, seconds: number, key?: string): Promise<string | null>;
|
|
58
58
|
createJob(request: types.Request): Promise<string | null>;
|
|
59
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>>;
|
|
60
61
|
getDebounceStartAfter(singletonSeconds: number, clockOffset: number): number;
|
|
61
62
|
fetch<T>(name: string): Promise<types.Job<T>[]>;
|
|
62
63
|
fetch<T>(name: string, options: types.FetchOptions & {
|
|
@@ -88,6 +89,8 @@ declare class Manager extends EventEmitter implements types.EventsMixin {
|
|
|
88
89
|
getQueueStats(name: string): Promise<any>;
|
|
89
90
|
getJobById<T>(name: string, id: string, options?: types.ConnectionOptions): Promise<types.JobWithMetadata<T> | null>;
|
|
90
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[]>;
|
|
91
94
|
private assertDb;
|
|
92
95
|
}
|
|
93
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":"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;AAqBvD,cAAM,OAAQ,SAAQ,YAAa,YAAW,KAAK,CAAC,WAAW;;IAC7D,MAAM;;;MAAS;IACf,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG;QAAE,MAAM,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC,GAAG,EAAE,CAAA;IAC/C,MAAM,EAAE,KAAK,CAAC,0BAA0B,CAAA;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,OAAO,EAAE,OAAO,GAAG,SAAS,CAAA;IAC5B,kBAAkB,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAA;IAC9C,WAAW,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAA;IACvC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAA;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,IAAI,CAAA;IAChD,sBAAsB,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;gBAM5B,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,0BAA0B;IAe1E,MAAM,CAAC,CAAC,GAAG,MAAM,EAAG,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;IAYrD,UAAU,IAAK,IAAI;IAmMb,KAAK;IAkBL,aAAa,CAAE,EAAE,IAAY,EAAE;;KAAK;IAUpC,aAAa,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;IAoBxD,IAAI;IAkBJ,OAAO;IAUb,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACjF,IAAI,CAAC,OAAO,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,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACrJ,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAwF7G,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,OAAO;IAWf,UAAU,CAAE,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO;IAUvD,kBAAkB,IAAK,OAAO;IAIxB,OAAO,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,cAA+B,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B3F,YAAY,CAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI/B,SAAS,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtD,WAAW,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9D,OAAO,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IASlF,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,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAO/F,SAAS,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASvI,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;IAW3I,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;IAW3I,SAAS,CAAE,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA2F1D,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,EACvB,OAAO,GAAE,KAAK,CAAC,aAAkB;IAgD7B,IAAI,CAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IA+G1G,qBAAqB,CAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAiBpE,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,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,EAAE,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IA+B5E,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,kBAAkB;IAQpB,QAAQ,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,GAAE,KAAK,CAAC,eAAoB;IAUxG,IAAI,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB;IAU5F,SAAS,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB;IAUrF,MAAM,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB;IAUlF,MAAM,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB;IAUlF,OAAO,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB;IASnF,KAAK,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB;IAUjF,KAAK,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;IAUlH,WAAW,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO;IAqBtF,cAAc,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAehD,SAAS,CAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAanE,WAAW,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,kBAAuB;IA0BjE,QAAQ,CAAE,IAAI,EAAE,MAAM;IAStB,WAAW,CAAE,IAAI,EAAE,MAAM;IAUzB,gBAAgB,CAAE,IAAI,EAAE,MAAM;IAO9B,gBAAgB,CAAE,IAAI,EAAE,MAAM;IAO9B,aAAa,CAAE,IAAI,CAAC,EAAE,MAAM;IAmB5B,aAAa,CAAE,IAAI,EAAE,MAAM;IAmB3B,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAkBxH,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,eAAoB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IA0BnG,eAAe,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAQjH,aAAa,CAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,KAAK,CAAC,iBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAQrH,OAAO,CAAC,QAAQ;CAWjB;AAED,eAAe,OAAO,CAAA"}
|
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;
|
|
@@ -516,12 +526,16 @@ class Manager extends EventEmitter {
|
|
|
516
526
|
}
|
|
517
527
|
}
|
|
518
528
|
}
|
|
529
|
+
const insertPayload = jobs.map(j => {
|
|
530
|
+
const { blocked, blocking, pendingDependencies, ...rest } = j;
|
|
531
|
+
return rest;
|
|
532
|
+
});
|
|
519
533
|
const db = this.assertDb(options);
|
|
520
534
|
const spy = this.config.__test__enableSpies ? this.#spies.get(name) : undefined;
|
|
521
535
|
// Return IDs if spy is active for this queue (needed for job tracking)
|
|
522
536
|
const returnId = !!spy || !!options.returnId;
|
|
523
537
|
const sql = plans.insertJobs(this.config.schema, { table, name, returnId });
|
|
524
|
-
const { rows } = await db.executeSql(sql, [JSON.stringify(
|
|
538
|
+
const { rows } = await db.executeSql(sql, [JSON.stringify(insertPayload)]);
|
|
525
539
|
if (rows.length) {
|
|
526
540
|
if (spy) {
|
|
527
541
|
for (let i = 0; i < rows.length; i++) {
|
|
@@ -532,6 +546,100 @@ class Manager extends EventEmitter {
|
|
|
532
546
|
}
|
|
533
547
|
return null;
|
|
534
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
|
+
}
|
|
535
643
|
getDebounceStartAfter(singletonSeconds, clockOffset) {
|
|
536
644
|
const debounceInterval = singletonSeconds * 1000;
|
|
537
645
|
const now = Date.now() + clockOffset;
|
|
@@ -804,6 +912,20 @@ class Manager extends EventEmitter {
|
|
|
804
912
|
const result = await db.executeSql(sql, values);
|
|
805
913
|
return result?.rows || [];
|
|
806
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
|
+
}
|
|
807
929
|
assertDb(options) {
|
|
808
930
|
if (options.db) {
|
|
809
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"}
|