effect-mq 0.1.0 → 0.2.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.
Files changed (62) hide show
  1. package/README.md +167 -22
  2. package/dist/Job.d.ts +67 -4
  3. package/dist/Job.d.ts.map +1 -1
  4. package/dist/Job.js +76 -3
  5. package/dist/Job.js.map +1 -1
  6. package/dist/JobStore.d.ts +174 -3
  7. package/dist/JobStore.d.ts.map +1 -1
  8. package/dist/JobStore.js +89 -1
  9. package/dist/JobStore.js.map +1 -1
  10. package/dist/MemoryJobStore.d.ts +37 -6
  11. package/dist/MemoryJobStore.d.ts.map +1 -1
  12. package/dist/MemoryJobStore.js +201 -25
  13. package/dist/MemoryJobStore.js.map +1 -1
  14. package/dist/Worker.d.ts +5 -1
  15. package/dist/Worker.d.ts.map +1 -1
  16. package/dist/Worker.js +116 -10
  17. package/dist/Worker.js.map +1 -1
  18. package/dist/{drizzle → drizzle-postgres}/DrizzleJobStore.d.ts +18 -2
  19. package/dist/drizzle-postgres/DrizzleJobStore.d.ts.map +1 -0
  20. package/dist/{drizzle → drizzle-postgres}/DrizzleJobStore.js +287 -40
  21. package/dist/drizzle-postgres/DrizzleJobStore.js.map +1 -0
  22. package/dist/drizzle-postgres/index.d.ts.map +1 -0
  23. package/dist/drizzle-postgres/index.js.map +1 -0
  24. package/dist/{drizzle → drizzle-postgres}/schema.d.ts +306 -4
  25. package/dist/drizzle-postgres/schema.d.ts.map +1 -0
  26. package/dist/{drizzle → drizzle-postgres}/schema.js +36 -2
  27. package/dist/drizzle-postgres/schema.js.map +1 -0
  28. package/dist/redis/RedisJobStore.d.ts +56 -0
  29. package/dist/redis/RedisJobStore.d.ts.map +1 -0
  30. package/dist/redis/RedisJobStore.js +385 -0
  31. package/dist/redis/RedisJobStore.js.map +1 -0
  32. package/dist/redis/index.d.ts +9 -0
  33. package/dist/redis/index.d.ts.map +1 -0
  34. package/dist/redis/index.js +9 -0
  35. package/dist/redis/index.js.map +1 -0
  36. package/dist/redis/scripts.d.ts +168 -0
  37. package/dist/redis/scripts.d.ts.map +1 -0
  38. package/dist/redis/scripts.js +755 -0
  39. package/dist/redis/scripts.js.map +1 -0
  40. package/dist/testing/conformance.d.ts.map +1 -1
  41. package/dist/testing/conformance.js +332 -3
  42. package/dist/testing/conformance.js.map +1 -1
  43. package/package.json +8 -4
  44. package/src/Job.ts +189 -5
  45. package/src/JobStore.ts +252 -4
  46. package/src/MemoryJobStore.ts +273 -26
  47. package/src/Worker.ts +152 -10
  48. package/src/{drizzle → drizzle-postgres}/DrizzleJobStore.ts +412 -40
  49. package/src/{drizzle → drizzle-postgres}/schema.ts +52 -3
  50. package/src/redis/RedisJobStore.ts +597 -0
  51. package/src/redis/index.ts +8 -0
  52. package/src/redis/scripts.ts +862 -0
  53. package/src/testing/conformance.ts +421 -3
  54. package/dist/drizzle/DrizzleJobStore.d.ts.map +0 -1
  55. package/dist/drizzle/DrizzleJobStore.js.map +0 -1
  56. package/dist/drizzle/index.d.ts.map +0 -1
  57. package/dist/drizzle/index.js.map +0 -1
  58. package/dist/drizzle/schema.d.ts.map +0 -1
  59. package/dist/drizzle/schema.js.map +0 -1
  60. /package/dist/{drizzle → drizzle-postgres}/index.d.ts +0 -0
  61. /package/dist/{drizzle → drizzle-postgres}/index.js +0 -0
  62. /package/src/{drizzle → drizzle-postgres}/index.ts +0 -0
