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, }; } }