effect-jobs 0.1.0-alpha.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 (157) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +22 -0
  3. package/README.md +142 -0
  4. package/dist/Job.d.ts +33 -0
  5. package/dist/Job.d.ts.map +1 -0
  6. package/dist/Job.js +66 -0
  7. package/dist/Job.js.map +1 -0
  8. package/dist/JobConsumer.d.ts +34 -0
  9. package/dist/JobConsumer.d.ts.map +1 -0
  10. package/dist/JobConsumer.js +28 -0
  11. package/dist/JobConsumer.js.map +1 -0
  12. package/dist/JobContract.d.ts +128 -0
  13. package/dist/JobContract.d.ts.map +1 -0
  14. package/dist/JobContract.js +15 -0
  15. package/dist/JobContract.js.map +1 -0
  16. package/dist/JobFailure.d.ts +51 -0
  17. package/dist/JobFailure.d.ts.map +1 -0
  18. package/dist/JobFailure.js +34 -0
  19. package/dist/JobFailure.js.map +1 -0
  20. package/dist/JobId.d.ts +5 -0
  21. package/dist/JobId.d.ts.map +1 -0
  22. package/dist/JobId.js +4 -0
  23. package/dist/JobId.js.map +1 -0
  24. package/dist/JobIdentity.d.ts +54 -0
  25. package/dist/JobIdentity.d.ts.map +1 -0
  26. package/dist/JobIdentity.js +82 -0
  27. package/dist/JobIdentity.js.map +1 -0
  28. package/dist/JobLifecycle.d.ts +173 -0
  29. package/dist/JobLifecycle.d.ts.map +1 -0
  30. package/dist/JobLifecycle.js +234 -0
  31. package/dist/JobLifecycle.js.map +1 -0
  32. package/dist/JobPayload.d.ts +18 -0
  33. package/dist/JobPayload.d.ts.map +1 -0
  34. package/dist/JobPayload.js +10 -0
  35. package/dist/JobPayload.js.map +1 -0
  36. package/dist/JobPayloadCodec.d.ts +14 -0
  37. package/dist/JobPayloadCodec.d.ts.map +1 -0
  38. package/dist/JobPayloadCodec.js +78 -0
  39. package/dist/JobPayloadCodec.js.map +1 -0
  40. package/dist/JobPolicy.d.ts +50 -0
  41. package/dist/JobPolicy.d.ts.map +1 -0
  42. package/dist/JobPolicy.js +85 -0
  43. package/dist/JobPolicy.js.map +1 -0
  44. package/dist/JobProducer.d.ts +14 -0
  45. package/dist/JobProducer.d.ts.map +1 -0
  46. package/dist/JobProducer.js +23 -0
  47. package/dist/JobProducer.js.map +1 -0
  48. package/dist/JobQueue.d.ts +16 -0
  49. package/dist/JobQueue.d.ts.map +1 -0
  50. package/dist/JobQueue.js +16 -0
  51. package/dist/JobQueue.js.map +1 -0
  52. package/dist/JobRegistry.d.ts +37 -0
  53. package/dist/JobRegistry.d.ts.map +1 -0
  54. package/dist/JobRegistry.js +47 -0
  55. package/dist/JobRegistry.js.map +1 -0
  56. package/dist/JobStore.d.ts +348 -0
  57. package/dist/JobStore.d.ts.map +1 -0
  58. package/dist/JobStore.js +19 -0
  59. package/dist/JobStore.js.map +1 -0
  60. package/dist/JobTelemetry.d.ts +7 -0
  61. package/dist/JobTelemetry.d.ts.map +1 -0
  62. package/dist/JobTelemetry.js +61 -0
  63. package/dist/JobTelemetry.js.map +1 -0
  64. package/dist/JobTransaction.d.ts +24 -0
  65. package/dist/JobTransaction.d.ts.map +1 -0
  66. package/dist/JobTransaction.js +7 -0
  67. package/dist/JobTransaction.js.map +1 -0
  68. package/dist/JobWorker.d.ts +24 -0
  69. package/dist/JobWorker.d.ts.map +1 -0
  70. package/dist/JobWorker.js +155 -0
  71. package/dist/JobWorker.js.map +1 -0
  72. package/dist/JobWorkerRuntime.d.ts +18 -0
  73. package/dist/JobWorkerRuntime.d.ts.map +1 -0
  74. package/dist/JobWorkerRuntime.js +5 -0
  75. package/dist/JobWorkerRuntime.js.map +1 -0
  76. package/dist/PollingJobWorker.d.ts +9 -0
  77. package/dist/PollingJobWorker.d.ts.map +1 -0
  78. package/dist/PollingJobWorker.js +54 -0
  79. package/dist/PollingJobWorker.js.map +1 -0
  80. package/dist/PostgreSqlDrizzleSchema.d.ts +432 -0
  81. package/dist/PostgreSqlDrizzleSchema.d.ts.map +1 -0
  82. package/dist/PostgreSqlDrizzleSchema.js +72 -0
  83. package/dist/PostgreSqlDrizzleSchema.js.map +1 -0
  84. package/dist/PostgreSqlJobs.d.ts +25 -0
  85. package/dist/PostgreSqlJobs.d.ts.map +1 -0
  86. package/dist/PostgreSqlJobs.js +38 -0
  87. package/dist/PostgreSqlJobs.js.map +1 -0
  88. package/dist/PostgreSqlSchema.d.ts +30 -0
  89. package/dist/PostgreSqlSchema.d.ts.map +1 -0
  90. package/dist/PostgreSqlSchema.js +63 -0
  91. package/dist/PostgreSqlSchema.js.map +1 -0
  92. package/dist/PostgreSqlTransaction.d.ts +42 -0
  93. package/dist/PostgreSqlTransaction.d.ts.map +1 -0
  94. package/dist/PostgreSqlTransaction.js +9 -0
  95. package/dist/PostgreSqlTransaction.js.map +1 -0
  96. package/dist/index.d.ts +7 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +7 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/internal/JobTransaction.d.ts +16 -0
  101. package/dist/internal/JobTransaction.d.ts.map +1 -0
  102. package/dist/internal/JobTransaction.js +21 -0
  103. package/dist/internal/JobTransaction.js.map +1 -0
  104. package/dist/internal/codec/CanonicalJson.d.ts +9 -0
  105. package/dist/internal/codec/CanonicalJson.d.ts.map +1 -0
  106. package/dist/internal/codec/CanonicalJson.js +184 -0
  107. package/dist/internal/codec/CanonicalJson.js.map +1 -0
  108. package/dist/internal/codec/ProtectedProjection.d.ts +12 -0
  109. package/dist/internal/codec/ProtectedProjection.d.ts.map +1 -0
  110. package/dist/internal/codec/ProtectedProjection.js +121 -0
  111. package/dist/internal/codec/ProtectedProjection.js.map +1 -0
  112. package/dist/internal/lifecycle/Artifacts.d.ts +6 -0
  113. package/dist/internal/lifecycle/Artifacts.d.ts.map +1 -0
  114. package/dist/internal/lifecycle/Artifacts.js +49 -0
  115. package/dist/internal/lifecycle/Artifacts.js.map +1 -0
  116. package/dist/internal/lifecycle/Reconciliation.d.ts +82 -0
  117. package/dist/internal/lifecycle/Reconciliation.d.ts.map +1 -0
  118. package/dist/internal/lifecycle/Reconciliation.js +98 -0
  119. package/dist/internal/lifecycle/Reconciliation.js.map +1 -0
  120. package/dist/internal/postgresql/Producer.d.ts +14 -0
  121. package/dist/internal/postgresql/Producer.d.ts.map +1 -0
  122. package/dist/internal/postgresql/Producer.js +55 -0
  123. package/dist/internal/postgresql/Producer.js.map +1 -0
  124. package/dist/internal/postgresql/Readiness.d.ts +5 -0
  125. package/dist/internal/postgresql/Readiness.d.ts.map +1 -0
  126. package/dist/internal/postgresql/Readiness.js +53 -0
  127. package/dist/internal/postgresql/Readiness.js.map +1 -0
  128. package/dist/internal/postgresql/Rows.d.ts +45 -0
  129. package/dist/internal/postgresql/Rows.d.ts.map +1 -0
  130. package/dist/internal/postgresql/Rows.js +75 -0
  131. package/dist/internal/postgresql/Rows.js.map +1 -0
  132. package/dist/internal/postgresql/Store.d.ts +5 -0
  133. package/dist/internal/postgresql/Store.d.ts.map +1 -0
  134. package/dist/internal/postgresql/Store.js +211 -0
  135. package/dist/internal/postgresql/Store.js.map +1 -0
  136. package/dist/internal/worker/Capability.d.ts +106 -0
  137. package/dist/internal/worker/Capability.d.ts.map +1 -0
  138. package/dist/internal/worker/Capability.js +11 -0
  139. package/dist/internal/worker/Capability.js.map +1 -0
  140. package/dist/internal/worker/Drain.d.ts +22 -0
  141. package/dist/internal/worker/Drain.d.ts.map +1 -0
  142. package/dist/internal/worker/Drain.js +59 -0
  143. package/dist/internal/worker/Drain.js.map +1 -0
  144. package/dist/internal/worker/Execution.d.ts +7 -0
  145. package/dist/internal/worker/Execution.d.ts.map +1 -0
  146. package/dist/internal/worker/Execution.js +125 -0
  147. package/dist/internal/worker/Execution.js.map +1 -0
  148. package/dist/internal/worker/Results.d.ts +108 -0
  149. package/dist/internal/worker/Results.d.ts.map +1 -0
  150. package/dist/internal/worker/Results.js +3 -0
  151. package/dist/internal/worker/Results.js.map +1 -0
  152. package/package.json +169 -0
  153. package/specs/architecture-decisions.md +841 -0
  154. package/specs/core-contract.md +323 -0
  155. package/specs/drizzle-compatibility.md +167 -0
  156. package/specs/postgresql-backend.md +291 -0
  157. package/specs/release-qualification.md +107 -0
