import dbHandler from "../db-handler";
import type { BunMariaDBConfig, DBResponseObject } from "../../types";
import { quoteIdentifier } from "../../utils/sql-identifier";
import { QUEUE_NOW_SQL, requireQueueTable } from "./queue-utils";
type Params
= {
table: Table;
id: number | string;
/** `queue_lock_token` from the claimed row */
lock_token: string;
/** New lease length, counted from now. Defaults to the table's `lease_ms` */
lease_ms?: number;
config?: BunMariaDBConfig;
};
/**
* Extend the lease on a claimed job, for jobs that run longer than the
* lease given to `claim`.
*/
export default async function QueueExtend({
table,
id,
lock_token,
lease_ms,
config,
}: Params): Promise {
try {
const options = requireQueueTable(table);
const leaseMs = Math.max(
0,
Math.floor(Number(lease_ms ?? options.lease_ms) || 0),
);
const res = await dbHandler({
query: `UPDATE ${quoteIdentifier(table)} SET queue_lease_expires_at = ${QUEUE_NOW_SQL} + ?, updated_at = ${QUEUE_NOW_SQL} WHERE id = ? AND queue_status = 'processing' AND queue_lock_token = ?`,
values: [leaseMs, id, lock_token],
config,
});
if (!res.success) {
return { ...res, success: false };
}
if (!res.db_res?.affectedRows) {
return {
...res,
success: false,
msg: "Job is not claimed with this lock token",
};
}
return await dbHandler({
query: `SELECT * FROM ${quoteIdentifier(table)} WHERE id = ?`,
values: [id],
config,
});
} catch (error: any) {
return {
success: false,
error: error.message,
};
}
}