Files
speckle-server/packages/server/modules/previews/queues/previews.ts
T

66 lines
2.4 KiB
TypeScript

import type {
BuildUpdateObjectPreview,
RequestObjectPreview
} from '@/modules/previews/domain/operations'
import type { Logger } from '@/observability/logging'
import type { Queue, Job } from 'bull'
import { PreviewStatus } from '@/modules/previews/domain/consts'
import type { JobPayload } from '@speckle/shared/workers/previews'
import { fromJobId, jobIdSchema } from '@speckle/shared/workers/previews'
export const requestObjectPreviewFactory =
({
responseQueue,
queue
}: {
responseQueue: string
queue: Queue<JobPayload>
}): RequestObjectPreview =>
async ({ jobId, token, url }) => {
const payload = { jobId, token, url, responseQueue }
await queue.add(payload, { removeOnComplete: true, attempts: 3 })
}
export const requestErrorHandlerFactory =
(deps: { logger: Logger }) => (err: Error) => {
deps.logger.error(
{ err },
'Preview generation resulted in an error due to the Redis backend.'
)
}
export const requestActiveHandlerFactory = (deps: { logger: Logger }) => (job: Job) => {
const jobId = 'jobId' in job.data ? job.data.jobId : undefined
deps.logger.info({ jobId }, 'Preview job {jobId} processing started.')
}
export const requestFailedHandlerFactory =
(deps: { logger: Logger; buildUpdateObjectPreview: BuildUpdateObjectPreview }) =>
async (job: Job, err: Error) => {
const { logger, buildUpdateObjectPreview } = deps
const jobId = 'jobId' in job.data ? job.data.jobId : undefined
logger.error({ err, jobId }, 'Preview job {jobId} failed.')
if (!jobId) return
const { projectId, objectId } = fromJobId(jobId)
const updateObjectPreview = await buildUpdateObjectPreview({ projectId })
const updatedRecords = await updateObjectPreview({
objectPreview: {
streamId: projectId,
objectId,
previewStatus: PreviewStatus.ERROR
}
})
if (updatedRecords.length < 1) {
logger.warn(
{ projectId, objectId },
'No object preview was updated for {projectId}.{objectId} after a failed preview job. This may indicate that the object preview does not exist or that the project does not exist, or has moved regions.'
)
}
if (updatedRecords.length > 1) {
logger.warn(
{ projectId, objectId, updatedRecords },
'Multiple object previews were updated for {projectId}.{objectId} after a failed preview job. This may indicate a data integrity issue.'
)
}
}