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.
- package/README.md +167 -22
- package/dist/Job.d.ts +67 -4
- package/dist/Job.d.ts.map +1 -1
- package/dist/Job.js +76 -3
- package/dist/Job.js.map +1 -1
- package/dist/JobStore.d.ts +174 -3
- package/dist/JobStore.d.ts.map +1 -1
- package/dist/JobStore.js +89 -1
- package/dist/JobStore.js.map +1 -1
- package/dist/MemoryJobStore.d.ts +37 -6
- package/dist/MemoryJobStore.d.ts.map +1 -1
- package/dist/MemoryJobStore.js +201 -25
- package/dist/MemoryJobStore.js.map +1 -1
- package/dist/Worker.d.ts +5 -1
- package/dist/Worker.d.ts.map +1 -1
- package/dist/Worker.js +116 -10
- package/dist/Worker.js.map +1 -1
- package/dist/{drizzle → drizzle-postgres}/DrizzleJobStore.d.ts +18 -2
- package/dist/drizzle-postgres/DrizzleJobStore.d.ts.map +1 -0
- package/dist/{drizzle → drizzle-postgres}/DrizzleJobStore.js +287 -40
- package/dist/drizzle-postgres/DrizzleJobStore.js.map +1 -0
- package/dist/drizzle-postgres/index.d.ts.map +1 -0
- package/dist/drizzle-postgres/index.js.map +1 -0
- package/dist/{drizzle → drizzle-postgres}/schema.d.ts +306 -4
- package/dist/drizzle-postgres/schema.d.ts.map +1 -0
- package/dist/{drizzle → drizzle-postgres}/schema.js +36 -2
- package/dist/drizzle-postgres/schema.js.map +1 -0
- package/dist/redis/RedisJobStore.d.ts +56 -0
- package/dist/redis/RedisJobStore.d.ts.map +1 -0
- package/dist/redis/RedisJobStore.js +385 -0
- package/dist/redis/RedisJobStore.js.map +1 -0
- package/dist/redis/index.d.ts +9 -0
- package/dist/redis/index.d.ts.map +1 -0
- package/dist/redis/index.js +9 -0
- package/dist/redis/index.js.map +1 -0
- package/dist/redis/scripts.d.ts +168 -0
- package/dist/redis/scripts.d.ts.map +1 -0
- package/dist/redis/scripts.js +755 -0
- package/dist/redis/scripts.js.map +1 -0
- package/dist/testing/conformance.d.ts.map +1 -1
- package/dist/testing/conformance.js +332 -3
- package/dist/testing/conformance.js.map +1 -1
- package/package.json +8 -4
- package/src/Job.ts +189 -5
- package/src/JobStore.ts +252 -4
- package/src/MemoryJobStore.ts +273 -26
- package/src/Worker.ts +152 -10
- package/src/{drizzle → drizzle-postgres}/DrizzleJobStore.ts +412 -40
- package/src/{drizzle → drizzle-postgres}/schema.ts +52 -3
- package/src/redis/RedisJobStore.ts +597 -0
- package/src/redis/index.ts +8 -0
- package/src/redis/scripts.ts +862 -0
- package/src/testing/conformance.ts +421 -3
- package/dist/drizzle/DrizzleJobStore.d.ts.map +0 -1
- package/dist/drizzle/DrizzleJobStore.js.map +0 -1
- package/dist/drizzle/index.d.ts.map +0 -1
- package/dist/drizzle/index.js.map +0 -1
- package/dist/drizzle/schema.d.ts.map +0 -1
- package/dist/drizzle/schema.js.map +0 -1
- /package/dist/{drizzle → drizzle-postgres}/index.d.ts +0 -0
- /package/dist/{drizzle → drizzle-postgres}/index.js +0 -0
- /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
|
|
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
|
|
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
|
|
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"}
|