@falcondev-oss/workflow 0.7.3 → 0.8.1

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.d.mts CHANGED
@@ -4,7 +4,7 @@ import { Meter, Span } from "@opentelemetry/api";
4
4
  import { SuperJSONResult } from "superjson";
5
5
  import { Options } from "p-retry";
6
6
  import { StandardSchemaV1 } from "@standard-schema/spec";
7
- import { AddOptions, Job, Queue, QueueOptions, WorkerOptions } from "groupmq";
7
+ import { AddOptions, Job, Queue, QueueOptions, Worker, WorkerOptions } from "groupmq";
8
8
  import { Except, IsUnknown, SetOptional, Tagged } from "type-fest";
9
9
 
10
10
  //#region src/settings.d.ts
@@ -103,18 +103,21 @@ type WorkflowWorkerOptions<Input> = Except<WorkerOptions<WorkflowJobPayloadInter
103
103
  };
104
104
  };
105
105
  declare class Workflow<RunInput, Input, Output> {
106
- id: string;
107
- private opts;
108
- private queue?;
106
+ 'id': string;
107
+ private 'opts';
108
+ private 'queue'?;
109
+ '~internal': {
110
+ getOrCreateQueue: () => Promise<WorkflowQueueInternal<Input>>;
111
+ };
109
112
  constructor(opts: WorkflowOptions<RunInput, Input, Output>);
110
- work(opts?: WorkflowWorkerOptions<Input>): Promise<this>;
111
- run(input: RunInput, opts?: WorkflowJobRunOptions<Input>): Promise<WorkflowJob<Output>>;
112
- runIn(input: RunInput, delayMs: number, opts?: WorkflowJobRunOptions<Input>): Promise<WorkflowJob<Output>>;
113
- runAt(input: RunInput, date: Date, opts?: WorkflowJobRunOptions<Input>): Promise<WorkflowJob<Output>>;
114
- runCron(scheduleId: string, cron: string, input: RunInput, opts?: WorkflowJobRunOptions<Input>): Promise<WorkflowJob<Output>>;
115
- runEvery(scheduleId: string, everyMs: number, input: RunInput, opts?: WorkflowJobRunOptions<Input>): Promise<WorkflowJob<Output>>;
116
- private getOrCreateQueue;
117
- private setupMetrics;
113
+ 'work'(opts?: WorkflowWorkerOptions<Input>): Promise<Worker<WorkflowJobPayloadInternal<Input>>>;
114
+ 'run'(input: RunInput, opts?: WorkflowJobRunOptions<Input>): Promise<WorkflowJob<Output>>;
115
+ 'runIn'(input: RunInput, delayMs: number, opts?: WorkflowJobRunOptions<Input>): Promise<WorkflowJob<Output>>;
116
+ 'runAt'(input: RunInput, date: Date, opts?: WorkflowJobRunOptions<Input>): Promise<WorkflowJob<Output>>;
117
+ 'runCron'(scheduleId: string, cron: string, input: RunInput, opts?: WorkflowJobRunOptions<Input>): Promise<WorkflowJob<Output>>;
118
+ 'runEvery'(scheduleId: string, everyMs: number, input: RunInput, opts?: WorkflowJobRunOptions<Input>): Promise<WorkflowJob<Output>>;
119
+ private 'getOrCreateQueue';
120
+ private 'setupMetrics';
118
121
  }
