All files / plainweb/src/task inmemory.ts

100% Statements 41/41
100% Branches 11/11
100% Functions 5/5
100% Lines 41/41

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 521x             1x     1x   1x 1x 10x 10x 10x 1x 24x 24x 24x 24x 22x 22x 24x 24x 24x 24x 1x 9x 9x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 1x   1x 7x 7x 7x 7x 7x  
import {
  type DefineTaskOpts,
  type PersistedTask,
  type Task,
  type TaskStorage,
  composePersistedTask,
  defineTaskWithAdapter,
} from "./task";
 
// only used for testing
export const inmemoryTasks = new Map<string, PersistedTask<unknown>>();
 
const InmemoryAdapter: TaskStorage<unknown> = {
  async enqueue({ data, name }) {
    const persistedTask = composePersistedTask({ data, name });
    inmemoryTasks.set(persistedTask.id, persistedTask);
  },
  async fetch({ name, batchSize, maxRetries, retryIntervall }) {
    const result = Array.from(inmemoryTasks.values())
      .filter(
        ({ name: taskName, failedNr, failedLast }) =>
          taskName === name &&
          (failedNr ?? 0) <= maxRetries &&
          (failedLast ?? 0) <= Date.now() - retryIntervall,
      )
      .slice(0, batchSize);
    return result;
  },
  async success({ task }) {
    inmemoryTasks.delete(task.id);
  },
  async failure({ task, err }) {
    inmemoryTasks.set(task.id, {
      ...task,
      failedNr: (task.failedNr ?? 0) + 1,
      failedLast: Date.now(),
      failedError: JSON.stringify({
        instance: (err as Error).constructor.name,
        message: (err as Error).message,
        stack: (err as Error).stack,
      }),
    });
  },
};
 
export function defineInmemoryTask<T>(opts: DefineTaskOpts<T>): Task<T> {
  return defineTaskWithAdapter(
    InmemoryAdapter,
    opts as DefineTaskOpts<unknown>,
  );
}