effect-mq 0.4.1 → 0.5.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 (52) hide show
  1. package/README.md +2 -0
  2. package/dist/Job.d.ts +34 -4
  3. package/dist/Job.d.ts.map +1 -1
  4. package/dist/Job.js +9 -1
  5. package/dist/Job.js.map +1 -1
  6. package/dist/JobSchedules.d.ts +112 -0
  7. package/dist/JobSchedules.d.ts.map +1 -0
  8. package/dist/JobSchedules.js +106 -0
  9. package/dist/JobSchedules.js.map +1 -0
  10. package/dist/JobStore.d.ts +8 -0
  11. package/dist/JobStore.d.ts.map +1 -1
  12. package/dist/JobStore.js.map +1 -1
  13. package/dist/MemoryJobStore.d.ts.map +1 -1
  14. package/dist/MemoryJobStore.js +2 -1
  15. package/dist/MemoryJobStore.js.map +1 -1
  16. package/dist/Worker.d.ts +29 -1
  17. package/dist/Worker.d.ts.map +1 -1
  18. package/dist/Worker.js +51 -0
  19. package/dist/Worker.js.map +1 -1
  20. package/dist/drizzle-postgres/DrizzleJobStore.d.ts.map +1 -1
  21. package/dist/drizzle-postgres/DrizzleJobStore.js +9 -4
  22. package/dist/drizzle-postgres/DrizzleJobStore.js.map +1 -1
  23. package/dist/drizzle-postgres/schema.d.ts +17 -0
  24. package/dist/drizzle-postgres/schema.d.ts.map +1 -1
  25. package/dist/drizzle-postgres/schema.js +2 -0
  26. package/dist/drizzle-postgres/schema.js.map +1 -1
  27. package/dist/index.d.ts +7 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +7 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/redis/RedisJobStore.d.ts.map +1 -1
  32. package/dist/redis/RedisJobStore.js +2 -1
  33. package/dist/redis/RedisJobStore.js.map +1 -1
  34. package/dist/redis/scripts.d.ts +1 -1
  35. package/dist/redis/scripts.d.ts.map +1 -1
  36. package/dist/redis/scripts.js +5 -3
  37. package/dist/redis/scripts.js.map +1 -1
  38. package/dist/testing/conformance.d.ts.map +1 -1
  39. package/dist/testing/conformance.js +37 -0
  40. package/dist/testing/conformance.js.map +1 -1
  41. package/package.json +2 -1
  42. package/src/Job.ts +45 -5
  43. package/src/JobSchedules.ts +223 -0
  44. package/src/JobStore.ts +8 -0
  45. package/src/MemoryJobStore.ts +2 -1
  46. package/src/Worker.ts +92 -0
  47. package/src/drizzle-postgres/DrizzleJobStore.ts +10 -4
  48. package/src/drizzle-postgres/schema.ts +2 -0
  49. package/src/index.ts +8 -0
  50. package/src/redis/RedisJobStore.ts +2 -0
  51. package/src/redis/scripts.ts +5 -2
  52. package/src/testing/conformance.ts +44 -0
@@ -805,6 +805,7 @@ export const jobStoreConformance = (
805
805
  backoff: { _tag: "fixed", delayMs: 1_000 },
806
806
  keep: undefined,
807
807
  timeoutMs: 5_000,
808
+ group: undefined,
808
809
  nextRunAt: 60_000
809
810
  }
810
811
  yield* store.upsertSchedule(schedule)
@@ -847,9 +848,49 @@ export const jobStoreConformance = (
847
848
  backoff: undefined,
848
849
  keep: undefined,
849
850
  timeoutMs: undefined,
851
+ group: undefined,
850
852
  nextRunAt: 60_000
851
853
  })
852
854
 
855
+ it.effect("schedule group labels persist and filter listSchedules", () =>
856
+ withStore((store) =>
857
+ Effect.gen(function*() {
858
+ const base = minutelySchedule()
859
+ yield* store.upsertSchedule({
860
+ ...base,
861
+ key: JobStore.ScheduleKey("TestJob/labeled"),
862
+ group: "svc-a"
863
+ })
864
+ yield* store.upsertSchedule({
865
+ ...base,
866
+ key: JobStore.ScheduleKey("TestJob/other"),
867
+ group: "svc-b"
868
+ })
869
+ yield* store.upsertSchedule({ ...base, key: JobStore.ScheduleKey("TestJob/plain") })
870
+
871
+ const labeled = yield* store.listSchedules({ group: "svc-a" })
872
+ expect(labeled.map((schedule) => schedule.key)).toEqual(["TestJob/labeled"])
873
+ expect(labeled[0]?.group).toBe("svc-a")
874
+
875
+ const all = yield* store.listSchedules()
876
+ expect(all).toHaveLength(3)
877
+ expect(all.find((schedule) => schedule.key === "TestJob/plain")?.group).toBeUndefined()
878
+
879
+ // Re-upsert relabels; an unchanged cadence still keeps its next
880
+ // occurrence (the reconciler re-registers on every startup).
881
+ yield* store.upsertSchedule({
882
+ ...base,
883
+ key: JobStore.ScheduleKey("TestJob/labeled"),
884
+ group: "svc-c",
885
+ nextRunAt: 999_999
886
+ })
887
+ const relabeled = yield* store.listSchedules({ group: "svc-c" })
888
+ expect(relabeled.map((schedule) => schedule.key)).toEqual(["TestJob/labeled"])
889
+ expect(relabeled[0]?.nextRunAt).toBe(60_000)
890
+ expect(yield* store.listSchedules({ group: "svc-a" })).toEqual([])
891
+ })
892
+ ))
893
+
853
894
  it.effect("tickSchedule fires a slot exactly once and advances atomically", () =>
854
895
  withStore((store) =>
855
896
  Effect.gen(function*() {
@@ -1226,6 +1267,7 @@ export const jobStoreConformance = (
1226
1267
  backoff: undefined,
1227
1268
  keep: undefined,
1228
1269
  timeoutMs: undefined,
1270
+ group: undefined,
1229
1271
  nextRunAt: 60_000
1230
1272
  }
1231
1273
  yield* store.upsertSchedule(base)
@@ -1261,6 +1303,7 @@ export const jobStoreConformance = (
1261
1303
  backoff: undefined,
1262
1304
  keep: undefined,
1263
1305
  timeoutMs: undefined,
1306
+ group: undefined,
1264
1307
  nextRunAt: 90_000
1265
1308
  }
1266
1309
  const cronSchedule: JobStore.ScheduleRecord = {
@@ -1352,6 +1395,7 @@ export const jobStoreConformance = (
1352
1395
  backoff: undefined,
1353
1396
  keep: undefined,
1354
1397
  timeoutMs: undefined,
1398
+ group: undefined,
1355
1399
  nextRunAt: 60_000
1356
1400
  }
1357
1401
  yield* store.upsertSchedule(schedule)