119
122
  interface WorkflowRunContext<Input> {
120
123
  input: IsUnknown<Input> extends true ? undefined : Input;
package/dist/index.mjs CHANGED
@@ -9706,18 +9706,19 @@ var WorkflowStep = class WorkflowStep {
9706
9706
  //#endregion
9707
9707
  //#region src/workflow.ts
9708
9708
  var Workflow = class {
9709
- id;
9710
- opts;
9711
- queue;
9712
- constructor(opts) {
9709
+ "id";
9710
+ "opts";
9711
+ "queue";
9712
+ "~internal" = { getOrCreateQueue: this.getOrCreateQueue.bind(this) };
9713
+ "constructor"(opts) {
9713
9714
  this.id = opts.id;
9714
9715
  this.opts = opts;
9715
9716
  }
9716
- async work(opts) {
9717
+ async "work"(opts) {
9717
9718
  const queue = await this.getOrCreateQueue();
9718
9719
  const worker = new Worker({
9719
9720
  handler: async (job) => {
9720
- Settings.logger?.info?.(`Processing workflow job ${job.id} of workflow ${this.opts.id}`);
9721
+ Settings.logger?.info?.(`[${this.opts.id}] Processing job ${job.id} `);
9721
9722
  const jobId = job.id;
9722
9723
  if (!jobId) throw new Error("Job ID is missing");
9723
9724
  const deserializedData = deserialize$1(job.data);
@@ -9741,7 +9742,7 @@ var Workflow = class {
9741
9742
  span
9742
9743
  });
9743
9744
  const end = performance.now();
9744
- Settings.logger?.success?.(`Completed workflow job ${job.id} of workflow ${this.opts.id} in ${(end - start).toFixed(2)} ms`);
9745
+ Settings.logger?.success?.(`[${this.opts.id}] Completed job ${job.id} in ${(end - start).toFixed(2)} ms`);
9745
9746
  return serialize$1(result);
9746
9747
  }, propagation.extract(ROOT_CONTEXT, deserializedData.tracingHeaders));
9747
9748
  },
@@ -9749,24 +9750,22 @@ var Workflow = class {
9749
9750
  ...this.opts.workerOptions,
9750
9751
  ...opts
9751
9752
  });
9752
- worker.on("ready", () => {
9753
- Settings.logger?.info?.(`Worker started for workflow ${this.opts.id}`);
9754
- });
9755
9753
  worker.on("failed", (job) => {
9756
- Settings.logger?.info?.(`Workflow job ${job.id} of workflow ${this.opts.id} failed`);
9754
+ Settings.logger?.info?.(`[${this.opts.id}] Job ${job.id} failed`);
9757
9755
  });
9758
9756
  worker.on("error", (error) => {
9759
- Settings.logger?.error?.(`Error during worker startup for workflow ${this.opts.id}:`, error);
9757
+ Settings.logger?.error?.(`[${this.opts.id}] Error during worker startup:`, error);
9760
9758
  });
9759
+ Settings.logger?.info?.(`[${this.opts.id}] Worker started`);
9761
9760
  const metricsOpts = opts?.metrics ?? this.opts.workerOptions?.metrics ?? Settings.metrics;
9762
9761
  if (metricsOpts) await this.setupMetrics(metricsOpts);
9763
9762
  asyncExitHook(async (signal) => {
9764
- Settings.logger?.info?.(`Received ${signal}, shutting down worker for workflow ${this.opts.id}...`);
9763
+ Settings.logger?.info?.(`[${this.opts.id}] Received ${signal}, shutting down worker...`);
9765
9764
  await worker.close();
9766
9765
  }, { wait: 1e4 });
9767
- return this;
9766
+ return worker;
9768
9767
  }
9769
- async run(input, opts) {
9768
+ async "run"(input, opts) {
9770
9769
  const parsedInput = this.opts.schema && await this.opts.schema["~standard"].validate(input);
9771
9770
  if (parsedInput?.issues) throw new Error("Invalid workflow input");
9772
9771
  const queue = await this.getOrCreateQueue();
@@ -9790,33 +9789,33 @@ var Workflow = class {
9790
9789
  }) });
9791
9790
  });
9792
9791
  }
9793
- async runIn(input, delayMs, opts) {
9792
+ async "runIn"(input, delayMs, opts) {
9794
9793
  return this.run(input, {
9795
9794
  delay: delayMs,
9796
9795
  ...opts
9797
9796
  });
9798
9797
  }
9799
- async runAt(input, date, opts) {
9798
+ async "runAt"(input, date, opts) {
9800
9799
  return this.run(input, {
9801
9800
  runAt: date,
9802
9801
  ...opts
9803
9802
  });
9804
9803
  }
9805
- async runCron(scheduleId, cron, input, opts) {
9804
+ async "runCron"(scheduleId, cron, input, opts) {
9806
9805
  return this.run(input, {
9807
9806
  groupId: scheduleId,
9808
9807
  repeat: { pattern: cron },
9809
9808
  ...opts
9810
9809
  });
9811
9810
  }
9812
- async runEvery(scheduleId, everyMs, input, opts) {
9811
+ async "runEvery"(scheduleId, everyMs, input, opts) {
9813
9812
  return this.run(input, {
9814
9813
  groupId: scheduleId,
9815
9814
  repeat: { every: everyMs },
9816
9815
  ...opts
9817
9816
  });
9818
9817
  }
9819
- async getOrCreateQueue() {
9818
+ async "getOrCreateQueue"() {
9820
9819
  if (!this.queue) this.queue = new Queue({
9821
9820
  namespace: this.opts.id,
9822
9821
  redis: this.opts.redis ?? await defaultRedisConnection(),
@@ -9825,7 +9824,7 @@ var Workflow = class {
9825
9824
  });
9826
9825
  return this.queue;
9827
9826
  }
9828
- async setupMetrics({ meter, prefix }) {
9827
+ async "setupMetrics"({ meter, prefix }) {
9829
9828
  const attributes = { workflow_id: this.opts.id };
9830
9829
  const queue = await this.getOrCreateQueue();
9831
9830
  const completedJobsGauge = meter.createObservableGauge(`${prefix}_workflow_completed_jobs`, { description: "Number of completed workflow jobs" });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@falcondev-oss/workflow",
3
3
  "type": "module",
4
- "version": "0.7.3",
4
+ "version": "0.8.1",
5
5
  "description": "Simple type-safe queue worker with durable execution using Redis.",
6
6
  "license": "MIT",
7
7
  "repository": "github:falcondev-oss/workflow",