@rpcbase/worker 0.30.0 → 0.31.0

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/index.js CHANGED
@@ -147,11 +147,16 @@ const getMongoUrl = () => {
147
147
  return `mongodb://${host}:${port}`;
148
148
  };
149
149
  const escapeRegex = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
150
+ const isRecord = (value) => typeof value === "object" && value !== null;
151
+ const getDocumentId = (doc) => {
152
+ if (!isRecord(doc)) return void 0;
153
+ return doc._id;
154
+ };
150
155
  const resolveModelNameFromCollection = (collName) => {
151
156
  const models = mongoose.models;
152
157
  for (const modelName of Object.keys(models)) {
153
158
  const model = models[modelName];
154
- const collectionName = model?.collection?.collectionName ?? model?.collection?.name;
159
+ const collectionName = model.collection?.collectionName ?? model.collection?.name;
155
160
  if (collectionName === collName) {
156
161
  return modelName;
157
162
  }
@@ -159,8 +164,8 @@ const resolveModelNameFromCollection = (collName) => {
159
164
  return null;
160
165
  };
161
166
  const normalizeUpdateDescription = (updateDescription) => {
162
- if (!updateDescription || typeof updateDescription !== "object") return updateDescription;
163
- if (updateDescription.updatedFields && typeof updateDescription.updatedFields === "object") {
167
+ if (!isRecord(updateDescription)) return updateDescription;
168
+ if (isRecord(updateDescription.updatedFields)) {
164
169
  return {
165
170
  ...updateDescription,
166
171
  updatedFieldsKeys: Object.keys(updateDescription.updatedFields)
@@ -182,7 +187,7 @@ const dispatchWorkerQueue = async ({
182
187
  if (!tasks[handlerName]) return;
183
188
  const normalizedUpdateDescription = normalizeUpdateDescription(updateDescription);
184
189
  await queueApi.add(handlerName, { doc, updateDescription: normalizedUpdateDescription }, {
185
- jobId: `${dbName}|${taskOp}-${doc?._id ?? "unknown"}`,
190
+ jobId: `${dbName}|${taskOp}-${getDocumentId(doc) ?? "unknown"}`,
186
191
  removeOnComplete: true,
187
192
  removeOnFail: true
188
193
  });
@@ -251,9 +256,9 @@ const registerQueueListener = async (options = {}) => {
251
256
  readyReject?.(err);
252
257
  };
253
258
  const isChangeStreamHistoryLost = (err) => {
254
- const anyErr = err;
255
- const code = typeof anyErr?.code === "number" ? anyErr.code : null;
256
- const codeName = typeof anyErr?.codeName === "string" ? anyErr.codeName : "";
259
+ const maybeErr = err;
260
+ const code = typeof maybeErr.code === "number" ? maybeErr.code : null;
261
+ const codeName = typeof maybeErr.codeName === "string" ? maybeErr.codeName : "";
257
262
  const message = err instanceof Error ? err.message : String(err ?? "");
258
263
  return code === 286 || codeName === "ChangeStreamHistoryLost" || message.includes("ChangeStreamHistoryLost") || message.includes("resume token") || message.includes("Resume token") || message.includes("resume of change stream was not possible") || message.includes("cannot resume");
259
264
  };
@@ -338,9 +343,10 @@ const registerQueueListener = async (options = {}) => {
338
343
  stream.on("change", (change) => {
339
344
  const streamRef = stream;
340
345
  processing = processing.then(async () => {
341
- const dbName = String(change?.ns?.db ?? "");
346
+ const ns = "ns" in change ? change.ns : void 0;
347
+ const dbName = String(ns?.db ?? "");
342
348
  if (!dbName) return;
343
- const collName = String(change?.ns?.coll ?? "");
349
+ const collName = String(ns && "coll" in ns ? ns.coll : "");
344
350
  if (!collName) return;
345
351
  if (shouldSkipCollection(collName)) return;
346
352
  if (INTERNAL_IGNORED_COLLECTION_NAMES.has(collName)) return;
@@ -350,18 +356,19 @@ const registerQueueListener = async (options = {}) => {
350
356
  const op = String(change.operationType ?? "");
351
357
  if (!op) return;
352
358
  const normalizedOp = normalizeOpForTaskName(op);
353
- let doc = change.fullDocument;
359
+ let doc = "fullDocument" in change ? change.fullDocument : void 0;
354
360
  if (!doc && normalizedOp === "delete") {
355
- doc = change.documentKey;
361
+ doc = "documentKey" in change ? change.documentKey : void 0;
356
362
  }
357
363
  if (!doc) return;
364
+ const updateDescription = "updateDescription" in change ? change.updateDescription : void 0;
358
365
  try {
359
366
  await dispatchWorkerQueue({
360
367
  dbName,
361
368
  modelName,
362
369
  op: normalizedOp,
363
370
  doc,
364
- updateDescription: change.updateDescription
371
+ updateDescription
365
372
  });
366
373
  resumeAfter = change?._id ?? resumeAfter;
367
374
  } catch (err) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/queue.ts","../src/queueListener.ts","../src/taskNames.ts"],"sourcesContent":["import { Queue, Worker, type Job, type JobsOptions as JobOptions } from \"bullmq\"\n\nimport type { WorkerTasksMap } from \"./tasksMap\"\n\n\nexport type TaskHandler<TPayload = unknown> = (payload: TPayload, job: Job) => unknown | Promise<unknown>\n\nconst DEFAULT_QUEUE_NAME = \"rb-queue-default\"\nconst DEFAULT_CONCURRENCY = 2\nconst DEFAULT_RENTENTION = 128\n\nconst tasksByName: Record<string, TaskHandler<any>> = Object.create(null)\n\nlet queueInstance: Queue | null = null\nlet workerInstance: Worker | null = null\nlet hasStarted = false\n\nconst getRedisUrl = (): string => {\n const redisUrl = process.env.REDIS_URL?.trim()\n if (!redisUrl) {\n throw new Error(\"Missing REDIS_URL (required for @rpcbase/worker queue)\")\n }\n return redisUrl\n}\n\nconst getQueueName = (): string => process.env.RB_QUEUE_NAME?.trim() || DEFAULT_QUEUE_NAME\n\nconst getConcurrency = (): number => {\n const raw = process.env.RB_QUEUE_CONCURRENCY?.trim()\n const value = raw ? Number(raw) : DEFAULT_CONCURRENCY\n if (!Number.isFinite(value) || value <= 0) return DEFAULT_CONCURRENCY\n return Math.floor(value)\n}\n\nconst getConnection = () => ({ url: getRedisUrl() })\n\nconst ensureQueue = (): Queue => {\n if (queueInstance) return queueInstance\n queueInstance = new Queue(getQueueName(), {\n connection: getConnection(),\n defaultJobOptions: {\n removeOnComplete: DEFAULT_RENTENTION,\n removeOnFail: DEFAULT_RENTENTION\n },\n })\n\n return queueInstance\n}\n\nexport function registerTask<TName extends keyof WorkerTasksMap & string>(\n name: TName,\n handler: TaskHandler<WorkerTasksMap[TName]>,\n): void\nexport function registerTask(name: string, handler: TaskHandler<any>): void\nexport function registerTask(name: string, handler: TaskHandler<any>): void {\n tasksByName[name] = handler\n}\n\nexport const getTasks = (): Record<string, TaskHandler<any>> => tasksByName\n\nexport function add<TName extends keyof WorkerTasksMap & string>(\n taskName: TName,\n payload: WorkerTasksMap[TName],\n options?: JobOptions,\n): Promise<Job>\nexport function add(taskName: string, payload: unknown, options?: JobOptions): Promise<Job>\nexport function add(taskName: string, payload: any, options?: JobOptions): Promise<Job> {\n return ensureQueue().add(taskName, payload, options)\n}\n\nexport const getJob = async (jobId: string): Promise<Job | null> => (await ensureQueue().getJob(jobId)) ?? null\n\nexport const getJobs = async (...args: Parameters<Queue[\"getJobs\"]>): Promise<Job[]> =>\n ensureQueue().getJobs(...args) as unknown as Job[]\n\nexport const getInstance = (): Queue => ensureQueue()\n\nexport const start = async (): Promise<Queue> => {\n if (hasStarted) return ensureQueue()\n hasStarted = true\n\n const queue = ensureQueue()\n const concurrency = getConcurrency()\n\n console.log(\"start worker queue\", { queue: queue.name, redisUrl: getRedisUrl(), concurrency })\n\n queue.on(\"error\", (err) => {\n console.log(`queue error: ${err.message}`)\n })\n\n if (!workerInstance) {\n workerInstance = new Worker(\n queue.name,\n async (job) => {\n const taskName = job.name\n\n const handler = tasksByName[taskName]\n if (!handler) {\n throw new Error(`No task registered for '${taskName}'`)\n }\n\n return await handler(job.data, job)\n },\n {\n concurrency,\n connection: getConnection(),\n },\n )\n }\n\n workerInstance.on(\"error\", (err) => {\n console.log(`worker error: ${err.message}`)\n })\n\n workerInstance.on(\"stalled\", (jobId) => {\n console.log(`job ${jobId} stalled`)\n })\n\n workerInstance.on(\"failed\", (job, err) => {\n console.log(`job ${job?.id ?? \"unknown\"} failed`, err)\n })\n\n await workerInstance.waitUntilReady()\n\n return queue\n}\n\nexport const close = async (): Promise<void> => {\n if (!queueInstance && !workerInstance) return\n try {\n await workerInstance?.close()\n await queueInstance?.close()\n } finally {\n workerInstance = null\n queueInstance = null\n hasStarted = false\n }\n}\n\nexport const getUrl = (): string => getRedisUrl()\n\nexport type ScheduleTaskOptions = Omit<JobOptions, \"repeat\"> & {\n jobId?: string\n repeat: NonNullable<JobOptions[\"repeat\"]>\n}\n\nexport function scheduleTask<TName extends keyof WorkerTasksMap & string>(\n taskName: TName,\n payload: WorkerTasksMap[TName],\n options: ScheduleTaskOptions,\n): Promise<Job>\nexport function scheduleTask(taskName: string, payload: unknown, options: ScheduleTaskOptions): Promise<Job>\nexport async function scheduleTask(taskName: string, payload: any, options: ScheduleTaskOptions): Promise<Job> {\n const { jobId, repeat, ...rest } = options\n return add(taskName, payload, {\n ...rest,\n jobId: jobId ?? `schedule|${taskName}`,\n repeat,\n })\n}\n\nconst queueApi = {\n start,\n close,\n registerTask,\n getTasks,\n add,\n scheduleTask,\n getJob,\n getJobs,\n getInstance,\n getUrl,\n}\n\nexport default queueApi\n","import { MongoClient, type ChangeStream, type Document, type MongoClientOptions } from \"mongodb\"\nimport mongoose from \"mongoose\"\n\nimport queue from \"./queue\"\n\n\nexport type QueueListenerRetryDelays = {\n minMs?: number\n maxMs?: number\n factor?: number\n}\n\nexport type QueueListenerStatus =\n | { state: \"connecting\"; attempt: number }\n | { state: \"ready\" }\n | { state: \"error\"; attempt: number; error: unknown; nextRetryInMs: number }\n | { state: \"failed\"; attempt: number; error: unknown }\n | { state: \"closed\" }\n\nexport type QueueListenerHandle = {\n ready: Promise<void>\n close: () => Promise<void>\n getStatus: () => QueueListenerStatus\n}\n\nexport type QueueListenerOptions = {\n maxRetries?: number | \"infinite\"\n fatalOnMaxRetries?: boolean\n onStateChange?: (status: QueueListenerStatus) => void\n onFatal?: (err: unknown) => void\n retryDelays?: QueueListenerRetryDelays\n mongoClientOptions?: MongoClientOptions\n}\n\nconst RETRY_MAXIMUM_DELAY_MS = 3000\nconst RETRY_MINIMUM_DELAY_MS = 50\nconst RETRY_DEFAULT_FACTOR = 2\n\nconst sleep = async (ms: number, signal?: AbortSignal): Promise<void> => new Promise((resolve) => {\n if (signal?.aborted) {\n resolve()\n return\n }\n\n let timeout: ReturnType<typeof setTimeout> | null = null\n\n const cleanup = () => {\n if (timeout) clearTimeout(timeout)\n signal?.removeEventListener(\"abort\", onAbort)\n }\n\n const onAbort = () => {\n cleanup()\n resolve()\n }\n\n timeout = setTimeout(() => {\n cleanup()\n resolve()\n }, ms)\n timeout.unref?.()\n\n signal?.addEventListener(\"abort\", onAbort)\n})\n\nconst getMongoUrl = (): string => {\n const explicit =\n process.env.MONGODB_URL\n ?? process.env.MONGO_URL\n ?? process.env.MONGODB_URI\n ?? process.env.DB_URL\n\n if (explicit && explicit.trim()) return explicit.trim()\n\n const port = process.env.DB_PORT?.trim()\n if (!port) throw new Error(\"Missing Mongo connection details (MONGODB_URL/MONGO_URL/MONGODB_URI/DB_URL/DB_PORT)\")\n\n const host = process.env.DB_HOST?.trim() || \"localhost\"\n return `mongodb://${host}:${port}`\n}\n\nconst escapeRegex = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n\nconst resolveModelNameFromCollection = (collName: string): string | null => {\n const models = mongoose.models\n\n for (const modelName of Object.keys(models)) {\n const model = models[modelName]\n const collectionName =\n (model as any)?.collection?.collectionName\n ?? (model as any)?.collection?.name\n\n if (collectionName === collName) {\n return modelName\n }\n }\n\n return null\n}\n\nconst normalizeUpdateDescription = (updateDescription: any): any => {\n if (!updateDescription || typeof updateDescription !== \"object\") return updateDescription\n\n if (updateDescription.updatedFields && typeof updateDescription.updatedFields === \"object\") {\n return {\n ...updateDescription,\n updatedFieldsKeys: Object.keys(updateDescription.updatedFields),\n }\n }\n\n return updateDescription\n}\n\nconst normalizeOpForTaskName = (op: string): string => (op === \"replace\" ? \"update\" : op)\n\nconst dispatchWorkerQueue = async ({\n dbName,\n modelName,\n op,\n doc,\n updateDescription,\n}: {\n dbName: string\n modelName: string\n op: string\n doc: any\n updateDescription?: any\n}): Promise<void> => {\n const tasks = queue.getTasks()\n const taskOp = normalizeOpForTaskName(op)\n const handlerName = `on-${taskOp}-${modelName}`\n\n if (!tasks[handlerName]) return\n\n const normalizedUpdateDescription = normalizeUpdateDescription(updateDescription)\n\n await queue.add(handlerName, { doc, updateDescription: normalizedUpdateDescription }, {\n jobId: `${dbName}|${taskOp}-${doc?._id ?? \"unknown\"}`,\n removeOnComplete: true,\n removeOnFail: true,\n })\n}\n\nconst shouldSkipCollection = (collName: string): boolean =>\n collName.endsWith(\".files\") || collName.endsWith(\".chunks\")\n\nconst INTERNAL_IGNORED_MODEL_NAMES = new Set([\"RBRtsChange\", \"RBRtsCounter\"])\n\nconst INTERNAL_IGNORED_COLLECTION_NAMES = new Set([\"rtschanges\", \"rtscounters\"])\n\nconst normalizeRetryDelays = (input: QueueListenerRetryDelays | undefined): Required<QueueListenerRetryDelays> => {\n const minMs = Math.max(0, Math.floor(input?.minMs ?? RETRY_MINIMUM_DELAY_MS))\n const rawMaxMs = Math.max(0, Math.floor(input?.maxMs ?? RETRY_MAXIMUM_DELAY_MS))\n const maxMs = Math.max(minMs, rawMaxMs)\n const factor = Math.max(1, Number.isFinite(input?.factor) ? (input?.factor ?? RETRY_DEFAULT_FACTOR) : RETRY_DEFAULT_FACTOR)\n return { minMs, maxMs, factor }\n}\n\nconst getRetryDelayMs = (attempt: number, delays: Required<QueueListenerRetryDelays>): number =>\n Math.min(delays.maxMs, Math.round(delays.minMs * Math.pow(delays.factor, Math.max(0, attempt - 1))))\n\nconst normalizeMaxRetries = (value: number | \"infinite\"): number | \"infinite\" => {\n if (value === \"infinite\") return value\n const parsed = Math.floor(value)\n return Number.isFinite(parsed) ? Math.max(0, parsed) : 0\n}\n\nexport const registerQueueListener = async (options: QueueListenerOptions = {}): Promise<QueueListenerHandle> => {\n const maxRetries = normalizeMaxRetries(options.maxRetries ?? \"infinite\")\n const fatalOnMaxRetries = options.fatalOnMaxRetries ?? false\n const retryDelays = normalizeRetryDelays(options.retryDelays)\n\n const appName = process.env.APP_NAME?.trim()\n if (!appName) {\n throw new Error(\"Missing APP_NAME (required to configure the worker DB change listener)\")\n }\n\n const mongoUrl = getMongoUrl()\n const mongoClientOptions: MongoClientOptions = {\n family: 4,\n serverSelectionTimeoutMS: 2000,\n connectTimeoutMS: 2000,\n ...options.mongoClientOptions,\n }\n\n let stopped = false\n const abortController = new AbortController()\n let client: MongoClient | null = null\n let stream: ChangeStream<Document, Document> | null = null\n let resumeAfter: Document | null = null\n let processing = Promise.resolve()\n\n let status: QueueListenerStatus = { state: \"connecting\", attempt: 1 }\n const setStatus = (next: QueueListenerStatus): void => {\n status = next\n try {\n options.onStateChange?.(next)\n } catch (err) {\n console.warn(\"queue listener onStateChange failed\", err)\n }\n }\n\n let readySettled = false\n let readyResolve: (() => void) | null = null\n let readyReject: ((err: unknown) => void) | null = null\n const ready = new Promise<void>((resolve, reject) => {\n readyResolve = resolve\n readyReject = reject\n })\n\n const resolveReady = (): void => {\n if (readySettled) return\n readySettled = true\n readyResolve?.()\n }\n\n const rejectReady = (err: unknown): void => {\n if (readySettled) return\n readySettled = true\n readyReject?.(err)\n }\n\n const isChangeStreamHistoryLost = (err: unknown): boolean => {\n const anyErr = err as any\n const code = typeof anyErr?.code === \"number\" ? anyErr.code : null\n const codeName = typeof anyErr?.codeName === \"string\" ? anyErr.codeName : \"\"\n const message = err instanceof Error ? err.message : String(err ?? \"\")\n\n return (\n code === 286\n || codeName === \"ChangeStreamHistoryLost\"\n || message.includes(\"ChangeStreamHistoryLost\")\n || message.includes(\"resume token\")\n || message.includes(\"Resume token\")\n || message.includes(\"resume of change stream was not possible\")\n || message.includes(\"cannot resume\")\n )\n }\n\n const close = async (): Promise<void> => {\n stopped = true\n abortController.abort()\n try {\n stream?.removeAllListeners()\n await stream?.close()\n } catch {\n // ignore\n }\n stream = null\n\n try {\n await client?.close()\n } catch {\n // ignore\n }\n client = null\n\n if (!readySettled) {\n rejectReady(new Error(\"queue listener closed before ready\"))\n }\n\n setStatus({ state: \"closed\" })\n }\n\n const closeResources = async (): Promise<void> => {\n try {\n stream?.removeAllListeners()\n await stream?.close()\n } catch {\n // ignore\n }\n stream = null\n\n try {\n await client?.close()\n } catch {\n // ignore\n }\n client = null\n }\n\n const startStream = async (): Promise<{ stoppedPromise: Promise<{ reason: \"close\" | \"error\"; error?: unknown }> }> => {\n if (stopped) return { stoppedPromise: Promise.resolve({ reason: \"close\" }) }\n\n if (stream) {\n try {\n stream.removeAllListeners()\n await stream.close()\n } catch {\n // ignore\n }\n stream = null\n }\n\n if (client) {\n try {\n await client.close()\n } catch {\n // ignore\n }\n client = null\n }\n\n client = new MongoClient(mongoUrl, mongoClientOptions)\n\n await client.connect()\n\n const dbMatch = { \"ns.db\": { $regex: `^${escapeRegex(appName)}-.*-db$` } }\n\n const pipeline: Document[] = [\n { $match: dbMatch },\n {\n $match: {\n operationType: { $in: [\"insert\", \"update\", \"replace\", \"delete\"] },\n }\n },\n { $match: { \"ns.coll\": { $nin: Array.from(INTERNAL_IGNORED_COLLECTION_NAMES) } } },\n ]\n\n stream = client.watch(pipeline, {\n fullDocument: \"updateLookup\",\n ...(resumeAfter ? { resumeAfter } : {}),\n })\n\n const stoppedPromise = new Promise<{ reason: \"close\" | \"error\"; error?: unknown }>((resolve) => {\n let settled = false\n const onAbort = () => settle({ reason: \"close\" })\n\n const settle = (result: { reason: \"close\" | \"error\"; error?: unknown }) => {\n if (settled) return\n settled = true\n abortController.signal.removeEventListener(\"abort\", onAbort)\n resolve(result)\n }\n\n abortController.signal.addEventListener(\"abort\", onAbort)\n stream?.once(\"close\", () => settle({ reason: \"close\" }))\n stream?.once(\"error\", (err) => settle({ reason: \"error\", error: err }))\n })\n\n stream.on(\"change\", (change: any) => {\n const streamRef = stream\n processing = processing.then(async () => {\n const dbName = String(change?.ns?.db ?? \"\")\n if (!dbName) return\n\n const collName = String(change?.ns?.coll ?? \"\")\n if (!collName) return\n if (shouldSkipCollection(collName)) return\n if (INTERNAL_IGNORED_COLLECTION_NAMES.has(collName)) return\n\n const modelName = resolveModelNameFromCollection(collName)\n if (!modelName) return\n if (INTERNAL_IGNORED_MODEL_NAMES.has(modelName)) return\n\n const op = String(change.operationType ?? \"\")\n if (!op) return\n const normalizedOp = normalizeOpForTaskName(op)\n\n let doc = change.fullDocument\n if (!doc && normalizedOp === \"delete\") {\n doc = change.documentKey\n }\n if (!doc) return\n\n try {\n await dispatchWorkerQueue({\n dbName,\n modelName,\n op: normalizedOp,\n doc,\n updateDescription: change.updateDescription,\n })\n\n resumeAfter = change?._id ?? resumeAfter\n } catch (err) {\n console.warn(\"queue listener failed to dispatch change\", err)\n try {\n await streamRef?.close()\n } catch {\n // ignore\n }\n }\n }).catch((err) => {\n console.warn(\"queue listener change handler failed\", err)\n })\n })\n\n stream.on(\"error\", (err) => {\n if (stopped) return\n if (resumeAfter && isChangeStreamHistoryLost(err)) {\n resumeAfter = null\n }\n try {\n void Promise.resolve(stream?.close()).catch(() => {})\n } catch {\n // ignore\n }\n })\n\n return { stoppedPromise }\n }\n\n const run = async (): Promise<void> => {\n let retryCounter = 0\n\n while (!stopped) {\n try {\n setStatus({ state: \"connecting\", attempt: retryCounter + 1 })\n\n const { stoppedPromise } = await startStream()\n retryCounter = 0\n setStatus({ state: \"ready\" })\n resolveReady()\n\n const end = await stoppedPromise\n if (stopped) return\n\n retryCounter += 1\n if (maxRetries !== \"infinite\" && retryCounter > maxRetries) {\n const err = end.reason === \"error\" ? end.error : new Error(\"queue listener closed\")\n setStatus({ state: \"failed\", attempt: retryCounter, error: err })\n if (fatalOnMaxRetries) {\n try {\n options.onFatal?.(err)\n } catch (fatalErr) {\n console.warn(\"queue listener onFatal failed\", fatalErr)\n }\n }\n rejectReady(err)\n abortController.abort()\n await closeResources()\n return\n }\n\n const delayMs = getRetryDelayMs(retryCounter, retryDelays)\n const err = end.reason === \"error\" ? end.error : new Error(\"queue listener closed\")\n console.warn(\"queue listener not ready, retrying in\", delayMs, err)\n setStatus({ state: \"error\", attempt: retryCounter, error: err, nextRetryInMs: delayMs })\n await closeResources()\n await sleep(delayMs, abortController.signal)\n } catch (err) {\n if (stopped) return\n\n retryCounter += 1\n if (maxRetries !== \"infinite\" && retryCounter > maxRetries) {\n setStatus({ state: \"failed\", attempt: retryCounter, error: err })\n if (fatalOnMaxRetries) {\n try {\n options.onFatal?.(err)\n } catch (fatalErr) {\n console.warn(\"queue listener onFatal failed\", fatalErr)\n }\n }\n rejectReady(err)\n abortController.abort()\n await closeResources()\n return\n }\n\n const delayMs = getRetryDelayMs(retryCounter, retryDelays)\n console.warn(\"queue listener not ready, retrying in\", delayMs, err)\n setStatus({ state: \"error\", attempt: retryCounter, error: err, nextRetryInMs: delayMs })\n await closeResources()\n await sleep(delayMs, abortController.signal)\n }\n }\n }\n\n const handle: QueueListenerHandle = {\n ready,\n close,\n getStatus: () => status,\n }\n\n void run().catch(async (err) => {\n if (stopped) return\n setStatus({ state: \"failed\", attempt: 0, error: err })\n rejectReady(err)\n await closeResources()\n })\n\n return handle\n}\n","export type DbEventOp = \"insert\" | \"update\" | \"delete\"\n\nexport type DbEventTaskName<TOp extends DbEventOp = DbEventOp, TModelName extends string = string> =\n `on-${TOp}-${TModelName}`\n\nexport type DbEventTaskPayload<TDoc = unknown, TUpdateDescription = unknown> = {\n doc: TDoc\n updateDescription?: TUpdateDescription\n}\n\nexport const dbEventTaskName = <TOp extends DbEventOp, TModelName extends string>(\n op: TOp,\n modelName: TModelName,\n): DbEventTaskName<TOp, TModelName> => `on-${op}-${modelName}`\n"],"names":["queue","close","err"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/queue.ts","../src/queueListener.ts","../src/taskNames.ts"],"sourcesContent":["import { Queue, Worker, type Job, type JobsOptions as JobOptions } from \"bullmq\"\n\nimport type { WorkerTasksMap } from \"./tasksMap\"\n\n\nexport type TaskHandler<TPayload = unknown> = (payload: TPayload, job: Job) => unknown | Promise<unknown>\n\nconst DEFAULT_QUEUE_NAME = \"rb-queue-default\"\nconst DEFAULT_CONCURRENCY = 2\nconst DEFAULT_RENTENTION = 128\n\nconst tasksByName: Record<string, TaskHandler<unknown>> = Object.create(null)\n\nlet queueInstance: Queue | null = null\nlet workerInstance: Worker | null = null\nlet hasStarted = false\n\nconst getRedisUrl = (): string => {\n const redisUrl = process.env.REDIS_URL?.trim()\n if (!redisUrl) {\n throw new Error(\"Missing REDIS_URL (required for @rpcbase/worker queue)\")\n }\n return redisUrl\n}\n\nconst getQueueName = (): string => process.env.RB_QUEUE_NAME?.trim() || DEFAULT_QUEUE_NAME\n\nconst getConcurrency = (): number => {\n const raw = process.env.RB_QUEUE_CONCURRENCY?.trim()\n const value = raw ? Number(raw) : DEFAULT_CONCURRENCY\n if (!Number.isFinite(value) || value <= 0) return DEFAULT_CONCURRENCY\n return Math.floor(value)\n}\n\nconst getConnection = () => ({ url: getRedisUrl() })\n\nconst ensureQueue = (): Queue => {\n if (queueInstance) return queueInstance\n queueInstance = new Queue(getQueueName(), {\n connection: getConnection(),\n defaultJobOptions: {\n removeOnComplete: DEFAULT_RENTENTION,\n removeOnFail: DEFAULT_RENTENTION\n },\n })\n\n return queueInstance\n}\n\nexport function registerTask<TName extends keyof WorkerTasksMap & string>(\n name: TName,\n handler: TaskHandler<WorkerTasksMap[TName]>,\n): void\nexport function registerTask(name: string, handler: TaskHandler<unknown>): void\nexport function registerTask(name: string, handler: TaskHandler<unknown>): void {\n tasksByName[name] = handler\n}\n\nexport const getTasks = (): Record<string, TaskHandler<unknown>> => tasksByName\n\nexport function add<TName extends keyof WorkerTasksMap & string>(\n taskName: TName,\n payload: WorkerTasksMap[TName],\n options?: JobOptions,\n): Promise<Job>\nexport function add(taskName: string, payload: unknown, options?: JobOptions): Promise<Job>\nexport function add(taskName: string, payload: unknown, options?: JobOptions): Promise<Job> {\n return ensureQueue().add(taskName, payload, options)\n}\n\nexport const getJob = async (jobId: string): Promise<Job | null> => (await ensureQueue().getJob(jobId)) ?? null\n\nexport const getJobs = async (...args: Parameters<Queue[\"getJobs\"]>): Promise<Job[]> =>\n ensureQueue().getJobs(...args) as unknown as Job[]\n\nexport const getInstance = (): Queue => ensureQueue()\n\nexport const start = async (): Promise<Queue> => {\n if (hasStarted) return ensureQueue()\n hasStarted = true\n\n const queue = ensureQueue()\n const concurrency = getConcurrency()\n\n console.log(\"start worker queue\", { queue: queue.name, redisUrl: getRedisUrl(), concurrency })\n\n queue.on(\"error\", (err) => {\n console.log(`queue error: ${err.message}`)\n })\n\n if (!workerInstance) {\n workerInstance = new Worker(\n queue.name,\n async (job) => {\n const taskName = job.name\n\n const handler = tasksByName[taskName]\n if (!handler) {\n throw new Error(`No task registered for '${taskName}'`)\n }\n\n return await handler(job.data, job)\n },\n {\n concurrency,\n connection: getConnection(),\n },\n )\n }\n\n workerInstance.on(\"error\", (err) => {\n console.log(`worker error: ${err.message}`)\n })\n\n workerInstance.on(\"stalled\", (jobId) => {\n console.log(`job ${jobId} stalled`)\n })\n\n workerInstance.on(\"failed\", (job, err) => {\n console.log(`job ${job?.id ?? \"unknown\"} failed`, err)\n })\n\n await workerInstance.waitUntilReady()\n\n return queue\n}\n\nexport const close = async (): Promise<void> => {\n if (!queueInstance && !workerInstance) return\n try {\n await workerInstance?.close()\n await queueInstance?.close()\n } finally {\n workerInstance = null\n queueInstance = null\n hasStarted = false\n }\n}\n\nexport const getUrl = (): string => getRedisUrl()\n\nexport type ScheduleTaskOptions = Omit<JobOptions, \"repeat\"> & {\n jobId?: string\n repeat: NonNullable<JobOptions[\"repeat\"]>\n}\n\nexport function scheduleTask<TName extends keyof WorkerTasksMap & string>(\n taskName: TName,\n payload: WorkerTasksMap[TName],\n options: ScheduleTaskOptions,\n): Promise<Job>\nexport function scheduleTask(taskName: string, payload: unknown, options: ScheduleTaskOptions): Promise<Job>\nexport async function scheduleTask(taskName: string, payload: unknown, options: ScheduleTaskOptions): Promise<Job> {\n const { jobId, repeat, ...rest } = options\n return add(taskName, payload, {\n ...rest,\n jobId: jobId ?? `schedule|${taskName}`,\n repeat,\n })\n}\n\nconst queueApi = {\n start,\n close,\n registerTask,\n getTasks,\n add,\n scheduleTask,\n getJob,\n getJobs,\n getInstance,\n getUrl,\n}\n\nexport default queueApi\n","import {\n MongoClient,\n type ChangeStream,\n type ChangeStreamDocument,\n type Document,\n type MongoClientOptions,\n} from \"mongodb\"\nimport mongoose from \"mongoose\"\n\nimport queue from \"./queue\"\n\n\nexport type QueueListenerRetryDelays = {\n minMs?: number\n maxMs?: number\n factor?: number\n}\n\nexport type QueueListenerStatus =\n | { state: \"connecting\"; attempt: number }\n | { state: \"ready\" }\n | { state: \"error\"; attempt: number; error: unknown; nextRetryInMs: number }\n | { state: \"failed\"; attempt: number; error: unknown }\n | { state: \"closed\" }\n\nexport type QueueListenerHandle = {\n ready: Promise<void>\n close: () => Promise<void>\n getStatus: () => QueueListenerStatus\n}\n\nexport type QueueListenerOptions = {\n maxRetries?: number | \"infinite\"\n fatalOnMaxRetries?: boolean\n onStateChange?: (status: QueueListenerStatus) => void\n onFatal?: (err: unknown) => void\n retryDelays?: QueueListenerRetryDelays\n mongoClientOptions?: MongoClientOptions\n}\n\nconst RETRY_MAXIMUM_DELAY_MS = 3000\nconst RETRY_MINIMUM_DELAY_MS = 50\nconst RETRY_DEFAULT_FACTOR = 2\n\nconst sleep = async (ms: number, signal?: AbortSignal): Promise<void> => new Promise((resolve) => {\n if (signal?.aborted) {\n resolve()\n return\n }\n\n let timeout: ReturnType<typeof setTimeout> | null = null\n\n const cleanup = () => {\n if (timeout) clearTimeout(timeout)\n signal?.removeEventListener(\"abort\", onAbort)\n }\n\n const onAbort = () => {\n cleanup()\n resolve()\n }\n\n timeout = setTimeout(() => {\n cleanup()\n resolve()\n }, ms)\n timeout.unref?.()\n\n signal?.addEventListener(\"abort\", onAbort)\n})\n\nconst getMongoUrl = (): string => {\n const explicit =\n process.env.MONGODB_URL\n ?? process.env.MONGO_URL\n ?? process.env.MONGODB_URI\n ?? process.env.DB_URL\n\n if (explicit && explicit.trim()) return explicit.trim()\n\n const port = process.env.DB_PORT?.trim()\n if (!port) throw new Error(\"Missing Mongo connection details (MONGODB_URL/MONGO_URL/MONGODB_URI/DB_URL/DB_PORT)\")\n\n const host = process.env.DB_HOST?.trim() || \"localhost\"\n return `mongodb://${host}:${port}`\n}\n\nconst escapeRegex = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n\ntype ModelWithCollection = {\n collection?: {\n collectionName?: string\n name?: string\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null\n\nconst getDocumentId = (doc: unknown): unknown => {\n if (!isRecord(doc)) return undefined\n return doc._id\n}\n\nconst resolveModelNameFromCollection = (collName: string): string | null => {\n const models = mongoose.models\n\n for (const modelName of Object.keys(models)) {\n const model = models[modelName] as ModelWithCollection\n const collectionName =\n model.collection?.collectionName\n ?? model.collection?.name\n\n if (collectionName === collName) {\n return modelName\n }\n }\n\n return null\n}\n\nconst normalizeUpdateDescription = (updateDescription: unknown): unknown => {\n if (!isRecord(updateDescription)) return updateDescription\n if (isRecord(updateDescription.updatedFields)) {\n return {\n ...updateDescription,\n updatedFieldsKeys: Object.keys(updateDescription.updatedFields),\n }\n }\n\n return updateDescription\n}\n\nconst normalizeOpForTaskName = (op: string): string => (op === \"replace\" ? \"update\" : op)\n\nconst dispatchWorkerQueue = async ({\n dbName,\n modelName,\n op,\n doc,\n updateDescription,\n}: {\n dbName: string\n modelName: string\n op: string\n doc: unknown\n updateDescription?: unknown\n}): Promise<void> => {\n const tasks = queue.getTasks()\n const taskOp = normalizeOpForTaskName(op)\n const handlerName = `on-${taskOp}-${modelName}`\n\n if (!tasks[handlerName]) return\n\n const normalizedUpdateDescription = normalizeUpdateDescription(updateDescription)\n\n await queue.add(handlerName, { doc, updateDescription: normalizedUpdateDescription }, {\n jobId: `${dbName}|${taskOp}-${getDocumentId(doc) ?? \"unknown\"}`,\n removeOnComplete: true,\n removeOnFail: true,\n })\n}\n\nconst shouldSkipCollection = (collName: string): boolean =>\n collName.endsWith(\".files\") || collName.endsWith(\".chunks\")\n\nconst INTERNAL_IGNORED_MODEL_NAMES = new Set([\"RBRtsChange\", \"RBRtsCounter\"])\n\nconst INTERNAL_IGNORED_COLLECTION_NAMES = new Set([\"rtschanges\", \"rtscounters\"])\n\nconst normalizeRetryDelays = (input: QueueListenerRetryDelays | undefined): Required<QueueListenerRetryDelays> => {\n const minMs = Math.max(0, Math.floor(input?.minMs ?? RETRY_MINIMUM_DELAY_MS))\n const rawMaxMs = Math.max(0, Math.floor(input?.maxMs ?? RETRY_MAXIMUM_DELAY_MS))\n const maxMs = Math.max(minMs, rawMaxMs)\n const factor = Math.max(1, Number.isFinite(input?.factor) ? (input?.factor ?? RETRY_DEFAULT_FACTOR) : RETRY_DEFAULT_FACTOR)\n return { minMs, maxMs, factor }\n}\n\nconst getRetryDelayMs = (attempt: number, delays: Required<QueueListenerRetryDelays>): number =>\n Math.min(delays.maxMs, Math.round(delays.minMs * Math.pow(delays.factor, Math.max(0, attempt - 1))))\n\nconst normalizeMaxRetries = (value: number | \"infinite\"): number | \"infinite\" => {\n if (value === \"infinite\") return value\n const parsed = Math.floor(value)\n return Number.isFinite(parsed) ? Math.max(0, parsed) : 0\n}\n\nexport const registerQueueListener = async (options: QueueListenerOptions = {}): Promise<QueueListenerHandle> => {\n const maxRetries = normalizeMaxRetries(options.maxRetries ?? \"infinite\")\n const fatalOnMaxRetries = options.fatalOnMaxRetries ?? false\n const retryDelays = normalizeRetryDelays(options.retryDelays)\n\n const appName = process.env.APP_NAME?.trim()\n if (!appName) {\n throw new Error(\"Missing APP_NAME (required to configure the worker DB change listener)\")\n }\n\n const mongoUrl = getMongoUrl()\n const mongoClientOptions: MongoClientOptions = {\n family: 4,\n serverSelectionTimeoutMS: 2000,\n connectTimeoutMS: 2000,\n ...options.mongoClientOptions,\n }\n\n let stopped = false\n const abortController = new AbortController()\n let client: MongoClient | null = null\n let stream: ChangeStream<Document> | null = null\n let resumeAfter: Document | null = null\n let processing = Promise.resolve()\n\n let status: QueueListenerStatus = { state: \"connecting\", attempt: 1 }\n const setStatus = (next: QueueListenerStatus): void => {\n status = next\n try {\n options.onStateChange?.(next)\n } catch (err) {\n console.warn(\"queue listener onStateChange failed\", err)\n }\n }\n\n let readySettled = false\n let readyResolve: (() => void) | null = null\n let readyReject: ((err: unknown) => void) | null = null\n const ready = new Promise<void>((resolve, reject) => {\n readyResolve = resolve\n readyReject = reject\n })\n\n const resolveReady = (): void => {\n if (readySettled) return\n readySettled = true\n readyResolve?.()\n }\n\n const rejectReady = (err: unknown): void => {\n if (readySettled) return\n readySettled = true\n readyReject?.(err)\n }\n\n const isChangeStreamHistoryLost = (err: unknown): boolean => {\n const maybeErr = err as { code?: unknown; codeName?: unknown }\n const code = typeof maybeErr.code === \"number\" ? maybeErr.code : null\n const codeName = typeof maybeErr.codeName === \"string\" ? maybeErr.codeName : \"\"\n const message = err instanceof Error ? err.message : String(err ?? \"\")\n\n return (\n code === 286\n || codeName === \"ChangeStreamHistoryLost\"\n || message.includes(\"ChangeStreamHistoryLost\")\n || message.includes(\"resume token\")\n || message.includes(\"Resume token\")\n || message.includes(\"resume of change stream was not possible\")\n || message.includes(\"cannot resume\")\n )\n }\n\n const close = async (): Promise<void> => {\n stopped = true\n abortController.abort()\n try {\n stream?.removeAllListeners()\n await stream?.close()\n } catch {\n // ignore\n }\n stream = null\n\n try {\n await client?.close()\n } catch {\n // ignore\n }\n client = null\n\n if (!readySettled) {\n rejectReady(new Error(\"queue listener closed before ready\"))\n }\n\n setStatus({ state: \"closed\" })\n }\n\n const closeResources = async (): Promise<void> => {\n try {\n stream?.removeAllListeners()\n await stream?.close()\n } catch {\n // ignore\n }\n stream = null\n\n try {\n await client?.close()\n } catch {\n // ignore\n }\n client = null\n }\n\n const startStream = async (): Promise<{ stoppedPromise: Promise<{ reason: \"close\" | \"error\"; error?: unknown }> }> => {\n if (stopped) return { stoppedPromise: Promise.resolve({ reason: \"close\" }) }\n\n if (stream) {\n try {\n stream.removeAllListeners()\n await stream.close()\n } catch {\n // ignore\n }\n stream = null\n }\n\n if (client) {\n try {\n await client.close()\n } catch {\n // ignore\n }\n client = null\n }\n\n client = new MongoClient(mongoUrl, mongoClientOptions)\n\n await client.connect()\n\n const dbMatch = { \"ns.db\": { $regex: `^${escapeRegex(appName)}-.*-db$` } }\n\n const pipeline: Document[] = [\n { $match: dbMatch },\n {\n $match: {\n operationType: { $in: [\"insert\", \"update\", \"replace\", \"delete\"] },\n }\n },\n { $match: { \"ns.coll\": { $nin: Array.from(INTERNAL_IGNORED_COLLECTION_NAMES) } } },\n ]\n\n stream = client.watch(pipeline, {\n fullDocument: \"updateLookup\",\n ...(resumeAfter ? { resumeAfter } : {}),\n })\n\n const stoppedPromise = new Promise<{ reason: \"close\" | \"error\"; error?: unknown }>((resolve) => {\n let settled = false\n const onAbort = () => settle({ reason: \"close\" })\n\n const settle = (result: { reason: \"close\" | \"error\"; error?: unknown }) => {\n if (settled) return\n settled = true\n abortController.signal.removeEventListener(\"abort\", onAbort)\n resolve(result)\n }\n\n abortController.signal.addEventListener(\"abort\", onAbort)\n stream?.once(\"close\", () => settle({ reason: \"close\" }))\n stream?.once(\"error\", (err) => settle({ reason: \"error\", error: err }))\n })\n\n stream.on(\"change\", (change: ChangeStreamDocument<Document>) => {\n const streamRef = stream\n processing = processing.then(async () => {\n const ns = \"ns\" in change ? change.ns : undefined\n const dbName = String(ns?.db ?? \"\")\n if (!dbName) return\n\n const collName = String(ns && \"coll\" in ns ? ns.coll : \"\")\n if (!collName) return\n if (shouldSkipCollection(collName)) return\n if (INTERNAL_IGNORED_COLLECTION_NAMES.has(collName)) return\n\n const modelName = resolveModelNameFromCollection(collName)\n if (!modelName) return\n if (INTERNAL_IGNORED_MODEL_NAMES.has(modelName)) return\n\n const op = String(change.operationType ?? \"\")\n if (!op) return\n const normalizedOp = normalizeOpForTaskName(op)\n\n let doc = \"fullDocument\" in change ? change.fullDocument : undefined\n if (!doc && normalizedOp === \"delete\") {\n doc = \"documentKey\" in change ? change.documentKey : undefined\n }\n if (!doc) return\n\n const updateDescription = \"updateDescription\" in change ? change.updateDescription : undefined\n\n try {\n await dispatchWorkerQueue({\n dbName,\n modelName,\n op: normalizedOp,\n doc,\n updateDescription,\n })\n\n resumeAfter = change?._id ?? resumeAfter\n } catch (err) {\n console.warn(\"queue listener failed to dispatch change\", err)\n try {\n await streamRef?.close()\n } catch {\n // ignore\n }\n }\n }).catch((err) => {\n console.warn(\"queue listener change handler failed\", err)\n })\n })\n\n stream.on(\"error\", (err) => {\n if (stopped) return\n if (resumeAfter && isChangeStreamHistoryLost(err)) {\n resumeAfter = null\n }\n try {\n void Promise.resolve(stream?.close()).catch(() => {})\n } catch {\n // ignore\n }\n })\n\n return { stoppedPromise }\n }\n\n const run = async (): Promise<void> => {\n let retryCounter = 0\n\n while (!stopped) {\n try {\n setStatus({ state: \"connecting\", attempt: retryCounter + 1 })\n\n const { stoppedPromise } = await startStream()\n retryCounter = 0\n setStatus({ state: \"ready\" })\n resolveReady()\n\n const end = await stoppedPromise\n if (stopped) return\n\n retryCounter += 1\n if (maxRetries !== \"infinite\" && retryCounter > maxRetries) {\n const err = end.reason === \"error\" ? end.error : new Error(\"queue listener closed\")\n setStatus({ state: \"failed\", attempt: retryCounter, error: err })\n if (fatalOnMaxRetries) {\n try {\n options.onFatal?.(err)\n } catch (fatalErr) {\n console.warn(\"queue listener onFatal failed\", fatalErr)\n }\n }\n rejectReady(err)\n abortController.abort()\n await closeResources()\n return\n }\n\n const delayMs = getRetryDelayMs(retryCounter, retryDelays)\n const err = end.reason === \"error\" ? end.error : new Error(\"queue listener closed\")\n console.warn(\"queue listener not ready, retrying in\", delayMs, err)\n setStatus({ state: \"error\", attempt: retryCounter, error: err, nextRetryInMs: delayMs })\n await closeResources()\n await sleep(delayMs, abortController.signal)\n } catch (err) {\n if (stopped) return\n\n retryCounter += 1\n if (maxRetries !== \"infinite\" && retryCounter > maxRetries) {\n setStatus({ state: \"failed\", attempt: retryCounter, error: err })\n if (fatalOnMaxRetries) {\n try {\n options.onFatal?.(err)\n } catch (fatalErr) {\n console.warn(\"queue listener onFatal failed\", fatalErr)\n }\n }\n rejectReady(err)\n abortController.abort()\n await closeResources()\n return\n }\n\n const delayMs = getRetryDelayMs(retryCounter, retryDelays)\n console.warn(\"queue listener not ready, retrying in\", delayMs, err)\n setStatus({ state: \"error\", attempt: retryCounter, error: err, nextRetryInMs: delayMs })\n await closeResources()\n await sleep(delayMs, abortController.signal)\n }\n }\n }\n\n const handle: QueueListenerHandle = {\n ready,\n close,\n getStatus: () => status,\n }\n\n void run().catch(async (err) => {\n if (stopped) return\n setStatus({ state: \"failed\", attempt: 0, error: err })\n rejectReady(err)\n await closeResources()\n })\n\n return handle\n}\n","export type DbEventOp = \"insert\" | \"update\" | \"delete\"\n\nexport type DbEventTaskName<TOp extends DbEventOp = DbEventOp, TModelName extends string = string> =\n `on-${TOp}-${TModelName}`\n\nexport type DbEventTaskPayload<TDoc = unknown, TUpdateDescription = unknown> = {\n doc: TDoc\n updateDescription?: TUpdateDescription\n}\n\nexport const dbEventTaskName = <TOp extends DbEventOp, TModelName extends string>(\n op: TOp,\n modelName: TModelName,\n): DbEventTaskName<TOp, TModelName> => `on-${op}-${modelName}`\n"],"names":["queue","close","err"],"mappings":"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"}
package/dist/queue.d.ts CHANGED
@@ -2,8 +2,8 @@ import { Queue, Job, JobsOptions as JobOptions } from 'bullmq';
2
2
  import { WorkerTasksMap } from './tasksMap';
3
3
  export type TaskHandler<TPayload = unknown> = (payload: TPayload, job: Job) => unknown | Promise<unknown>;
4
4
  export declare function registerTask<TName extends keyof WorkerTasksMap & string>(name: TName, handler: TaskHandler<WorkerTasksMap[TName]>): void;
5
- export declare function registerTask(name: string, handler: TaskHandler<any>): void;
6
- export declare const getTasks: () => Record<string, TaskHandler<any>>;
5
+ export declare function registerTask(name: string, handler: TaskHandler<unknown>): void;
6
+ export declare const getTasks: () => Record<string, TaskHandler<unknown>>;
7
7
  export declare function add<TName extends keyof WorkerTasksMap & string>(taskName: TName, payload: WorkerTasksMap[TName], options?: JobOptions): Promise<Job>;
8
8
  export declare function add(taskName: string, payload: unknown, options?: JobOptions): Promise<Job>;
9
9
  export declare const getJob: (jobId: string) => Promise<Job | null>;
@@ -22,7 +22,7 @@ declare const queueApi: {
22
22
  start: () => Promise<Queue>;
23
23
  close: () => Promise<void>;
24
24
  registerTask: typeof registerTask;
25
- getTasks: () => Record<string, TaskHandler<any>>;
25
+ getTasks: () => Record<string, TaskHandler<unknown>>;
26
26
  add: typeof add;
27
27
  scheduleTask: typeof scheduleTask;
28
28
  getJob: (jobId: string) => Promise<Job | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAU,KAAK,GAAG,EAAE,KAAK,WAAW,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEhF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGhD,MAAM,MAAM,WAAW,CAAC,QAAQ,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AA4CzG,wBAAgB,YAAY,CAAC,KAAK,SAAS,MAAM,cAAc,GAAG,MAAM,EACtE,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,GAC1C,IAAI,CAAA;AACP,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;AAK3E,eAAO,MAAM,QAAQ,QAAO,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAgB,CAAA;AAE3E,wBAAgB,GAAG,CAAC,KAAK,SAAS,MAAM,cAAc,GAAG,MAAM,EAC7D,QAAQ,EAAE,KAAK,EACf,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,EAC9B,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,GAAG,CAAC,CAAA;AACf,wBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;AAK3F,eAAO,MAAM,MAAM,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAgD,CAAA;AAE/G,eAAO,MAAM,OAAO,GAAU,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAG,OAAO,CAAC,GAAG,EAAE,CAC/B,CAAA;AAEpD,eAAO,MAAM,WAAW,QAAO,KAAsB,CAAA;AAErD,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,KAAK,CAgD3C,CAAA;AAED,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAU1C,CAAA;AAED,eAAO,MAAM,MAAM,QAAO,MAAuB,CAAA;AAEjD,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAA;CAC1C,CAAA;AAED,wBAAgB,YAAY,CAAC,KAAK,SAAS,MAAM,cAAc,GAAG,MAAM,EACtE,QAAQ,EAAE,KAAK,EACf,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,EAC9B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,GAAG,CAAC,CAAA;AACf,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;AAU5G,QAAA,MAAM,QAAQ;iBApFiB,OAAO,CAAC,KAAK,CAAC;iBAkDd,OAAO,CAAC,IAAI,CAAC;;oBArEhB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;;;oBAYxB,MAAM,KAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;6KAEM,OAAO,CAAC,GAAG,EAAE,CAAC;uBAGrD,KAAK;kBAgEV,MAAM;CAiC/B,CAAA;AAED,eAAe,QAAQ,CAAA"}
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAU,KAAK,GAAG,EAAE,KAAK,WAAW,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEhF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGhD,MAAM,MAAM,WAAW,CAAC,QAAQ,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AA4CzG,wBAAgB,YAAY,CAAC,KAAK,SAAS,MAAM,cAAc,GAAG,MAAM,EACtE,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,GAC1C,IAAI,CAAA;AACP,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;AAK/E,eAAO,MAAM,QAAQ,QAAO,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAgB,CAAA;AAE/E,wBAAgB,GAAG,CAAC,KAAK,SAAS,MAAM,cAAc,GAAG,MAAM,EAC7D,QAAQ,EAAE,KAAK,EACf,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,EAC9B,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,GAAG,CAAC,CAAA;AACf,wBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;AAK3F,eAAO,MAAM,MAAM,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAgD,CAAA;AAE/G,eAAO,MAAM,OAAO,GAAU,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAG,OAAO,CAAC,GAAG,EAAE,CAC/B,CAAA;AAEpD,eAAO,MAAM,WAAW,QAAO,KAAsB,CAAA;AAErD,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,KAAK,CAgD3C,CAAA;AAED,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAU1C,CAAA;AAED,eAAO,MAAM,MAAM,QAAO,MAAuB,CAAA;AAEjD,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAA;CAC1C,CAAA;AAED,wBAAgB,YAAY,CAAC,KAAK,SAAS,MAAM,cAAc,GAAG,MAAM,EACtE,QAAQ,EAAE,KAAK,EACf,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,EAC9B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,GAAG,CAAC,CAAA;AACf,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;AAU5G,QAAA,MAAM,QAAQ;iBApFiB,OAAO,CAAC,KAAK,CAAC;iBAkDd,OAAO,CAAC,IAAI,CAAC;;oBArEhB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;;;oBAY5B,MAAM,KAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;6KAEM,OAAO,CAAC,GAAG,EAAE,CAAC;uBAGrD,KAAK;kBAgEV,MAAM;CAiC/B,CAAA;AAED,eAAe,QAAQ,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"queueListener.d.ts","sourceRoot":"","sources":["../src/queueListener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,KAAK,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAMhG,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAClB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAA;AAEvB,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,SAAS,EAAE,MAAM,mBAAmB,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAA;IACrD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;IAChC,WAAW,CAAC,EAAE,wBAAwB,CAAA;IACtC,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC,CAAA;AAuID,eAAO,MAAM,qBAAqB,GAAU,UAAS,oBAAyB,KAAG,OAAO,CAAC,mBAAmB,CA4T3G,CAAA"}
1
+ {"version":3,"file":"queueListener.d.ts","sourceRoot":"","sources":["../src/queueListener.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAA;AAMhB,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAClB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAA;AAEvB,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,SAAS,EAAE,MAAM,mBAAmB,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAA;IACrD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;IAChC,WAAW,CAAC,EAAE,wBAAwB,CAAA;IACtC,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC,CAAA;AAqJD,eAAO,MAAM,qBAAqB,GAAU,UAAS,oBAAyB,KAAG,OAAO,CAAC,mBAAmB,CA+T3G,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/worker",
3
- "version": "0.30.0",
3
+ "version": "0.31.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"