@@ -0,0 +1,348 @@
1
+ import { Data, Effect, Result } from "effect";
2
+ import type { CatalogIdentity } from "./JobIdentity.js";
3
+ import type { JobFinalization, JobOwnership, JobSnapshot } from "./JobLifecycle.js";
4
+ export interface ClaimedJob {
5
+ readonly ownership: JobOwnership;
6
+ readonly snapshot: JobSnapshot;
7
+ /** Untrusted artifact: validate before dispatch; never fall back to a partial payload. */
8
+ readonly prepared: unknown;
9
+ }
10
+ export type ClaimResult = Data.TaggedEnum<{
11
+ Claimed: {
12
+ readonly claim: ClaimedJob;
13
+ };
14
+ Empty: {};
15
+ Unknown: {};
16
+ }>;
17
+ export declare const ClaimResults: {
18
+ readonly $is: <Tag extends "Claimed" | "Empty" | "Unknown">(tag: Tag) => (u: unknown) => u is Extract<{
19
+ readonly _tag: "Claimed";
20
+ readonly claim: ClaimedJob;
21
+ }, {
22
+ readonly _tag: Tag;
23
+ }> | Extract<{
24
+ readonly _tag: "Empty";
25
+ }, {
26
+ readonly _tag: Tag;
27
+ }> | Extract<{
28
+ readonly _tag: "Unknown";
29
+ }, {
30
+ readonly _tag: Tag;
31
+ }>;
32
+ readonly $match: {
33
+ <Cases extends { readonly [Tag in "Claimed" | "Empty" | "Unknown"]: (args: Extract<{
34
+ readonly _tag: "Claimed";
35
+ readonly claim: ClaimedJob;
36
+ } | {
37
+ readonly _tag: "Empty";
38
+ } | {
39
+ readonly _tag: "Unknown";
40
+ }, {
41
+ readonly _tag: Tag;
42
+ }>) => any; }>(cases: Cases): (value: {
43
+ readonly _tag: "Claimed";
44
+ readonly claim: ClaimedJob;
45
+ } | {
46
+ readonly _tag: "Empty";
47
+ } | {
48
+ readonly _tag: "Unknown";
49
+ }) => import("effect/Unify").Unify<ReturnType<Cases["Claimed" | "Empty" | "Unknown"]>>;
50
+ <Cases extends { readonly [Tag in "Claimed" | "Empty" | "Unknown"]: (args: Extract<{
51
+ readonly _tag: "Claimed";
52
+ readonly claim: ClaimedJob;
53
+ } | {
54
+ readonly _tag: "Empty";
55
+ } | {
56
+ readonly _tag: "Unknown";
57
+ }, {
58
+ readonly _tag: Tag;
59
+ }>) => any; }>(value: {
60
+ readonly _tag: "Claimed";
61
+ readonly claim: ClaimedJob;
62
+ } | {
63
+ readonly _tag: "Empty";
64
+ } | {
65
+ readonly _tag: "Unknown";
66
+ }, cases: Cases): import("effect/Unify").Unify<ReturnType<Cases["Claimed" | "Empty" | "Unknown"]>>;
67
+ };
68
+ readonly Claimed: Data.TaggedEnum.ConstructorFrom<{
69
+ readonly _tag: "Claimed";
70
+ readonly claim: ClaimedJob;
71
+ }, "_tag">;
72
+ readonly Empty: Data.TaggedEnum.ConstructorFrom<{
73
+ readonly _tag: "Empty";
74
+ }, "_tag">;
75
+ readonly Unknown: Data.TaggedEnum.ConstructorFrom<{
76
+ readonly _tag: "Unknown";
77
+ }, "_tag">;
78
+ };
79
+ export type ClaimReconciliation = Data.TaggedEnum<{
80
+ Owned: {
81
+ readonly claim: ClaimedJob;
82
+ };
83
+ InsufficientLease: {
84
+ readonly ownership: JobOwnership;
85
+ };
86
+ NotOwned: {};
87
+ Unknown: {};
88
+ }>;
89
+ export declare const ClaimReconciliations: {
90
+ readonly $is: <Tag extends "InsufficientLease" | "NotOwned" | "Owned" | "Unknown">(tag: Tag) => (u: unknown) => u is Extract<{
91
+ readonly _tag: "InsufficientLease";
92
+ readonly ownership: JobOwnership;
93
+ }, {
94
+ readonly _tag: Tag;
95
+ }> | Extract<{
96
+ readonly _tag: "NotOwned";
97
+ }, {
98
+ readonly _tag: Tag;
99
+ }> | Extract<{
100
+ readonly _tag: "Owned";
101
+ readonly claim: ClaimedJob;
102
+ }, {
103
+ readonly _tag: Tag;
104
+ }> | Extract<{
105
+ readonly _tag: "Unknown";
106
+ }, {
107
+ readonly _tag: Tag;
108
+ }>;
109
+ readonly $match: {
110
+ <Cases extends { readonly [Tag in "InsufficientLease" | "NotOwned" | "Owned" | "Unknown"]: (args: Extract<{
111
+ readonly _tag: "InsufficientLease";
112
+ readonly ownership: JobOwnership;
113
+ } | {
114
+ readonly _tag: "NotOwned";
115
+ } | {
116
+ readonly _tag: "Owned";
117
+ readonly claim: ClaimedJob;
118
+ } | {
119
+ readonly _tag: "Unknown";
120
+ }, {
121
+ readonly _tag: Tag;
122
+ }>) => any; }>(cases: Cases): (value: {
123
+ readonly _tag: "InsufficientLease";
124
+ readonly ownership: JobOwnership;
125
+ } | {
126
+ readonly _tag: "NotOwned";
127
+ } | {
128
+ readonly _tag: "Owned";
129
+ readonly claim: ClaimedJob;
130
+ } | {
131
+ readonly _tag: "Unknown";
132
+ }) => import("effect/Unify").Unify<ReturnType<Cases["InsufficientLease" | "NotOwned" | "Owned" | "Unknown"]>>;
133
+ <Cases extends { readonly [Tag in "InsufficientLease" | "NotOwned" | "Owned" | "Unknown"]: (args: Extract<{
134
+ readonly _tag: "InsufficientLease";
135
+ readonly ownership: JobOwnership;
136
+ } | {
137
+ readonly _tag: "NotOwned";
138
+ } | {
139
+ readonly _tag: "Owned";
140
+ readonly claim: ClaimedJob;
141
+ } | {
142
+ readonly _tag: "Unknown";
143
+ }, {
144
+ readonly _tag: Tag;
145
+ }>) => any; }>(value: {
146
+ readonly _tag: "InsufficientLease";
147
+ readonly ownership: JobOwnership;
148
+ } | {
149
+ readonly _tag: "NotOwned";
150
+ } | {
151
+ readonly _tag: "Owned";
152
+ readonly claim: ClaimedJob;
153
+ } | {
154
+ readonly _tag: "Unknown";
155
+ }, cases: Cases): import("effect/Unify").Unify<ReturnType<Cases["InsufficientLease" | "NotOwned" | "Owned" | "Unknown"]>>;
156
+ };
157
+ readonly InsufficientLease: Data.TaggedEnum.ConstructorFrom<{
158
+ readonly _tag: "InsufficientLease";
159
+ readonly ownership: JobOwnership;
160
+ }, "_tag">;
161
+ readonly NotOwned: Data.TaggedEnum.ConstructorFrom<{
162
+ readonly _tag: "NotOwned";
163
+ }, "_tag">;
164
+ readonly Owned: Data.TaggedEnum.ConstructorFrom<{
165
+ readonly _tag: "Owned";
166
+ readonly claim: ClaimedJob;
167
+ }, "_tag">;
168
+ readonly Unknown: Data.TaggedEnum.ConstructorFrom<{
169
+ readonly _tag: "Unknown";
170
+ }, "_tag">;
171
+ };
172
+ export type FinalizationResult = Data.TaggedEnum<{
173
+ Applied: {};
174
+ Unknown: {};
175
+ }>;
176
+ export declare const FinalizationResults: {
177
+ readonly $is: <Tag extends "Applied" | "Unknown">(tag: Tag) => (u: unknown) => u is Extract<{
178
+ readonly _tag: "Applied";
179
+ }, {
180
+ readonly _tag: Tag;
181
+ }> | Extract<{
182
+ readonly _tag: "Unknown";
183
+ }, {
184
+ readonly _tag: Tag;
185
+ }>;
186
+ readonly $match: {
187
+ <Cases extends { readonly [Tag in "Applied" | "Unknown"]: (args: Extract<{
188
+ readonly _tag: "Applied";
189
+ } | {
190
+ readonly _tag: "Unknown";
191
+ }, {
192
+ readonly _tag: Tag;
193
+ }>) => any; }>(cases: Cases): (value: {
194
+ readonly _tag: "Applied";
195
+ } | {
196
+ readonly _tag: "Unknown";
197
+ }) => import("effect/Unify").Unify<ReturnType<Cases["Applied" | "Unknown"]>>;
198
+ <Cases extends { readonly [Tag in "Applied" | "Unknown"]: (args: Extract<{
199
+ readonly _tag: "Applied";
200
+ } | {
201
+ readonly _tag: "Unknown";
202
+ }, {
203
+ readonly _tag: Tag;
204
+ }>) => any; }>(value: {
205
+ readonly _tag: "Applied";
206
+ } | {
207
+ readonly _tag: "Unknown";
208
+ }, cases: Cases): import("effect/Unify").Unify<ReturnType<Cases["Applied" | "Unknown"]>>;
209
+ };
210
+ readonly Applied: Data.TaggedEnum.ConstructorFrom<{
211
+ readonly _tag: "Applied";
212
+ }, "_tag">;
213
+ readonly Unknown: Data.TaggedEnum.ConstructorFrom<{
214
+ readonly _tag: "Unknown";
215
+ }, "_tag">;
216
+ };
217
+ export type FinalizationReconciliation = Data.TaggedEnum<{
218
+ Applied: {};
219
+ StillOwned: {};
220
+ OwnershipLost: {};
221
+ Unknown: {};
222
+ }>;
223
+ export declare const FinalizationReconciliations: {
224
+ readonly $is: <Tag extends "Applied" | "OwnershipLost" | "StillOwned" | "Unknown">(tag: Tag) => (u: unknown) => u is Extract<{
225
+ readonly _tag: "Applied";
226
+ }, {
227
+ readonly _tag: Tag;
228
+ }> | Extract<{
229
+ readonly _tag: "OwnershipLost";
230
+ }, {
231
+ readonly _tag: Tag;
232
+ }> | Extract<{
233
+ readonly _tag: "StillOwned";
234
+ }, {
235
+ readonly _tag: Tag;
236
+ }> | Extract<{
237
+ readonly _tag: "Unknown";
238
+ }, {
239
+ readonly _tag: Tag;
240
+ }>;
241
+ readonly $match: {
242
+ <Cases extends { readonly [Tag in "Applied" | "OwnershipLost" | "StillOwned" | "Unknown"]: (args: Extract<{
243
+ readonly _tag: "Applied";
244
+ } | {
245
+ readonly _tag: "OwnershipLost";
246
+ } | {
247
+ readonly _tag: "StillOwned";
248
+ } | {
249
+ readonly _tag: "Unknown";
250
+ }, {
251
+ readonly _tag: Tag;
252
+ }>) => any; }>(cases: Cases): (value: {
253
+ readonly _tag: "Applied";
254
+ } | {
255
+ readonly _tag: "OwnershipLost";
256
+ } | {
257
+ readonly _tag: "StillOwned";
258
+ } | {
259
+ readonly _tag: "Unknown";
260
+ }) => import("effect/Unify").Unify<ReturnType<Cases["Applied" | "OwnershipLost" | "StillOwned" | "Unknown"]>>;
261
+ <Cases extends { readonly [Tag in "Applied" | "OwnershipLost" | "StillOwned" | "Unknown"]: (args: Extract<{
262
+ readonly _tag: "Applied";
263
+ } | {
264
+ readonly _tag: "OwnershipLost";
265
+ } | {
266
+ readonly _tag: "StillOwned";
267
+ } | {
268
+ readonly _tag: "Unknown";
269
+ }, {
270
+ readonly _tag: Tag;
271
+ }>) => any; }>(value: {
272
+ readonly _tag: "Applied";
273
+ } | {
274
+ readonly _tag: "OwnershipLost";
275
+ } | {
276
+ readonly _tag: "StillOwned";
277
+ } | {
278
+ readonly _tag: "Unknown";
279
+ }, cases: Cases): import("effect/Unify").Unify<ReturnType<Cases["Applied" | "OwnershipLost" | "StillOwned" | "Unknown"]>>;
280
+ };
281
+ readonly Applied: Data.TaggedEnum.ConstructorFrom<{
282
+ readonly _tag: "Applied";
283
+ }, "_tag">;
284
+ readonly OwnershipLost: Data.TaggedEnum.ConstructorFrom<{
285
+ readonly _tag: "OwnershipLost";
286
+ }, "_tag">;
287
+ readonly StillOwned: Data.TaggedEnum.ConstructorFrom<{
288
+ readonly _tag: "StillOwned";
289
+ }, "_tag">;
290
+ readonly Unknown: Data.TaggedEnum.ConstructorFrom<{
291
+ readonly _tag: "Unknown";
292
+ }, "_tag">;
293
+ };
294
+ declare const JobOwnershipLost_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
295
+ readonly _tag: "JobOwnershipLost";
296
+ } & Readonly<A>;
297
+ export declare class JobOwnershipLost extends JobOwnershipLost_base<{}> {
298
+ }
299
+ declare const JobStoreProtocolError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
300
+ readonly _tag: "JobStoreProtocolError";
301
+ } & Readonly<A>;
302
+ export declare class JobStoreProtocolError extends JobStoreProtocolError_base<{
303
+ readonly reason: "invalid-input" | "invalid-artifact";
304
+ }> {
305
+ }
306
+ export interface ClaimRequest {
307
+ readonly queue: string;
308
+ /** Nonempty supported catalogs only. No process-global catalog or unsupported-version dispatch. */
309
+ readonly supportedCatalog: ReadonlyArray<CatalogIdentity>;
310
+ /** Fresh unique caller token per claim operation, retained verbatim for reconciliation. */
311
+ readonly leaseToken: string;
312
+ }
313
+ export interface FinalizationRequest {
314
+ readonly ownership: JobOwnership;
315
+ /** Frozen pre-write snapshot makes exact transition reconciliation possible. */
316
+ readonly before: JobSnapshot;
317
+ readonly finalization: JobFinalization;
318
+ }
319
+ /** Backend boundary validation, before any mutation is dispatched. */
320
+ export declare const validateClaimRequest: (input: unknown) => Result.Result<ClaimRequest, JobStoreProtocolError>;
321
+ /**
322
+ * Explicit configured port, not a backend constructor or atomicity proof.
323
+ * E/R preserve provider failure and connection requirements. Unknown dispatched writes
324
+ * MUST be returned as Unknown (including response loss); typed failures cannot imply rollback.
325
+ * Never replay mutations automatically. Lock/CAS the exact state/token/version using one
326
+ * DB-time snapshot, fixed non-renewable leases and bounded validated arithmetic.
327
+ * Claim atomically selects at most one due supported row and its immutable payload;
328
+ * its lease must reserve stored timeout plus configured positive operation-response budget.
329
+ * Reconciliation reads once by the ORIGINAL caller token, never by an unrelated new claim.
330
+ * All transitions preserve first policy, identities and artifact bytes; no lease renewal.
331
+ */
332
+ export interface JobStoreService<E = never, R = never> {
333
+ readonly claim: (request: ClaimRequest) => Effect.Effect<ClaimResult, E | JobStoreProtocolError, R>;
334
+ readonly reconcileClaim: (leaseToken: string) => Effect.Effect<ClaimReconciliation, E | JobStoreProtocolError, R>;
335
+ /** Worker-only pre-execution boundary. Never call once decoding/handler execution has started. */
336
+ readonly release: (ownership: JobOwnership, phase: "BeforeExecution") => Effect.Effect<FinalizationResult, E | JobOwnershipLost | JobStoreProtocolError, R>;
337
+ readonly finalize: (request: FinalizationRequest) => Effect.Effect<FinalizationResult, E | JobOwnershipLost | JobStoreProtocolError, R>;
338
+ /** Applied requires the exact transition/counter/code/timestamp/version, not terminal state alone. */
339
+ readonly reconcileFinalization: (request: FinalizationRequest) => Effect.Effect<FinalizationReconciliation, E | JobStoreProtocolError, R>;
340
+ /** Atomic, bounded 1–500 batch; expiry <= DB time; no handler invocation. */
341
+ readonly recoverExpired: (limit: number) => Effect.Effect<number, E | JobStoreProtocolError, R>;
342
+ }
343
+ /** Separate replaceable app-owned port; the store must not bypass domain references. */
344
+ export interface JobCleanupService<E = never, R = never> {
345
+ readonly cleanup: (limit: number) => Effect.Effect<number, E | JobStoreProtocolError, R>;
346
+ }
347
+ export {};
348
+ //# sourceMappingURL=JobStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobStore.d.ts","sourceRoot":"","sources":["../src/JobStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Data, Effect, Result, Schema } from "effect";
2
+ import { CatalogIdentity as CatalogSchema, QueueName } from "./JobIdentity.js";
3
+ import { LeaseToken } from "./JobLifecycle.js";
4
+ export const ClaimResults = Data.taggedEnum();
5
+ export const ClaimReconciliations = Data.taggedEnum();
6
+ export const FinalizationResults = Data.taggedEnum();
7
+ export const FinalizationReconciliations = Data.taggedEnum();
8
+ export class JobOwnershipLost extends Data.TaggedError("JobOwnershipLost") {
9
+ }
10
+ export class JobStoreProtocolError extends Data.TaggedError("JobStoreProtocolError") {
11
+ }
12
+ const ClaimRequestSchema = Schema.Struct({
13
+ queue: QueueName,
14
+ supportedCatalog: Schema.Array(CatalogSchema).pipe(Schema.check(Schema.isMinLength(1))),
15
+ leaseToken: LeaseToken
16
+ }).pipe(Schema.check(Schema.makeFilter((request) => request.supportedCatalog.every((catalog) => catalog.queue === request.queue))));
17
+ /** Backend boundary validation, before any mutation is dispatched. */
18
+ export const validateClaimRequest = (input) => Result.mapError(Schema.decodeUnknownResult(ClaimRequestSchema, { onExcessProperty: "error" })(input), () => new JobStoreProtocolError({ reason: "invalid-input" }));
19
+ //# sourceMappingURL=JobStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobStore.js","sourceRoot":"","sources":["../src/JobStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACrD,OAAO,EAAE,eAAe,IAAI,aAAa,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAe9C,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAe,CAAA;AAO1D,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,UAAU,EAAuB,CAAA;AAE1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAsB,CAAA;AAOxE,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC,UAAU,EAA8B,CAAA;AAExF,MAAM,OAAO,gBAAiB,SAAQ,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAK;CAAG;AACjF,MAAM,OAAO,qBAAsB,SAAQ,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAEjF;CAAG;AAgBL,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,SAAS;IAChB,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,UAAU,EAAE,UAAU;CACvB,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5B,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,CAC7E,CACF,CACF,CAAA;AACD,sEAAsE;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,KAAc,EACsC,EAAE,CACtD,MAAM,CAAC,QAAQ,CACb,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,EACpF,GAAG,EAAE,CAAC,IAAI,qBAAqB,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAC7D,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { Effect } from "effect";
2
+ export type Operation = "claim" | "release" | "execute" | "finalize" | "recover-expired" | "polling" | "backoff";
3
+ export type Phase = "dispatch" | "handler" | "finalization" | "reconciliation" | "protocol" | "maintenance";
4
+ export type Outcome = "success" | "failure" | "interrupted" | "unknown" | "timeout";
5
+ /** Bounded vocabulary only. No arbitrary attributes, errors, codes or identities. */
6
+ export declare const observe: (operation: Operation, phase: Phase) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
7
+ //# sourceMappingURL=JobTelemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobTelemetry.d.ts","sourceRoot":"","sources":["../src/JobTelemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAgB,MAAM,QAAQ,CAAA;AAE3D,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,SAAS,GACT,SAAS,GACT,UAAU,GACV,iBAAiB,GACjB,SAAS,GACT,SAAS,CAAA;AACb,MAAM,MAAM,KAAK,GACb,UAAU,GACV,SAAS,GACT,cAAc,GACd,gBAAgB,GAChB,UAAU,GACV,aAAa,CAAA;AACjB,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,CAAA;AAmBnF,qFAAqF;AACrF,eAAO,MAAM,OAAO,cACN,SAAS,SAAS,KAAK,MAClC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAqDxB,CAAA"}
@@ -0,0 +1,61 @@
1
+ import { Cause, Clock, Effect, Exit, Metric } from "effect";
2
+ const successOutcome = (value) => {
3
+ if (typeof value === "object" && value !== null && "_tag" in value) {
4
+ if (value._tag === "Unknown" || value._tag === "Unresolved") {
5
+ return "unknown";
6
+ }
7
+ if (value._tag === "Backoff") {
8
+ return "failure";
9
+ }
10
+ }
11
+ return "success";
12
+ };
13
+ const total = Metric.counter("effect_jobs_operation_total", { incremental: true });
14
+ const duration = Metric.histogram("effect_jobs_operation_duration_millis", {
15
+ boundaries: [1, 10, 100, 1000, 10_000, 60_000]
16
+ });
17
+ /** Bounded vocabulary only. No arbitrary attributes, errors, codes or identities. */
18
+ export const observe = (operation, phase) => (effect) => Effect.uninterruptibleMask((restore) => Effect.gen(function* () {
19
+ // Allocate per execution, including concurrent runs of the same Effect.
20
+ let exit;
21
+ yield* Effect.gen(function* () {
22
+ const started = yield* Clock.currentTimeMillis;
23
+ exit = yield* Effect.exit(restore(effect));
24
+ const ended = yield* Clock.currentTimeMillis;
25
+ const reasons = Exit.isFailure(exit) ? exit.cause.reasons : [];
26
+ const kinds = new Set(reasons.map((reason) => Cause.isFailReason(reason)
27
+ ? "failure"
28
+ : Cause.isDieReason(reason)
29
+ ? "defect"
30
+ : "interrupted"));
31
+ const [reason] = reasons;
32
+ const outcome = Exit.isSuccess(exit)
33
+ ? successOutcome(exit.value)
34
+ : reasons.length === 1 &&
35
+ reason !== undefined &&
36
+ Cause.isFailReason(reason) &&
37
+ reason.error instanceof Cause.TimeoutError
38
+ ? "timeout"
39
+ : kinds.size === 1 && kinds.has("interrupted")
40
+ ? "interrupted"
41
+ : "failure";
42
+ const fields = {
43
+ "jobs.operation": operation,
44
+ "jobs.phase": phase,
45
+ "jobs.outcome": outcome,
46
+ ...(reasons.length === 0
47
+ ? {}
48
+ : {
49
+ "jobs.cause_kind": kinds.size > 1 ? "mixed" : [...kinds][0],
50
+ "jobs.reason_count_bucket": reasons.length === 1 ? "1" : reasons.length === 2 ? "2" : "3+"
51
+ })
52
+ };
53
+ yield* Effect.annotateCurrentSpan(fields);
54
+ yield* Metric.update(Metric.withAttributes(total, fields), 1);
55
+ yield* Metric.update(Metric.withAttributes(duration, fields), Math.max(0, ended - started));
56
+ yield* Effect.logInfo("effect-jobs operation completed", fields);
57
+ // Span completion must contain neither the operation value nor its Cause.
58
+ }).pipe(Effect.withSpan(`effect-jobs.${operation}`));
59
+ return exit;
60
+ })).pipe(Effect.flatMap((exit) => exit));
61
+ //# sourceMappingURL=JobTelemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobTelemetry.js","sourceRoot":"","sources":["../src/JobTelemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Effect } from "effect";
2
+ import type { EnqueueResult, JobIntegrityConflict, PreparedJob, InvalidJobInput, JobPayloadCodecError } from "./JobContract.js";
3
+ import type { JobsTransactionTypeId } from "./internal/JobTransaction.js";
4
+ declare const JobsTransactionClosed_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
5
+ readonly _tag: "JobsTransactionClosed";
6
+ } & Readonly<A>;
7
+ export declare class JobsTransactionClosed extends JobsTransactionClosed_base<{
8
+ readonly reason: "callback-exited";
9
+ }> {
10
+ get message(): string;
11
+ }
12
+ /** Backend callback capability. No public constructor or commit/replay operations. */
13
+ export interface JobsTransaction<E = never, R = never> {
14
+ readonly [JobsTransactionTypeId]: {
15
+ readonly insertOrCompare: (prepared: PreparedJob) => Effect.Effect<EnqueueResult, E | JobIntegrityConflict | JobsTransactionClosed, R>;
16
+ };
17
+ }
18
+ export type JobEnqueueError = InvalidJobInput | JobPayloadCodecError | JobIntegrityConflict | JobsTransactionClosed;
19
+ /** Implemented by a qualified application manager integration, not a core engine. */
20
+ export interface JobTransactionsService<ManagerError, ManagerRequirements = never> {
21
+ readonly withTransaction: <A, E, R>(body: (jobsTx: JobsTransaction<ManagerError>) => Effect.Effect<A, E, R>) => Effect.Effect<A, E | ManagerError, R | ManagerRequirements>;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=JobTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobTransaction.d.ts","sourceRoot":"","sources":["../src/JobTransaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,oBAAoB,EACrB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;;;;AAEzE,qBAAa,qBAAsB,SAAQ,2BAA0C;IACnF,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;CACnC,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AACD,sFAAsF;AACtF,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK;IACnD,QAAQ,CAAC,CAAC,qBAAqB,CAAC,EAAE;QAChC,QAAQ,CAAC,eAAe,EAAE,CACxB,QAAQ,EAAE,WAAW,KAClB,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,GAAG,oBAAoB,GAAG,qBAAqB,EAAE,CAAC,CAAC,CAAA;KACvF,CAAA;CACF;AACD,MAAM,MAAM,eAAe,GACvB,eAAe,GACf,oBAAoB,GACpB,oBAAoB,GACpB,qBAAqB,CAAA;AAEzB,qFAAqF;AACrF,MAAM,WAAW,sBAAsB,CAAC,YAAY,EAAE,mBAAmB,GAAG,KAAK;IAC/E,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAChC,IAAI,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,YAAY,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACpE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAA;CACjE"}
@@ -0,0 +1,7 @@
1
+ import { Data } from "effect";
2
+ export class JobsTransactionClosed extends Data.TaggedError("JobsTransactionClosed") {
3
+ get message() {
4
+ return "JobsTransaction is closed; enqueue inside the backend joinTransaction callback";
5
+ }
6
+ }
7
+ //# sourceMappingURL=JobTransaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobTransaction.js","sourceRoot":"","sources":["../src/JobTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAW7B,MAAM,OAAO,qBAAsB,SAAQ,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAEjF;IACA,IAAa,OAAO;QAClB,OAAO,gFAAgF,CAAA;IACzF,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { JobRegistry } from "./JobRegistry.js";
3
+ import { JobWorkerConfigurationError, WorkerCapability } from "./internal/worker/Capability.js";
4
+ import type { CatalogEntry } from "./JobRegistry.js";
5
+ import type { JobStoreService } from "./JobStore.js";
6
+ import type { RuntimeCapability } from "./internal/worker/Capability.js";
7
+ export { JobWorkerConfigurationError, JobWorkerNotReady, JobWorkerUnavailable } from "./internal/worker/Capability.js";
8
+ export interface JobWorkerService {
9
+ /** Explicit sealed runtime capability, not a process-global WeakMap. */
10
+ readonly [WorkerCapability]: RuntimeCapability;
11
+ }
12
+ declare const JobWorker_base: Context.ServiceClass<JobWorker, "effect-jobs/JobWorker", JobWorkerService>;
13
+ export declare class JobWorker extends JobWorker_base {
14
+ }
15
+ export interface JobWorkerOptions {
16
+ readonly catalog: ReadonlyArray<CatalogEntry>;
17
+ /** Must agree with the configured backend's finite response budget. */
18
+ readonly operationResponseBudgetMillis: number;
19
+ }
20
+ /** The integrated store is a generic port (no Context tag). Capture its ordinary
21
+ * Effect requirements once here; providers still own pools and transactions. */
22
+ export declare const make: <E, R>(store: JobStoreService<E, R>, options: JobWorkerOptions) => Effect.Effect<JobWorkerService, JobWorkerConfigurationError, R | JobRegistry>;
23
+ export declare const layer: <E, R>(store: JobStoreService<E, R>, options: JobWorkerOptions) => Layer.Layer<JobWorker, JobWorkerConfigurationError, JobRegistry | Exclude<R, import("effect/Scope").Scope>>;
24
+ //# sourceMappingURL=JobWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobWorker.d.ts","sourceRoot":"","sources":["../src/JobWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,OAAO,EAAE,MAAM,EAAE,KAAK,EAAqB,MAAM,QAAQ,CAAA;AAGzE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG9C,OAAO,EAEL,2BAA2B,EAG3B,gBAAgB,EACjB,MAAM,iCAAiC,CAAA;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAc,eAAe,EAAE,MAAM,eAAe,CAAA;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAExE,OAAO,EACL,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,iCAAiC,CAAA;AAExC,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,CAAC,gBAAgB,CAAC,EAAE,iBAAiB,CAAA;CAC/C;;AACD,qBAAa,SAAU,SAAQ,cAE9B;CAAG;AAEJ,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAC7C,uEAAuE;IACvE,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAA;CAC/C;AAWD;gFACgF;AAChF,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,CAAC,SAAS,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,gBAAgB,kFAmL9E,CAAA;AAEJ,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,CAAC,SAAS,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,gBAAgB,gHACpC,CAAA"}