@@ -9,7 +9,7 @@
9
9
  * // schema.ts
10
10
  * import { mqJobAttempts, mqJobs } from "effect-mq/drizzle"
11
11
  *
12
- * type DurableJobs = typeof SyncBenefits._tag | typeof GenerateReport._tag
12
+ * type DurableJobs = typeof GenerateInvoice._tag | typeof GenerateReport._tag
13
13
  * export const jobs = mqJobs<DurableJobs>()
14
14
  * export const jobAttempts = mqJobAttempts(jobs)
15
15
  * ```
@@ -24,7 +24,7 @@
24
24
  import type * as JobStore from "../JobStore.ts";
25
25
  /**
26
26
  * The jobs table factory. `JobName` types the `name` column — derive it from
27
- * your job definitions: `mqJobs<typeof SyncBenefits._tag | typeof Report._tag>()`.
27
+ * your job definitions: `mqJobs<typeof GenerateInvoice._tag | typeof Report._tag>()`.
28
28
  *
29
29
  * @since 0.1.0
30
30
  */
@@ -227,6 +227,36 @@ export declare const mqJobs: <JobName extends string = string>(tableName?: strin
227
227
  identity: undefined;
228
228
  generated: undefined;
229
229
  }>;
230
+ timeoutMs: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgBigInt53Builder, {
231
+ name: string;
232
+ tableName: string;
233
+ dataType: "number int53";
234
+ data: number;
235
+ driverParam: string | number;
236
+ notNull: false;
237
+ hasDefault: false;
238
+ isPrimaryKey: false;
239
+ isAutoincrement: false;
240
+ hasRuntimeDefault: false;
241
+ enumValues: undefined;
242
+ identity: undefined;
243
+ generated: undefined;
244
+ }>;
245
+ cancelRequested: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBooleanBuilder>>, {
246
+ name: string;
247
+ tableName: string;
248
+ dataType: "boolean";
249
+ data: boolean;
250
+ driverParam: boolean;
251
+ notNull: true;
252
+ hasDefault: true;
253
+ isPrimaryKey: false;
254
+ isAutoincrement: false;
255
+ hasRuntimeDefault: false;
256
+ enumValues: undefined;
257
+ identity: undefined;
258
+ generated: undefined;
259
+ }>;
230
260
  runAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>, {
231
261
  name: string;
232
262
  tableName: string;
@@ -390,11 +420,11 @@ export declare const mqJobAttempts: (jobs: ReturnType<typeof mqJobs<any>>, table
390
420
  identity: undefined;
391
421
  generated: undefined;
392
422
  }>;
393
- outcome: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, "completed" | "failed" | "retried" | "stalled">, {
423
+ outcome: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, "cancelled" | "completed" | "failed" | "retried" | "stalled">, {
394
424
  name: string;
395
425
  tableName: string;
396
426
  dataType: "string";
397
- data: "completed" | "failed" | "retried" | "stalled";
427
+ data: "cancelled" | "completed" | "failed" | "retried" | "stalled";
398
428
  driverParam: string;
399
429
  notNull: true;
400
430
  hasDefault: false;
@@ -453,6 +483,270 @@ export declare const mqJobAttempts: (jobs: ReturnType<typeof mqJobs<any>>, table
453
483
  };
454
484
  dialect: 'pg';
455
485
  }>;
486
+ /**
487
+ * Repeatable-job schedules (one row per `Job.schedule` key).
488
+ *
489
+ * @since 0.2.0
490
+ */
491
+ export declare const mqSchedules: (tableName?: string) => import("drizzle-orm/pg-core").PgTableWithColumns<{
492
+ name: string;
493
+ schema: undefined;
494
+ columns: {
495
+ key: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, JobStore.ScheduleKey>, {
496
+ name: string;
497
+ tableName: string;
498
+ dataType: "string";
499
+ data: JobStore.ScheduleKey;
500
+ driverParam: string;
501
+ notNull: true;
502
+ hasDefault: false;
503
+ isPrimaryKey: false;
504
+ isAutoincrement: false;
505
+ hasRuntimeDefault: false;
506
+ enumValues: undefined;
507
+ identity: undefined;
508
+ generated: undefined;
509
+ }>;
510
+ jobName: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
511
+ name: string;
512
+ tableName: string;
513
+ dataType: "string";
514
+ data: string;
515
+ driverParam: string;
516
+ notNull: true;
517
+ hasDefault: false;
518
+ isPrimaryKey: false;
519
+ isAutoincrement: false;
520
+ hasRuntimeDefault: false;
521
+ enumValues: undefined;
522
+ identity: undefined;
523
+ generated: undefined;
524
+ }>;
525
+ queue: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, JobStore.QueueName>, {
526
+ name: string;
527
+ tableName: string;
528
+ dataType: "string";
529
+ data: JobStore.QueueName;
530
+ driverParam: string;
531
+ notNull: true;
532
+ hasDefault: false;
533
+ isPrimaryKey: false;
534
+ isAutoincrement: false;
535
+ hasRuntimeDefault: false;
536
+ enumValues: undefined;
537
+ identity: undefined;
538
+ generated: undefined;
539
+ }>;
540
+ cron: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>, {
541
+ name: string;
542
+ tableName: string;
543
+ dataType: "string";
544
+ data: string;
545
+ driverParam: string;
546
+ notNull: false;
547
+ hasDefault: false;
548
+ isPrimaryKey: false;
549
+ isAutoincrement: false;
550
+ hasRuntimeDefault: false;
551
+ enumValues: undefined;
552
+ identity: undefined;
553
+ generated: undefined;
554
+ }>;
555
+ tz: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>, {
556
+ name: string;
557
+ tableName: string;
558
+ dataType: "string";
559
+ data: string;
560
+ driverParam: string;
561
+ notNull: false;
562
+ hasDefault: false;
563
+ isPrimaryKey: false;
564
+ isAutoincrement: false;
565
+ hasRuntimeDefault: false;
566
+ enumValues: undefined;
567
+ identity: undefined;
568
+ generated: undefined;
569
+ }>;
570
+ everyMs: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgBigInt53Builder, {
571
+ name: string;
572
+ tableName: string;
573
+ dataType: "number int53";
574
+ data: number;
575
+ driverParam: string | number;
576
+ notNull: false;
577
+ hasDefault: false;
578
+ isPrimaryKey: false;
579
+ isAutoincrement: false;
580
+ hasRuntimeDefault: false;
581
+ enumValues: undefined;
582
+ identity: undefined;
583
+ generated: undefined;
584
+ }>;
585
+ payload: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgJsonbBuilder, {
586
+ name: string;
587
+ tableName: string;
588
+ dataType: "object json";
589
+ data: unknown;
590
+ driverParam: unknown;
591
+ notNull: false;
592
+ hasDefault: false;
593
+ isPrimaryKey: false;
594
+ isAutoincrement: false;
595
+ hasRuntimeDefault: false;
596
+ enumValues: undefined;
597
+ identity: undefined;
598
+ generated: undefined;
599
+ }>;
600
+ metadata: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgJsonbBuilder>>, Record<string, string>>, {
601
+ name: string;
602
+ tableName: string;
603
+ dataType: "object json";
604
+ data: Record<string, string>;
605
+ driverParam: unknown;
606
+ notNull: true;
607
+ hasDefault: true;
608
+ isPrimaryKey: false;
609
+ isAutoincrement: false;
610
+ hasRuntimeDefault: false;
611
+ enumValues: undefined;
612
+ identity: undefined;
613
+ generated: undefined;
614
+ }>;
615
+ priority: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>>, {
616
+ name: string;
617
+ tableName: string;
618
+ dataType: "number int32";
619
+ data: number;
620
+ driverParam: string | number;
621
+ notNull: true;
622
+ hasDefault: true;
623
+ isPrimaryKey: false;
624
+ isAutoincrement: false;
625
+ hasRuntimeDefault: false;
626
+ enumValues: undefined;
627
+ identity: undefined;
628
+ generated: undefined;
629
+ }>;
630
+ attemptsMax: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>, {
631
+ name: string;
632
+ tableName: string;
633
+ dataType: "number int32";
634
+ data: number;
635
+ driverParam: string | number;
636
+ notNull: true;
637
+ hasDefault: false;
638
+ isPrimaryKey: false;
639
+ isAutoincrement: false;
640
+ hasRuntimeDefault: false;
641
+ enumValues: undefined;
642
+ identity: undefined;
643
+ generated: undefined;
644
+ }>;
645
+ backoff: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").PgJsonbBuilder, JobStore.BackoffPolicy>, {
646
+ name: string;
647
+ tableName: string;
648
+ dataType: "object json";
649
+ data: JobStore.BackoffPolicy;
650
+ driverParam: unknown;
651
+ notNull: false;
652
+ hasDefault: false;
653
+ isPrimaryKey: false;
654
+ isAutoincrement: false;
655
+ hasRuntimeDefault: false;
656
+ enumValues: undefined;
657
+ identity: undefined;
658
+ generated: undefined;
659
+ }>;
660
+ keep: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").PgJsonbBuilder, JobStore.KeepPolicy>, {
661
+ name: string;
662
+ tableName: string;
663
+ dataType: "object json";
664
+ data: JobStore.KeepPolicy;
665
+ driverParam: unknown;
666
+ notNull: false;
667
+ hasDefault: false;
668
+ isPrimaryKey: false;
669
+ isAutoincrement: false;
670
+ hasRuntimeDefault: false;
671
+ enumValues: undefined;
672
+ identity: undefined;
673
+ generated: undefined;
674
+ }>;
675
+ timeoutMs: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgBigInt53Builder, {
676
+ name: string;
677
+ tableName: string;
678
+ dataType: "number int53";
679
+ data: number;
680
+ driverParam: string | number;
681
+ notNull: false;
682
+ hasDefault: false;
683
+ isPrimaryKey: false;
684
+ isAutoincrement: false;
685
+ hasRuntimeDefault: false;
686
+ enumValues: undefined;
687
+ identity: undefined;
688
+ generated: undefined;
689
+ }>;
690
+ nextRunAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>, {
691
+ name: string;
692
+ tableName: string;
693
+ dataType: "object date";
694
+ data: Date;
695
+ driverParam: string;
696
+ notNull: true;
697
+ hasDefault: false;
698
+ isPrimaryKey: false;
699
+ isAutoincrement: false;
700
+ hasRuntimeDefault: false;
701
+ enumValues: undefined;
702
+ identity: undefined;
703
+ generated: undefined;
704
+ }>;
705
+ };
706
+ dialect: 'pg';
707
+ }>;
708
+ /**
709
+ * Durable queue control flags (pause/resume).
710
+ *
711
+ * @since 0.2.0
712
+ */
713
+ export declare const mqQueueControl: (tableName?: string) => import("drizzle-orm/pg-core").PgTableWithColumns<{
714
+ name: string;
715
+ schema: undefined;
716
+ columns: {
717
+ queue: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, JobStore.QueueName>, {
718
+ name: string;
719
+ tableName: string;
720
+ dataType: "string";
721
+ data: JobStore.QueueName;
722
+ driverParam: string;
723
+ notNull: true;
724
+ hasDefault: false;
725
+ isPrimaryKey: false;
726
+ isAutoincrement: false;
727
+ hasRuntimeDefault: false;
728
+ enumValues: undefined;
729
+ identity: undefined;
730
+ generated: undefined;
731
+ }>;
732
+ paused: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBooleanBuilder>>, {
733
+ name: string;
734
+ tableName: string;
735
+ dataType: "boolean";
736
+ data: boolean;
737
+ driverParam: boolean;
738
+ notNull: true;
739
+ hasDefault: true;
740
+ isPrimaryKey: false;
741
+ isAutoincrement: false;
742
+ hasRuntimeDefault: false;
743
+ enumValues: undefined;
744
+ identity: undefined;
745
+ generated: undefined;
746
+ }>;
747
+ };
748
+ dialect: 'pg';
749
+ }>;
456
750
  /**
457
751
  * @since 0.1.0
458
752
  */
@@ -461,4 +755,12 @@ export type MqJobsTable = ReturnType<typeof mqJobs<any>>;
461
755
  * @since 0.1.0
462
756
  */
463
757
  export type MqJobAttemptsTable = ReturnType<typeof mqJobAttempts>;
758
+ /**
759
+ * @since 0.2.0
760
+ */
761
+ export type MqSchedulesTable = ReturnType<typeof mqSchedules>;
762
+ /**
763
+ * @since 0.2.0
764
+ */
765
+ export type MqQueueControlTable = ReturnType<typeof mqQueueControl>;
464
766
  //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/drizzle-postgres/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAW/C;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,OAAO,SAAS,MAAM,GAAG,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+ClD,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,aAAa,SAClB,UAAU,CAAC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYlC,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBpB,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIvB,CAAA;AAEJ;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAExD;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAA;AAEjE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAA;AAE7D;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA"}
@@ -1,8 +1,8 @@
1
1
  import { sql } from "drizzle-orm";
2
- import { bigint, index, integer, jsonb, pgTable, primaryKey, text, timestamp } from "drizzle-orm/pg-core";
2
+ import { bigint, boolean, index, integer, jsonb, pgTable, primaryKey, text, timestamp } from "drizzle-orm/pg-core";
3
3
  /**
4
4
  * The jobs table factory. `JobName` types the `name` column — derive it from
5
- * your job definitions: `mqJobs<typeof SyncBenefits._tag | typeof Report._tag>()`.
5
+ * your job definitions: `mqJobs<typeof GenerateInvoice._tag | typeof Report._tag>()`.
6
6
  *
7
7
  * @since 0.1.0
8
8
  */
@@ -21,6 +21,8 @@ export const mqJobs = (tableName = "effect_mq_jobs") => pgTable(tableName, {
21
21
  stalledCount: integer("stalled_count").notNull().default(0),
22
22
  backoff: jsonb("backoff").$type(),
23
23
  keep: jsonb("keep").$type(),
24
+ timeoutMs: bigint("timeout_ms", { mode: "number" }),
25
+ cancelRequested: boolean("cancel_requested").notNull().default(false),
24
26
  runAt: timestamp("run_at", { withTimezone: true, mode: "date" }).notNull(),
25
27
  enqueuedAt: timestamp("enqueued_at", { withTimezone: true, mode: "date" }).notNull(),
26
28
  processedAt: timestamp("processed_at", { withTimezone: true, mode: "date" }),
@@ -65,4 +67,36 @@ export const mqJobAttempts = (jobs, tableName = "effect_mq_job_attempts") => pgT
65
67
  }, (table) => [
66
68
  primaryKey({ columns: [table.jobId, table.attempt] })
67
69
  ]);
70
+ /**
71
+ * Repeatable-job schedules (one row per `Job.schedule` key).
72
+ *
73
+ * @since 0.2.0
74
+ */
75
+ export const mqSchedules = (tableName = "effect_mq_schedules") => pgTable(tableName, {
76
+ key: text("key").primaryKey().$type(),
77
+ jobName: text("job_name").notNull(),
78
+ queue: text("queue").notNull().$type(),
79
+ cron: text("cron"),
80
+ tz: text("tz"),
81
+ everyMs: bigint("every_ms", { mode: "number" }),
82
+ payload: jsonb("payload"),
83
+ metadata: jsonb("metadata").notNull().default({}).$type(),
84
+ priority: integer("priority").notNull().default(0),
85
+ attemptsMax: integer("attempts_max").notNull(),
86
+ backoff: jsonb("backoff").$type(),
87
+ keep: jsonb("keep").$type(),
88
+ timeoutMs: bigint("timeout_ms", { mode: "number" }),
89
+ nextRunAt: timestamp("next_run_at", { withTimezone: true, mode: "date" }).notNull()
90
+ }, (table) => [
91
+ index(`${tableName}_due_idx`).on(table.nextRunAt)
92
+ ]);
93
+ /**
94
+ * Durable queue control flags (pause/resume).
95
+ *
96
+ * @since 0.2.0
97
+ */
98
+ export const mqQueueControl = (tableName = "effect_mq_queue_control") => pgTable(tableName, {
99
+ queue: text("queue").primaryKey().$type(),
100
+ paused: boolean("paused").notNull().default(false)
101
+ });
68
102
  //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/drizzle-postgres/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * A Redis-backed `JobStore` built on `effect/unstable/persistence`'s `Redis`
3
+ * service. Every mutation is a single Lua script (see `scripts.ts`), so all
4
+ * `JobStore` operations are atomic on the server and safe across processes.
5
+ *
6
+ * Provide the `Redis` service from your platform package — `NodeRedis.layer`
7
+ * (`@effect/platform-node`, node-redis), `BunRedis.layer`
8
+ * (`@effect/platform-bun`, `Bun.redis`) — or `Redis.make` over any client.
9
+ *
10
+ * Wake-ups ride the client's pub/sub channel, so workers in other processes
11
+ * pick jobs up promptly; the worker's `pollInterval` is the fallback.
12
+ *
13
+ * @since 0.2.0
14
+ */
15
+ import { type Context, Duration, Effect, Layer, type Scope } from "effect";
16
+ import { Redis } from "effect/unstable/persistence";
17
+ import * as JobStore from "../JobStore.ts";
18
+ /**
19
+ * @since 0.2.0
20
+ */
21
+ export interface RedisJobStoreOptions {
22
+ /** Key prefix for everything this store writes (default `effect-mq`). */
23
+ readonly prefix?: string | undefined;
24
+ /**
25
+ * Store-level retention ceiling: terminal records older than this are
26
+ * removed by a periodic sweep. Per-job `keep` may only be stricter.
27
+ */
28
+ readonly historyTtl?: Duration.Input | undefined;
29
+ /** History sweep cadence (default 1 minute). */
30
+ readonly historySweepInterval?: Duration.Input | undefined;
31
+ /**
32
+ * Generator for store-assigned job ids (e.g. `() => \`job_${ulid()}\``).
33
+ * Default: `j-<n>` from the store's counter. See `JobStore.IdGenerator`.
34
+ */
35
+ readonly idGenerator?: JobStore.IdGenerator | undefined;
36
+ }
37
+ /**
38
+ * Build a `RedisJobStore` service. Needs the `Redis` service and a `Scope`
39
+ * (the wake-up subscription and the optional history sweeper live in it).
40
+ *
41
+ * @since 0.2.0
42
+ */
43
+ export declare const make: (options?: RedisJobStoreOptions | undefined) => Effect.Effect<JobStore.Service, never, Redis.Redis | Scope.Scope>;
44
+ /**
45
+ * A Redis-backed layer for the default `JobStore`.
46
+ *
47
+ * @since 0.2.0
48
+ */
49
+ export declare const layer: (options?: RedisJobStoreOptions | undefined) => Layer.Layer<JobStore.JobStore, never, Redis.Redis>;
50
+ /**
51
+ * A Redis-backed layer for a specific named store key.
52
+ *
53
+ * @since 0.2.0
54
+ */
55
+ export declare const layerFor: <StoreId>(store: Context.Key<StoreId, JobStore.Service>, options?: RedisJobStoreOptions | undefined) => Layer.Layer<StoreId, never, Redis.Redis>;
56
+ //# sourceMappingURL=RedisJobStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisJobStore.d.ts","sourceRoot":"","sources":["../../src/redis/RedisJobStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAS,KAAK,OAAO,EAAY,QAAQ,EAAE,MAAM,EAAQ,KAAK,EAA2B,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC1H,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAA;AACnD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAG1C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAChD,gDAAgD;IAChD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAC1D;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAA;CACxD;AAoFD;;;;;GAKG;AACH,eAAO,MAAM,IAAI,aACL,oBAAoB,GAAG,SAAS,KACzC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAgc/D,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,KAAK,aACN,oBAAoB,GAAG,SAAS,KACzC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAmD,CAAA;AAEvG;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,SACvB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,YACnC,oBAAoB,GAAG,SAAS,KACzC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAuC,CAAA"}