prostgles-server 4.2.689 → 4.2.691
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/Audit/AuditTable.d.ts +1 -31
- package/dist/Audit/AuditTable.d.ts.map +1 -1
- package/dist/Audit/AuditTable.js +4 -26
- package/dist/Audit/AuditTable.js.map +1 -1
- package/dist/Auth/AuthHandler.d.ts +2 -0
- package/dist/Auth/AuthHandler.d.ts.map +1 -1
- package/dist/Auth/AuthHandler.js +17 -4
- package/dist/Auth/AuthHandler.js.map +1 -1
- package/dist/Auth/AuthTypes.d.ts +10 -8
- package/dist/Auth/AuthTypes.d.ts.map +1 -1
- package/dist/Auth/AuthTypes.js.map +1 -1
- package/dist/Auth/endpoints/setOAuthRequestHandlers.js +1 -1
- package/dist/Auth/endpoints/setOAuthRequestHandlers.js.map +1 -1
- package/dist/Auth/endpoints/setRegisterRequestHandler.d.ts +1 -1
- package/dist/Auth/endpoints/setRegisterRequestHandler.d.ts.map +1 -1
- package/dist/Auth/endpoints/setRegisterRequestHandler.js +20 -6
- package/dist/Auth/endpoints/setRegisterRequestHandler.js.map +1 -1
- package/dist/Auth/getClientAuth.d.ts +1 -1
- package/dist/Auth/getClientAuth.d.ts.map +1 -1
- package/dist/Auth/getClientAuth.js +18 -8
- package/dist/Auth/getClientAuth.js.map +1 -1
- package/dist/Auth/setupAuthRoutes.d.ts.map +1 -1
- package/dist/Auth/setupAuthRoutes.js +5 -0
- package/dist/Auth/setupAuthRoutes.js.map +1 -1
- package/dist/Auth/utils/upsertNamedExpressMiddleware.d.ts +2 -2
- package/dist/Auth/utils/upsertNamedExpressMiddleware.d.ts.map +1 -1
- package/dist/Auth/utils/upsertNamedExpressMiddleware.js +2 -2
- package/dist/Auth/utils/upsertNamedExpressMiddleware.js.map +1 -1
- package/dist/Jobs/JobManager.d.ts +2 -0
- package/dist/Jobs/JobManager.d.ts.map +1 -1
- package/dist/Jobs/JobManager.js +11 -0
- package/dist/Jobs/JobManager.js.map +1 -1
- package/dist/Jobs/JobTypes.d.ts +37 -33
- package/dist/Jobs/JobTypes.d.ts.map +1 -1
- package/dist/Jobs/JobTypes.js.map +1 -1
- package/dist/Jobs/claimJob.d.ts +4 -4
- package/dist/Jobs/enqueueJob.d.ts +1 -0
- package/dist/Jobs/enqueueJob.d.ts.map +1 -1
- package/dist/Jobs/enqueueJob.js.map +1 -1
- package/dist/Jobs/enqueueSchedules.d.ts.map +1 -1
- package/dist/Jobs/enqueueSchedules.js +15 -6
- package/dist/Jobs/enqueueSchedules.js.map +1 -1
- package/dist/Jobs/getJobRetention.d.ts +10 -0
- package/dist/Jobs/getJobRetention.d.ts.map +1 -0
- package/dist/Jobs/getJobRetention.js +65 -0
- package/dist/Jobs/getJobRetention.js.map +1 -0
- package/dist/Jobs/jobTableConfig.d.ts +19 -15
- package/dist/Jobs/jobTableConfig.d.ts.map +1 -1
- package/dist/Jobs/jobTableConfig.js +6 -54
- package/dist/Jobs/jobTableConfig.js.map +1 -1
- package/dist/Jobs/pruneJobs.d.ts +4 -0
- package/dist/Jobs/pruneJobs.d.ts.map +1 -0
- package/dist/Jobs/pruneJobs.js +49 -0
- package/dist/Jobs/pruneJobs.js.map +1 -0
- package/dist/Jobs/runJob.d.ts.map +1 -1
- package/dist/Jobs/runJob.js +7 -3
- package/dist/Jobs/runJob.js.map +1 -1
- package/dist/StorageClient/fileTableDefinitions.d.ts +4 -55
- package/dist/StorageClient/fileTableDefinitions.d.ts.map +1 -1
- package/dist/StorageClient/fileTableDefinitions.js +4 -35
- package/dist/StorageClient/fileTableDefinitions.js.map +1 -1
- package/dist/TableConfig/TableConfigTypes.d.ts +2 -11
- package/dist/TableConfig/TableConfigTypes.d.ts.map +1 -1
- package/dist/TableConfig/TableRowFromColumnDefinitions.d.ts +4 -69
- package/dist/TableConfig/TableRowFromColumnDefinitions.d.ts.map +1 -1
- package/dist/TableConfig/initTableConfig.d.ts.map +1 -1
- package/dist/TableConfig/initTableConfig.js +10 -1
- package/dist/TableConfig/initTableConfig.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/Jobs/JobManager.js
CHANGED
|
@@ -9,6 +9,8 @@ const claimJob_1 = require("./claimJob");
|
|
|
9
9
|
const enqueueSchedules_1 = require("./enqueueSchedules");
|
|
10
10
|
const getJobDefinition_1 = require("./getJobDefinition");
|
|
11
11
|
const getJobControlBinding_1 = require("./getJobControlBinding");
|
|
12
|
+
const getJobRetention_1 = require("./getJobRetention");
|
|
13
|
+
const pruneJobs_1 = require("./pruneJobs");
|
|
12
14
|
class JobManager {
|
|
13
15
|
prostgles;
|
|
14
16
|
constructor(prostgles) {
|
|
@@ -29,6 +31,8 @@ class JobManager {
|
|
|
29
31
|
ticking;
|
|
30
32
|
running = new Map();
|
|
31
33
|
schedules = new Map();
|
|
34
|
+
retention = [];
|
|
35
|
+
nextRetentionCleanup = 0;
|
|
32
36
|
api;
|
|
33
37
|
validate = async () => {
|
|
34
38
|
await (0, getJobDefinition_1.validateJobDefinitions)(this.prostgles, this.prostgles.dboBuilder.tables);
|
|
@@ -36,6 +40,8 @@ class JobManager {
|
|
|
36
40
|
for (const method of Object.values(group.functions))
|
|
37
41
|
(0, getJobControlBinding_1.getJobControlBinding)(this.prostgles, method);
|
|
38
42
|
}
|
|
43
|
+
this.retention = await (0, getJobRetention_1.getJobRetention)(this.prostgles);
|
|
44
|
+
this.nextRetentionCleanup = 0;
|
|
39
45
|
};
|
|
40
46
|
start = () => {
|
|
41
47
|
if (!this.stopped || !this.prostgles.opts.jobs)
|
|
@@ -52,6 +58,7 @@ class JobManager {
|
|
|
52
58
|
await this.ticking;
|
|
53
59
|
await Promise.all(this.running.values());
|
|
54
60
|
this.schedules.clear();
|
|
61
|
+
this.nextRetentionCleanup = 0;
|
|
55
62
|
};
|
|
56
63
|
schedule = () => {
|
|
57
64
|
if (this.stopped)
|
|
@@ -91,6 +98,10 @@ class JobManager {
|
|
|
91
98
|
this.running.set(controller, work);
|
|
92
99
|
}
|
|
93
100
|
}
|
|
101
|
+
if (this.retention.length && Date.now() >= this.nextRetentionCleanup) {
|
|
102
|
+
this.nextRetentionCleanup = Date.now() + 60_000;
|
|
103
|
+
await (0, pruneJobs_1.pruneJobs)(prostgles, this.retention);
|
|
104
|
+
}
|
|
94
105
|
};
|
|
95
106
|
}
|
|
96
107
|
exports.JobManager = JobManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JobManager.js","sourceRoot":"","sources":["../../lib/Jobs/JobManager.ts"],"names":[],"mappings":";;;AAEA,mDAAgD;AAChD,qCAAkC;AAClC,yCAAsC;AACtC,6DAA0D;AAC1D,yCAAsC;AACtC,yDAAsD;AACtD,yDAA4D;AAC5D,iEAA8D;
|
|
1
|
+
{"version":3,"file":"JobManager.js","sourceRoot":"","sources":["../../lib/Jobs/JobManager.ts"],"names":[],"mappings":"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"}
|
package/dist/Jobs/JobTypes.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type pgPromise from "pg-promise";
|
|
2
|
-
import type { AnyObject, DBSchema, FullFilter, JobControlOperation, JobStatus, JSONB, MaybePromise } from "prostgles-types";
|
|
3
|
-
export type { JobStatus, JobControlOperation, JobControlFunctionMetadata, JobControlBinding, } from "prostgles-types";
|
|
2
|
+
import type { AnyObject, DBSchema, FullFilter, JobControlOperation, JobStatus, JobRecord, JobValue, JSONB, MaybePromise } from "prostgles-types";
|
|
3
|
+
export type { JobRecord, JobInsertRecord, JobValue, JobStatus, JobControlOperation, JobControlFunctionMetadata, JobControlBinding, } from "prostgles-types";
|
|
4
4
|
import type { SessionUser } from "../Auth/AuthTypes";
|
|
5
5
|
import type { DBHandlerServer, DBTableHandlersFromSchema } from "../DBSchemaBuilder/DBSchemaBuilder";
|
|
6
6
|
import type { DbTxTableHandlers } from "../DboBuilder/DboBuilderTypes";
|
|
7
7
|
import type { JSONBColumnDef } from "../TableConfig/TableConfigTypes";
|
|
8
|
-
import type { TableInsertRowFromTableConfig, TableRowFromTableConfig } from "../TableConfig/TableRowFromColumnDefinitions";
|
|
9
|
-
import type { jobTableConfig } from "./jobTableConfig";
|
|
10
8
|
export type ParamsSchema = Record<string, JSONBColumnDef & ({
|
|
11
9
|
optional: true;
|
|
12
10
|
} | {
|
|
@@ -42,6 +40,12 @@ export type ScheduleTrigger = {
|
|
|
42
40
|
cron: string;
|
|
43
41
|
timezone?: string;
|
|
44
42
|
};
|
|
43
|
+
export type JobRetention = "forever" | Partial<Record<Extract<JobStatus, "succeeded" | "failed" | "cancelled">, string | {
|
|
44
|
+
/** Positive milliseconds or a PostgreSQL interval, measured from finished_at. */
|
|
45
|
+
maxAge?: number | string;
|
|
46
|
+
/** Keep the newest runs of this status. Zero removes all eligible runs. */
|
|
47
|
+
maxCount?: number;
|
|
48
|
+
}>>;
|
|
45
49
|
export type JobContext<S, T extends JobTableName<S> | undefined, P extends ParamsSchema, Context = undefined> = {
|
|
46
50
|
/** Re-fetched at the start of each attempt. Undefined for schedules. */
|
|
47
51
|
row: T extends string ? Required<JobRow<S, T>> : undefined;
|
|
@@ -64,23 +68,17 @@ export type JobContext<S, T extends JobTableName<S> | undefined, P extends Param
|
|
|
64
68
|
};
|
|
65
69
|
fail: (reason: string) => never;
|
|
66
70
|
};
|
|
67
|
-
export type JobDefinition<S = void, T extends JobTableName<S> | undefined = JobTableName<S> | undefined, P extends ParamsSchema = ParamsSchema, Context = undefined> = {
|
|
68
|
-
trigger:
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
/** Conflicts use the job name and row primary key, or just the name for schedules. */
|
|
79
|
-
onConflict?: "queue" | "replace" | "skip";
|
|
80
|
-
/** Maximum parallel runs across workers. Defaults to 1. Same-key runs are serialized. */
|
|
81
|
-
concurrency?: number;
|
|
82
|
-
run: (ctx: JobContext<S, T, P, Context>) => Promise<void>;
|
|
83
|
-
};
|
|
71
|
+
export type JobDefinition<S = void, T extends JobTableName<S> | undefined = JobTableName<S> | undefined, P extends ParamsSchema = ParamsSchema, Context = undefined> = JobDefinitionOptions<S, T, P, Context> & (T extends JobTableName<S> ? {
|
|
72
|
+
trigger: RowTrigger<S, T>;
|
|
73
|
+
retention?: never;
|
|
74
|
+
} : {
|
|
75
|
+
trigger: ScheduleTrigger;
|
|
76
|
+
/** Required for schedules. "forever" keeps all history.
|
|
77
|
+
* Per-status strings shorthand maxAge; "forever" or omitted statuses keep their history.
|
|
78
|
+
* Cleanup runs periodically and preserves the current scheduling minute for deduplication.
|
|
79
|
+
*/
|
|
80
|
+
retention: JobRetention;
|
|
81
|
+
});
|
|
84
82
|
export type JobsConfig<S = void, Context = undefined> = Record<string, ({
|
|
85
83
|
[T in JobTableName<S>]: Omit<JobDefinition<S, T, any, Context>, "params">;
|
|
86
84
|
}[JobTableName<S>] | Omit<JobDefinition<S, undefined, any, Context>, "params">) & {
|
|
@@ -94,22 +92,12 @@ export type JobsOptions<S = void, Context = undefined> = {
|
|
|
94
92
|
/** Infers a job's params and row while sharing the application's schema/context. */
|
|
95
93
|
export declare const createJobDefiner: <S = void, Context = undefined>() => DefineJob<S, Context>;
|
|
96
94
|
type DefineJob<S, Context> = {
|
|
97
|
-
<T extends JobTableName<S>, const P extends ParamsSchema = {}>(definition:
|
|
95
|
+
<T extends JobTableName<S>, const P extends ParamsSchema = {}>(definition: JobDefinitionOptions<S, T, P, Context> & {
|
|
98
96
|
trigger: RowTrigger<S, T>;
|
|
97
|
+
retention?: never;
|
|
99
98
|
}): JobDefinition<S, T, P, Context>;
|
|
100
99
|
<const P extends ParamsSchema = {}>(definition: JobDefinition<S, undefined, P, Context>): JobDefinition<S, undefined, P, Context>;
|
|
101
100
|
};
|
|
102
|
-
export type JobValue = null | string | number | boolean | readonly JobValue[] | {
|
|
103
|
-
readonly [key: string]: JobValue;
|
|
104
|
-
};
|
|
105
|
-
type JobValues = {
|
|
106
|
-
target_row_pkey: Record<string, JobValue>;
|
|
107
|
-
params: Record<string, JobValue>;
|
|
108
|
-
checkpoint: JobValue | null;
|
|
109
|
-
error: JobValue;
|
|
110
|
-
};
|
|
111
|
-
export type JobRecord = TableRowFromTableConfig<typeof jobTableConfig, JobValues>;
|
|
112
|
-
export type JobInsertRecord = TableInsertRowFromTableConfig<typeof jobTableConfig, JobValues>;
|
|
113
101
|
export declare const jobControlStatuses: Record<JobControlOperation, readonly JobStatus[]>;
|
|
114
102
|
export type JobControlOptions<S = void, Row extends AnyObject = AnyObject> = {
|
|
115
103
|
row: AnyObject;
|
|
@@ -144,6 +132,22 @@ export type JobTransaction = {
|
|
|
144
132
|
dbx: DbTxTableHandlers;
|
|
145
133
|
};
|
|
146
134
|
export type RuntimeJobDefinition = JobDefinition<void, string | undefined, ParamsSchema, unknown>;
|
|
135
|
+
type JobDefinitionOptions<S, T extends JobTableName<S> | undefined, P extends ParamsSchema, Context> = {
|
|
136
|
+
params?: P;
|
|
137
|
+
/** Defaults to system. User jobs enforce the triggering/rerunning user's publish rules. */
|
|
138
|
+
runAs?: "system" | "user";
|
|
139
|
+
retry?: {
|
|
140
|
+
maxAttempts: number;
|
|
141
|
+
backoff?: "exponential" | "fixed";
|
|
142
|
+
delayMs?: number;
|
|
143
|
+
};
|
|
144
|
+
timeoutMs?: number;
|
|
145
|
+
/** Conflicts use the job name and row primary key, or just the name for schedules. */
|
|
146
|
+
onConflict?: "queue" | "replace" | "skip";
|
|
147
|
+
/** Maximum parallel runs across workers. Defaults to 1. Same-key runs are serialized. */
|
|
148
|
+
concurrency?: number;
|
|
149
|
+
run: (ctx: JobContext<S, T, P, Context>) => Promise<void>;
|
|
150
|
+
};
|
|
147
151
|
type JobTableName<S> = S extends DBSchema ? keyof S & string : string;
|
|
148
152
|
type JobRow<S, T extends string> = S extends Record<T, {
|
|
149
153
|
columns: infer R extends AnyObject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JobTypes.d.ts","sourceRoot":"","sources":["../../lib/Jobs/JobTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,SAAS,EACT,KAAK,EACL,YAAY,EACb,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,SAAS,EACT,mBAAmB,EACnB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EACV,eAAe,EACf,yBAAyB,EAC1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"JobTypes.d.ts","sourceRoot":"","sources":["../../lib/Jobs/JobTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JobTypes.js","sourceRoot":"","sources":["../../lib/Jobs/JobTypes.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"JobTypes.js","sourceRoot":"","sources":["../../lib/Jobs/JobTypes.ts"],"names":[],"mappings":";;;AAuHA,oFAAoF;AAC7E,MAAM,gBAAgB,GAAG,GAAkC,EAAE,CAClE,CAAC,CAAC,UAAmB,EAAE,EAAE,CAAC,UAAU,CAA0B,CAAC;AADpD,QAAA,gBAAgB,oBACoC;AAcpD,QAAA,kBAAkB,GAAsD;IACnF,YAAY,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;IACrC,KAAK,EAAE,CAAC,WAAW,CAAC;IACpB,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B,CAAC"}
|
package/dist/Jobs/claimJob.d.ts
CHANGED
|
@@ -3,8 +3,8 @@ export declare const claimJob: (prostgles: Prostgles, name: string, concurrency:
|
|
|
3
3
|
readonly id: string;
|
|
4
4
|
readonly job_name: string;
|
|
5
5
|
readonly target_table: string | null;
|
|
6
|
-
readonly target_row_pkey: Record<string, import("
|
|
7
|
-
readonly params: Record<string, import("
|
|
6
|
+
readonly target_row_pkey: Record<string, import("prostgles-types/dist/jobTable").JobValue>;
|
|
7
|
+
readonly params: Record<string, import("prostgles-types/dist/jobTable").JobValue>;
|
|
8
8
|
readonly user_id: string | null;
|
|
9
9
|
readonly occurrence: string | null;
|
|
10
10
|
readonly reason: "trigger" | "rerun";
|
|
@@ -14,14 +14,14 @@ export declare const claimJob: (prostgles: Prostgles, name: string, concurrency:
|
|
|
14
14
|
readonly delay_ms: number;
|
|
15
15
|
readonly backoff: "fixed" | "exponential";
|
|
16
16
|
readonly cancel_requested: boolean;
|
|
17
|
-
readonly checkpoint: import("
|
|
17
|
+
readonly checkpoint: import("prostgles-types/dist/jobTable").JobValue;
|
|
18
18
|
readonly has_checkpoint: boolean;
|
|
19
19
|
readonly progress_message: string | null;
|
|
20
20
|
readonly progress_numeric: import("prostgles-types").JSONB.GetObjectType<{
|
|
21
21
|
readonly done: "number";
|
|
22
22
|
readonly total: "number";
|
|
23
23
|
}> | null;
|
|
24
|
-
readonly error: import("
|
|
24
|
+
readonly error: import("prostgles-types/dist/jobTable").JobValue;
|
|
25
25
|
readonly run_at: string;
|
|
26
26
|
readonly lease_token: string;
|
|
27
27
|
readonly locked_until: string;
|
|
@@ -5,6 +5,7 @@ export declare const enqueueJob: (prostgles: Prostgles, transaction: JobTransact
|
|
|
5
5
|
userId?: string;
|
|
6
6
|
params?: Record<string, unknown>;
|
|
7
7
|
reason?: "trigger" | "rerun";
|
|
8
|
+
/** Cron slot timestamp for deduplication; omitted for row-triggered jobs and manual reruns. */
|
|
8
9
|
occurrence?: Date;
|
|
9
10
|
}) => Promise<{
|
|
10
11
|
jobId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enqueueJob.d.ts","sourceRoot":"","sources":["../../lib/Jobs/enqueueJob.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI5D,2FAA2F;AAC3F,eAAO,MAAM,UAAU,GACrB,WAAW,SAAS,EACpB,aAAa,cAAc,EAC3B,MAAM,MAAM,EACZ,eAAe,SAAS,CAAC,iBAAiB,CAAC,EAC3C,UAAS;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,IAAI,CAAC;CACd;;;EAuFP,CAAC"}
|
|
1
|
+
{"version":3,"file":"enqueueJob.d.ts","sourceRoot":"","sources":["../../lib/Jobs/enqueueJob.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI5D,2FAA2F;AAC3F,eAAO,MAAM,UAAU,GACrB,WAAW,SAAS,EACpB,aAAa,cAAc,EAC3B,MAAM,MAAM,EACZ,eAAe,SAAS,CAAC,iBAAiB,CAAC,EAC3C,UAAS;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC7B,+FAA+F;IAC/F,UAAU,CAAC,EAAE,IAAI,CAAC;CACd;;;EAuFP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enqueueJob.js","sourceRoot":"","sources":["../../lib/Jobs/enqueueJob.ts"],"names":[],"mappings":";;;AAAA,qDAAkD;AAClD,6CAAyC;AAEzC,yDAAsD;AAEtD,6DAA0D;AAC1D,iDAA8C;AAE9C,2FAA2F;AACpF,MAAM,UAAU,GAAG,KAAK,EAC7B,SAAoB,EACpB,WAA2B,EAC3B,IAAY,EACZ,aAA2C,EAC3C,
|
|
1
|
+
{"version":3,"file":"enqueueJob.js","sourceRoot":"","sources":["../../lib/Jobs/enqueueJob.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enqueueSchedules.d.ts","sourceRoot":"","sources":["../../lib/Jobs/enqueueSchedules.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"enqueueSchedules.d.ts","sourceRoot":"","sources":["../../lib/Jobs/enqueueSchedules.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,gGAAgG;AAChG,eAAO,MAAM,gBAAgB,GAAU,WAAW,SAAS,EAAE,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,kBAoB1F,CAAC"}
|
|
@@ -1,21 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.enqueueSchedules = void 0;
|
|
4
|
+
const prostgles_types_1 = require("prostgles-types");
|
|
4
5
|
const enqueueJob_1 = require("./enqueueJob");
|
|
5
6
|
const cronSchedule_1 = require("./cronSchedule");
|
|
6
7
|
const jobUtils_1 = require("./jobUtils");
|
|
7
8
|
/** Deduplicate scheduled occurrences in PostgreSQL, including across instances and restarts. */
|
|
8
9
|
const enqueueSchedules = async (prostgles, schedules) => {
|
|
9
|
-
const { now } = await prostgles.db.one("SELECT clock_timestamp() AS now");
|
|
10
10
|
for (const [name, { trigger }] of Object.entries(prostgles.opts.jobs?.definitions ?? {})) {
|
|
11
11
|
if (trigger.type !== "schedule")
|
|
12
12
|
continue;
|
|
13
13
|
try {
|
|
14
|
-
const occurrence =
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
const occurrence = await prostgles.dboBuilder.getTX(async (dbx, t) => {
|
|
15
|
+
/* Protect deduplication rows from selection through enqueue, including lock waits. */
|
|
16
|
+
await t.one("SELECT pg_advisory_xact_lock_shared(hashtextextended(${lockKey}, 0))", {
|
|
17
|
+
lockKey: (0, prostgles_types_1.stableStringify)([prostgles.jobs.tableSQL, name, "schedule"]),
|
|
18
|
+
});
|
|
19
|
+
const { now } = await t.one("SELECT clock_timestamp() AS now");
|
|
20
|
+
const occurrence = (0, cronSchedule_1.parseCronSchedule)(trigger)(new Date(now));
|
|
21
|
+
if (!occurrence || schedules.get(name) === occurrence.toISOString())
|
|
22
|
+
return;
|
|
23
|
+
await (0, enqueueJob_1.enqueueJob)(prostgles, { dbx, t }, name, {}, { occurrence });
|
|
24
|
+
return occurrence.toISOString();
|
|
25
|
+
});
|
|
26
|
+
if (occurrence)
|
|
27
|
+
schedules.set(name, occurrence);
|
|
19
28
|
}
|
|
20
29
|
catch (error) {
|
|
21
30
|
console.error(`Job schedule ${name} failed`, (0, jobUtils_1.jobError)(error));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enqueueSchedules.js","sourceRoot":"","sources":["../../lib/Jobs/enqueueSchedules.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"enqueueSchedules.js","sourceRoot":"","sources":["../../lib/Jobs/enqueueSchedules.ts"],"names":[],"mappings":";;;AAAA,qDAAkD;AAElD,6CAA0C;AAC1C,iDAAmD;AACnD,yCAAsC;AAEtC,gGAAgG;AACzF,MAAM,gBAAgB,GAAG,KAAK,EAAE,SAAoB,EAAE,SAA8B,EAAE,EAAE;IAC7F,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC;QACzF,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QAC1C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;gBACnE,sFAAsF;gBACtF,MAAM,CAAC,CAAC,GAAG,CAAC,sEAAsE,EAAE;oBAClF,OAAO,EAAE,IAAA,iCAAe,EAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;iBACtE,CAAC,CAAC;gBACH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAkB,iCAAiC,CAAC,CAAC;gBAChF,MAAM,UAAU,GAAG,IAAA,gCAAiB,EAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7D,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,WAAW,EAAE;oBAAE,OAAO;gBAC5E,MAAM,IAAA,uBAAU,EAAC,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;gBAClE,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC;YAClC,CAAC,CAAC,CAAC;YACH,IAAI,UAAU;gBAAE,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,IAAI,SAAS,EAAE,IAAA,mBAAQ,EAAC,KAAK,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AApBW,QAAA,gBAAgB,oBAoB3B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Prostgles } from "../Prostgles";
|
|
2
|
+
import type { JobRetention } from "./JobTypes";
|
|
3
|
+
export declare const getJobRetention: (prostgles: Prostgles) => Promise<JobRetentionPolicy[]>;
|
|
4
|
+
export type JobRetentionPolicy = {
|
|
5
|
+
jobName: string;
|
|
6
|
+
status: keyof Exclude<JobRetention, "forever">;
|
|
7
|
+
maxAge: string | null;
|
|
8
|
+
maxCount: number | null;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=getJobRetention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getJobRetention.d.ts","sourceRoot":"","sources":["../../lib/Jobs/getJobRetention.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,eAAO,MAAM,eAAe,GAAU,WAAW,SAAS,kCAiEzD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getJobRetention = void 0;
|
|
4
|
+
const prostgles_types_1 = require("prostgles-types");
|
|
5
|
+
const getJobRetention = async (prostgles) => {
|
|
6
|
+
const policies = [];
|
|
7
|
+
for (const [jobName, definition] of Object.entries(prostgles.opts.jobs?.definitions ?? {})) {
|
|
8
|
+
const retention = definition.retention;
|
|
9
|
+
if (retention === undefined) {
|
|
10
|
+
if (definition.trigger.type === "schedule") {
|
|
11
|
+
throw new Error(`Invalid job retention for ${jobName}: required for scheduled jobs`);
|
|
12
|
+
}
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
if (definition.trigger.type !== "schedule" || (retention !== "forever" && !(0, prostgles_types_1.isObject)(retention))) {
|
|
16
|
+
throw new Error(`Invalid job retention for ${jobName}: expected a scheduled job's status policies or "forever"`);
|
|
17
|
+
}
|
|
18
|
+
if (retention === "forever")
|
|
19
|
+
continue;
|
|
20
|
+
for (const [status, value] of Object.entries(retention)) {
|
|
21
|
+
const errorMessage = `Invalid job retention for ${jobName}.${status}`;
|
|
22
|
+
if (status !== "succeeded" && status !== "failed" && status !== "cancelled") {
|
|
23
|
+
throw new Error(`${errorMessage}: expected succeeded, failed or cancelled`);
|
|
24
|
+
}
|
|
25
|
+
if (value === undefined || value === "forever")
|
|
26
|
+
continue;
|
|
27
|
+
if (typeof value !== "string" && !(0, prostgles_types_1.isObject)(value)) {
|
|
28
|
+
throw new Error(`${errorMessage}: expected an interval, forever, or maxAge/maxCount`);
|
|
29
|
+
}
|
|
30
|
+
const policy = typeof value === "string" ? { maxAge: value } : value;
|
|
31
|
+
if (Object.keys(policy).some((key) => key !== "maxAge" && key !== "maxCount") ||
|
|
32
|
+
(policy.maxAge === undefined && policy.maxCount === undefined)) {
|
|
33
|
+
throw new Error(`${errorMessage}: expected an interval, forever, or maxAge/maxCount`);
|
|
34
|
+
}
|
|
35
|
+
const { maxAge, maxCount } = policy;
|
|
36
|
+
if (maxCount !== undefined &&
|
|
37
|
+
(typeof maxCount !== "number" || !Number.isSafeInteger(maxCount) || maxCount < 0)) {
|
|
38
|
+
throw new Error(`${errorMessage}: maxCount must be a non-negative safe integer`);
|
|
39
|
+
}
|
|
40
|
+
let interval = null;
|
|
41
|
+
if (maxAge !== undefined) {
|
|
42
|
+
try {
|
|
43
|
+
if (typeof maxAge !== "string" &&
|
|
44
|
+
(typeof maxAge !== "number" || !Number.isFinite(maxAge) || maxAge <= 0)) {
|
|
45
|
+
throw new Error("Expected milliseconds or a PostgreSQL interval");
|
|
46
|
+
}
|
|
47
|
+
interval = typeof maxAge === "number" ? `${maxAge} milliseconds` : maxAge;
|
|
48
|
+
const { valid } = await prostgles.db.one(`SELECT isfinite(age) AND age > interval '0' AS valid
|
|
49
|
+
FROM (SELECT \${interval}::interval AS age) parsed`, { interval });
|
|
50
|
+
if (!valid)
|
|
51
|
+
throw new Error("Expected a positive finite interval");
|
|
52
|
+
}
|
|
53
|
+
catch (cause) {
|
|
54
|
+
throw new Error(`${errorMessage}: maxAge must be a positive finite PostgreSQL interval`, {
|
|
55
|
+
cause,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
policies.push({ jobName, status, maxAge: interval, maxCount: maxCount ?? null });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return policies;
|
|
63
|
+
};
|
|
64
|
+
exports.getJobRetention = getJobRetention;
|
|
65
|
+
//# sourceMappingURL=getJobRetention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getJobRetention.js","sourceRoot":"","sources":["../../lib/Jobs/getJobRetention.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,23 @@
|
|
|
1
1
|
export declare const jobTableConfig: {
|
|
2
|
+
readonly indexes: {
|
|
3
|
+
readonly occurrence: {
|
|
4
|
+
readonly unique: true;
|
|
5
|
+
readonly columns: "job_name, occurrence";
|
|
6
|
+
readonly where: "occurrence IS NOT NULL";
|
|
7
|
+
};
|
|
8
|
+
readonly pending: {
|
|
9
|
+
readonly columns: "job_name, run_at";
|
|
10
|
+
readonly where: "status = 'pending'";
|
|
11
|
+
};
|
|
12
|
+
readonly active: {
|
|
13
|
+
readonly columns: "job_name";
|
|
14
|
+
readonly where: "status IN ('pending', 'running')";
|
|
15
|
+
};
|
|
16
|
+
readonly retention: {
|
|
17
|
+
readonly columns: "job_name, status, finished_at, id";
|
|
18
|
+
readonly where: "target_table IS NULL AND status IN ('succeeded', 'failed', 'cancelled')";
|
|
19
|
+
};
|
|
20
|
+
};
|
|
2
21
|
readonly columns: {
|
|
3
22
|
readonly id: "UUID PRIMARY KEY";
|
|
4
23
|
readonly job_name: "TEXT NOT NULL";
|
|
@@ -127,20 +146,5 @@ export declare const jobTableConfig: {
|
|
|
127
146
|
};
|
|
128
147
|
}];
|
|
129
148
|
};
|
|
130
|
-
readonly indexes: {
|
|
131
|
-
readonly occurrence: {
|
|
132
|
-
readonly unique: true;
|
|
133
|
-
readonly columns: "job_name, occurrence";
|
|
134
|
-
readonly where: "occurrence IS NOT NULL";
|
|
135
|
-
};
|
|
136
|
-
readonly pending: {
|
|
137
|
-
readonly columns: "job_name, run_at";
|
|
138
|
-
readonly where: "status = 'pending'";
|
|
139
|
-
};
|
|
140
|
-
readonly active: {
|
|
141
|
-
readonly columns: "job_name";
|
|
142
|
-
readonly where: "status IN ('pending', 'running')";
|
|
143
|
-
};
|
|
144
|
-
};
|
|
145
149
|
};
|
|
146
150
|
//# sourceMappingURL=jobTableConfig.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobTableConfig.d.ts","sourceRoot":"","sources":["../../lib/Jobs/jobTableConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jobTableConfig.d.ts","sourceRoot":"","sources":["../../lib/Jobs/jobTableConfig.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWS,CAAC"}
|
|
@@ -1,65 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.jobTableConfig = void 0;
|
|
4
|
-
const
|
|
5
|
-
target_table: {},
|
|
6
|
-
user_id: {},
|
|
7
|
-
occurrence: {},
|
|
8
|
-
checkpoint: {},
|
|
9
|
-
progress_message: {},
|
|
10
|
-
progress_numeric: {},
|
|
11
|
-
backoff: { enum: ["fixed", "exponential"] },
|
|
12
|
-
reason: { enum: ["trigger", "rerun"] },
|
|
13
|
-
};
|
|
4
|
+
const prostgles_types_1 = require("prostgles-types");
|
|
14
5
|
exports.jobTableConfig = {
|
|
15
|
-
|
|
16
|
-
id: "UUID PRIMARY KEY",
|
|
17
|
-
job_name: "TEXT NOT NULL",
|
|
18
|
-
target_table: "TEXT",
|
|
19
|
-
target_row_pkey: "JSONB NOT NULL",
|
|
20
|
-
params: "JSONB NOT NULL",
|
|
21
|
-
user_id: "TEXT",
|
|
22
|
-
occurrence: "TIMESTAMPTZ",
|
|
23
|
-
reason: "TEXT NOT NULL DEFAULT 'trigger'",
|
|
24
|
-
status: "TEXT NOT NULL DEFAULT 'pending'",
|
|
25
|
-
attempts: "INTEGER NOT NULL DEFAULT 0",
|
|
26
|
-
max_attempts: "INTEGER NOT NULL",
|
|
27
|
-
delay_ms: "DOUBLE PRECISION NOT NULL",
|
|
28
|
-
backoff: "TEXT NOT NULL",
|
|
29
|
-
cancel_requested: "BOOLEAN NOT NULL DEFAULT FALSE",
|
|
30
|
-
checkpoint: "JSONB",
|
|
31
|
-
has_checkpoint: "BOOLEAN NOT NULL DEFAULT FALSE",
|
|
32
|
-
progress_message: "TEXT",
|
|
33
|
-
progress_numeric: {
|
|
34
|
-
nullable: true,
|
|
35
|
-
jsonbSchema: { type: { done: "number", total: "number" } },
|
|
36
|
-
},
|
|
37
|
-
error: "JSONB",
|
|
38
|
-
run_at: "TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()",
|
|
39
|
-
lease_token: "UUID",
|
|
40
|
-
locked_until: "TIMESTAMPTZ",
|
|
41
|
-
created_at: "TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()",
|
|
42
|
-
finished_at: "TIMESTAMPTZ",
|
|
43
|
-
},
|
|
44
|
-
check: {
|
|
45
|
-
$or: [
|
|
46
|
-
{ ...shared, status: "pending", error: {} },
|
|
47
|
-
{
|
|
48
|
-
...shared,
|
|
49
|
-
status: "running",
|
|
50
|
-
error: {},
|
|
51
|
-
lease_token: { $ne: null },
|
|
52
|
-
locked_until: { $ne: null },
|
|
53
|
-
},
|
|
54
|
-
{ ...shared, status: "succeeded", finished_at: { $ne: null } },
|
|
55
|
-
{ ...shared, status: "failed", error: { $ne: null }, finished_at: { $ne: null } },
|
|
56
|
-
{ ...shared, status: "cancelled", error: {}, finished_at: { $ne: null } },
|
|
57
|
-
],
|
|
58
|
-
},
|
|
6
|
+
...prostgles_types_1.jobTableSchema,
|
|
59
7
|
indexes: {
|
|
60
8
|
occurrence: { unique: true, columns: "job_name, occurrence", where: "occurrence IS NOT NULL" },
|
|
61
9
|
pending: { columns: "job_name, run_at", where: "status = 'pending'" },
|
|
62
10
|
active: { columns: "job_name", where: "status IN ('pending', 'running')" },
|
|
11
|
+
retention: {
|
|
12
|
+
columns: "job_name, status, finished_at, id",
|
|
13
|
+
where: "target_table IS NULL AND status IN ('succeeded', 'failed', 'cancelled')",
|
|
14
|
+
},
|
|
63
15
|
},
|
|
64
16
|
};
|
|
65
17
|
//# sourceMappingURL=jobTableConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobTableConfig.js","sourceRoot":"","sources":["../../lib/Jobs/jobTableConfig.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"jobTableConfig.js","sourceRoot":"","sources":["../../lib/Jobs/jobTableConfig.ts"],"names":[],"mappings":";;;AAAA,qDAAiD;AAGpC,QAAA,cAAc,GAAG;IAC5B,GAAG,gCAAc;IACjB,OAAO,EAAE;QACP,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,wBAAwB,EAAE;QAC9F,OAAO,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,oBAAoB,EAAE;QACrE,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,kCAAkC,EAAE;QAC1E,SAAS,EAAE;YACT,OAAO,EAAE,mCAAmC;YAC5C,KAAK,EAAE,yEAAyE;SACjF;KACF;CACiC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pruneJobs.d.ts","sourceRoot":"","sources":["../../lib/Jobs/pruneJobs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,eAAO,MAAM,SAAS,GAAU,WAAW,SAAS,EAAE,UAAU,kBAAkB,EAAE,kBA6CnF,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pruneJobs = void 0;
|
|
4
|
+
const prostgles_types_1 = require("prostgles-types");
|
|
5
|
+
const jobUtils_1 = require("./jobUtils");
|
|
6
|
+
const pruneJobs = async (prostgles, policies) => {
|
|
7
|
+
const tableSQL = prostgles.jobs.tableSQL;
|
|
8
|
+
for (const policy of policies) {
|
|
9
|
+
try {
|
|
10
|
+
await prostgles.db.tx(async (transaction) => {
|
|
11
|
+
/* Skip cleanup while a scheduler may still enqueue an occurrence selected before this minute. */
|
|
12
|
+
const { locked } = await transaction.one("SELECT pg_try_advisory_xact_lock(hashtextextended(${lockKey}, 0)) AS locked", { lockKey: (0, prostgles_types_1.stableStringify)([tableSQL, policy.jobName, "schedule"]) });
|
|
13
|
+
if (!locked)
|
|
14
|
+
return;
|
|
15
|
+
const jobStatusCondition = `job_name = \${jobName} AND status = \${status} AND target_table IS NULL`;
|
|
16
|
+
await transaction.none(`WITH count_boundary AS (
|
|
17
|
+
SELECT finished_at, id
|
|
18
|
+
FROM ${tableSQL}
|
|
19
|
+
WHERE ${jobStatusCondition}
|
|
20
|
+
AND \${maxCount}::bigint IS NOT NULL
|
|
21
|
+
ORDER BY
|
|
22
|
+
finished_at DESC,
|
|
23
|
+
id DESC
|
|
24
|
+
OFFSET \${maxCount}::bigint LIMIT 1
|
|
25
|
+
), expired AS (
|
|
26
|
+
SELECT id
|
|
27
|
+
FROM ${tableSQL}
|
|
28
|
+
WHERE ${jobStatusCondition}
|
|
29
|
+
AND (occurrence IS NULL OR occurrence < date_trunc('minute', statement_timestamp()))
|
|
30
|
+
AND (
|
|
31
|
+
finished_at < statement_timestamp() - \${maxAge}::interval
|
|
32
|
+
OR (finished_at, id) <= (SELECT finished_at, id FROM count_boundary)
|
|
33
|
+
)
|
|
34
|
+
ORDER BY
|
|
35
|
+
finished_at,
|
|
36
|
+
id
|
|
37
|
+
FOR UPDATE SKIP LOCKED
|
|
38
|
+
LIMIT 1000
|
|
39
|
+
)
|
|
40
|
+
DELETE FROM ${tableSQL} jobs USING expired WHERE jobs.id = expired.id`, policy);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.error(`Job retention ${policy.jobName}.${policy.status} failed`, (0, jobUtils_1.jobError)(error));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
exports.pruneJobs = pruneJobs;
|
|
49
|
+
//# sourceMappingURL=pruneJobs.js.map
|