@effit/workers
v0.1.0-alpha.7
Published
BullMQ-backed jobs and workers for the Effit framework.
Readme
@effit/workers
BullMQ-backed jobs and workers for the Effit framework.
Provides Job.make / Worker.make factories, a WorkerRunner that picks workers via CLI args, and per-app QueueRegistry + QueuingService tags that inherit your worker map's types.
Installation
pnpm add @effit/workers @effit/core effect bullmq temporal-polyfillDefining jobs and workers
import { Effect, Schema } from 'effect';
import { Job } from '@effit/workers/Job.js';
import { Worker } from '@effit/workers/Worker.js';
const ProvisionJobData = Schema.Struct({ evaluationId: Schema.String });
export const ProvisionJob = Job.make(
'ProvisionEvaluation',
ProvisionJobData,
Effect.gen(function* () {
// Setup runs once per process
return (bullJob) =>
Effect.gen(function* () {
// Runs per job
});
}),
);
export const EvaluationWorker = Worker.make('Evaluation', [ProvisionJob]);Registering and enqueuing
import { QueueRegistry as EffitQueueRegistry } from '@effit/workers/QueueRegistry.js';
import { QueuingService as EffitQueuingService } from '@effit/workers/QueuingService.js';
import { WorkerRunner as EffitWorkerRunner } from '@effit/workers/WorkerRunner.js';
export const workers = {
[EvaluationWorker.name]: EvaluationWorker,
} as const;
export type Workers = typeof workers;
// Typed against the worker map; provide `.Default` in your container.
export const QueueRegistry = EffitQueueRegistry.make(workers);
export const QueuingService = EffitQueuingService.make(workers);
export const WorkerRunner = EffitWorkerRunner.make(workers);
// In a use case:
const queues = yield* QueuingService;
yield* queues.add('Evaluation', ProvisionJob.make({ evaluationId }), { attempts: 3 });Wire RedisConfig from your app config:
import { Layer, Effect } from 'effect';
import { RedisConfig } from '@effit/workers/RedisConfig.js';
const RedisConfigLive = Layer.effect(
RedisConfig,
Effect.gen(function* () {
const appConfig = yield* AppConfig;
return { host: appConfig.redis.host, port: appConfig.redis.port };
}),
);License
MIT © Talysson de Oliveira Cassiano
