@durable-effect/jobs 0.0.1-next.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/LICENSE +21 -0
- package/README.md +490 -0
- package/dist/client/client.d.ts +34 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +427 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/response.d.ts +99 -0
- package/dist/client/response.d.ts.map +1 -0
- package/dist/client/response.js +92 -0
- package/dist/client/response.js.map +1 -0
- package/dist/client/types.d.ts +242 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +3 -0
- package/dist/client/types.js.map +1 -0
- package/dist/definitions/continuous.d.ts +110 -0
- package/dist/definitions/continuous.d.ts.map +1 -0
- package/dist/definitions/continuous.js +79 -0
- package/dist/definitions/continuous.js.map +1 -0
- package/dist/definitions/debounce.d.ts +67 -0
- package/dist/definitions/debounce.d.ts.map +1 -0
- package/dist/definitions/debounce.js +28 -0
- package/dist/definitions/debounce.js.map +1 -0
- package/dist/definitions/index.d.ts +4 -0
- package/dist/definitions/index.d.ts.map +1 -0
- package/dist/definitions/index.js +5 -0
- package/dist/definitions/index.js.map +1 -0
- package/dist/definitions/task.d.ts +234 -0
- package/dist/definitions/task.d.ts.map +1 -0
- package/dist/definitions/task.js +106 -0
- package/dist/definitions/task.js.map +1 -0
- package/dist/engine/engine.d.ts +60 -0
- package/dist/engine/engine.d.ts.map +1 -0
- package/dist/engine/engine.js +89 -0
- package/dist/engine/engine.js.map +1 -0
- package/dist/engine/index.d.ts +3 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +3 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/types.d.ts +53 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +3 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/errors.d.ts +119 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +80 -0
- package/dist/errors.js.map +1 -0
- package/dist/factory.d.ts +97 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +94 -0
- package/dist/factory.js.map +1 -0
- package/dist/handlers/continuous/context.d.ts +25 -0
- package/dist/handlers/continuous/context.d.ts.map +1 -0
- package/dist/handlers/continuous/context.js +38 -0
- package/dist/handlers/continuous/context.js.map +1 -0
- package/dist/handlers/continuous/executor.d.ts +10 -0
- package/dist/handlers/continuous/executor.d.ts.map +1 -0
- package/dist/handlers/continuous/executor.js +83 -0
- package/dist/handlers/continuous/executor.js.map +1 -0
- package/dist/handlers/continuous/handler.d.ts +14 -0
- package/dist/handlers/continuous/handler.d.ts.map +1 -0
- package/dist/handlers/continuous/handler.js +283 -0
- package/dist/handlers/continuous/handler.js.map +1 -0
- package/dist/handlers/continuous/index.d.ts +4 -0
- package/dist/handlers/continuous/index.d.ts.map +1 -0
- package/dist/handlers/continuous/index.js +4 -0
- package/dist/handlers/continuous/index.js.map +1 -0
- package/dist/handlers/continuous/types.d.ts +36 -0
- package/dist/handlers/continuous/types.d.ts.map +1 -0
- package/dist/handlers/continuous/types.js +3 -0
- package/dist/handlers/continuous/types.js.map +1 -0
- package/dist/handlers/debounce/handler.d.ts +14 -0
- package/dist/handlers/debounce/handler.d.ts.map +1 -0
- package/dist/handlers/debounce/handler.js +261 -0
- package/dist/handlers/debounce/handler.js.map +1 -0
- package/dist/handlers/debounce/index.d.ts +3 -0
- package/dist/handlers/debounce/index.d.ts.map +1 -0
- package/dist/handlers/debounce/index.js +3 -0
- package/dist/handlers/debounce/index.js.map +1 -0
- package/dist/handlers/debounce/types.d.ts +10 -0
- package/dist/handlers/debounce/types.d.ts.map +1 -0
- package/dist/handlers/debounce/types.js +3 -0
- package/dist/handlers/debounce/types.js.map +1 -0
- package/dist/handlers/index.d.ts +14 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +25 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/task/context.d.ts +35 -0
- package/dist/handlers/task/context.d.ts.map +1 -0
- package/dist/handlers/task/context.js +156 -0
- package/dist/handlers/task/context.js.map +1 -0
- package/dist/handlers/task/handler.d.ts +13 -0
- package/dist/handlers/task/handler.d.ts.map +1 -0
- package/dist/handlers/task/handler.js +280 -0
- package/dist/handlers/task/handler.js.map +1 -0
- package/dist/handlers/task/index.d.ts +3 -0
- package/dist/handlers/task/index.d.ts.map +1 -0
- package/dist/handlers/task/index.js +2 -0
- package/dist/handlers/task/index.js.map +1 -0
- package/dist/handlers/task/types.d.ts +10 -0
- package/dist/handlers/task/types.d.ts.map +1 -0
- package/dist/handlers/task/types.js +3 -0
- package/dist/handlers/task/types.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/index.d.ts +5 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +4 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/registry.d.ts +74 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +159 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/typed.d.ts +146 -0
- package/dist/registry/typed.d.ts.map +1 -0
- package/dist/registry/typed.js +29 -0
- package/dist/registry/typed.js.map +1 -0
- package/dist/registry/types.d.ts +497 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +3 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/retry/errors.d.ts +31 -0
- package/dist/retry/errors.d.ts.map +1 -0
- package/dist/retry/errors.js +22 -0
- package/dist/retry/errors.js.map +1 -0
- package/dist/retry/executor.d.ts +53 -0
- package/dist/retry/executor.d.ts.map +1 -0
- package/dist/retry/executor.js +112 -0
- package/dist/retry/executor.js.map +1 -0
- package/dist/retry/index.d.ts +4 -0
- package/dist/retry/index.d.ts.map +1 -0
- package/dist/retry/index.js +4 -0
- package/dist/retry/index.js.map +1 -0
- package/dist/retry/types.d.ts +29 -0
- package/dist/retry/types.d.ts.map +1 -0
- package/dist/retry/types.js +3 -0
- package/dist/retry/types.js.map +1 -0
- package/dist/runtime/dispatcher.d.ts +39 -0
- package/dist/runtime/dispatcher.d.ts.map +1 -0
- package/dist/runtime/dispatcher.js +76 -0
- package/dist/runtime/dispatcher.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +6 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/runtime.d.ts +88 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +116 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/types.d.ts +182 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +3 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/services/alarm.d.ts +37 -0
- package/dist/services/alarm.d.ts.map +1 -0
- package/dist/services/alarm.js +39 -0
- package/dist/services/alarm.js.map +1 -0
- package/dist/services/cleanup.d.ts +27 -0
- package/dist/services/cleanup.d.ts.map +1 -0
- package/dist/services/cleanup.js +25 -0
- package/dist/services/cleanup.js.map +1 -0
- package/dist/services/entity-state.d.ts +49 -0
- package/dist/services/entity-state.d.ts.map +1 -0
- package/dist/services/entity-state.js +72 -0
- package/dist/services/entity-state.js.map +1 -0
- package/dist/services/execution.d.ts +70 -0
- package/dist/services/execution.d.ts.map +1 -0
- package/dist/services/execution.js +159 -0
- package/dist/services/execution.js.map +1 -0
- package/dist/services/execution_test.d.ts +13 -0
- package/dist/services/execution_test.d.ts.map +1 -0
- package/dist/services/execution_test.js +11 -0
- package/dist/services/execution_test.js.map +1 -0
- package/dist/services/idempotency.d.ts +36 -0
- package/dist/services/idempotency.d.ts.map +1 -0
- package/dist/services/idempotency.js +48 -0
- package/dist/services/idempotency.js.map +1 -0
- package/dist/services/index.d.ts +19 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +33 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/metadata.d.ts +64 -0
- package/dist/services/metadata.d.ts.map +1 -0
- package/dist/services/metadata.js +56 -0
- package/dist/services/metadata.js.map +1 -0
- package/dist/services/registry.d.ts +19 -0
- package/dist/services/registry.d.ts.map +1 -0
- package/dist/services/registry.js +17 -0
- package/dist/services/registry.js.map +1 -0
- package/dist/storage-keys.d.ts +38 -0
- package/dist/storage-keys.d.ts.map +1 -0
- package/dist/storage-keys.js +47 -0
- package/dist/storage-keys.js.map +1 -0
- package/package.json +35 -0
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export { StorageError, SchedulerError } from "@durable-effect/core";
|
|
2
|
+
declare const JobNotFoundError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
3
|
+
readonly _tag: "JobNotFoundError";
|
|
4
|
+
} & Readonly<A>;
|
|
5
|
+
/**
|
|
6
|
+
* Job type not found in registry.
|
|
7
|
+
*/
|
|
8
|
+
export declare class JobNotFoundError extends JobNotFoundError_base<{
|
|
9
|
+
readonly type: string;
|
|
10
|
+
readonly name: string;
|
|
11
|
+
}> {
|
|
12
|
+
get message(): string;
|
|
13
|
+
}
|
|
14
|
+
declare const InstanceNotFoundError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
15
|
+
readonly _tag: "InstanceNotFoundError";
|
|
16
|
+
} & Readonly<A>;
|
|
17
|
+
/**
|
|
18
|
+
* Instance not found (no metadata stored).
|
|
19
|
+
*/
|
|
20
|
+
export declare class InstanceNotFoundError extends InstanceNotFoundError_base<{
|
|
21
|
+
readonly instanceId: string;
|
|
22
|
+
}> {
|
|
23
|
+
get message(): string;
|
|
24
|
+
}
|
|
25
|
+
declare const InvalidStateError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
26
|
+
readonly _tag: "InvalidStateError";
|
|
27
|
+
} & Readonly<A>;
|
|
28
|
+
/**
|
|
29
|
+
* Invalid state transition.
|
|
30
|
+
*/
|
|
31
|
+
export declare class InvalidStateError extends InvalidStateError_base<{
|
|
32
|
+
readonly expected: string;
|
|
33
|
+
readonly actual: string;
|
|
34
|
+
readonly operation: string;
|
|
35
|
+
}> {
|
|
36
|
+
get message(): string;
|
|
37
|
+
}
|
|
38
|
+
declare const ValidationError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
39
|
+
readonly _tag: "ValidationError";
|
|
40
|
+
} & Readonly<A>;
|
|
41
|
+
/**
|
|
42
|
+
* Schema validation failed.
|
|
43
|
+
*/
|
|
44
|
+
export declare class ValidationError extends ValidationError_base<{
|
|
45
|
+
readonly schemaName: string;
|
|
46
|
+
readonly issues: unknown;
|
|
47
|
+
}> {
|
|
48
|
+
get message(): string;
|
|
49
|
+
}
|
|
50
|
+
declare const ExecutionError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
51
|
+
readonly _tag: "ExecutionError";
|
|
52
|
+
} & Readonly<A>;
|
|
53
|
+
/**
|
|
54
|
+
* Execution of user function failed.
|
|
55
|
+
*/
|
|
56
|
+
export declare class ExecutionError extends ExecutionError_base<{
|
|
57
|
+
readonly jobType: string;
|
|
58
|
+
readonly jobName: string;
|
|
59
|
+
readonly instanceId: string;
|
|
60
|
+
readonly cause: unknown;
|
|
61
|
+
}> {
|
|
62
|
+
get message(): string;
|
|
63
|
+
}
|
|
64
|
+
declare const RetryExhaustedError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
65
|
+
readonly _tag: "RetryExhaustedError";
|
|
66
|
+
} & Readonly<A>;
|
|
67
|
+
/**
|
|
68
|
+
* Retry attempts exhausted (WorkerPool job).
|
|
69
|
+
*/
|
|
70
|
+
export declare class RetryExhaustedError extends RetryExhaustedError_base<{
|
|
71
|
+
readonly eventId: string;
|
|
72
|
+
readonly attempts: number;
|
|
73
|
+
readonly lastError: unknown;
|
|
74
|
+
}> {
|
|
75
|
+
get message(): string;
|
|
76
|
+
}
|
|
77
|
+
declare const UnknownJobTypeError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
78
|
+
readonly _tag: "UnknownJobTypeError";
|
|
79
|
+
} & Readonly<A>;
|
|
80
|
+
/**
|
|
81
|
+
* Unknown job type in request.
|
|
82
|
+
*/
|
|
83
|
+
export declare class UnknownJobTypeError extends UnknownJobTypeError_base<{
|
|
84
|
+
readonly type: string;
|
|
85
|
+
}> {
|
|
86
|
+
get message(): string;
|
|
87
|
+
}
|
|
88
|
+
declare const DuplicateEventError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
89
|
+
readonly _tag: "DuplicateEventError";
|
|
90
|
+
} & Readonly<A>;
|
|
91
|
+
/**
|
|
92
|
+
* Duplicate event (idempotency check failed).
|
|
93
|
+
*/
|
|
94
|
+
export declare class DuplicateEventError extends DuplicateEventError_base<{
|
|
95
|
+
readonly eventId: string;
|
|
96
|
+
}> {
|
|
97
|
+
get message(): string;
|
|
98
|
+
}
|
|
99
|
+
declare const TerminateSignal_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
100
|
+
readonly _tag: "TerminateSignal";
|
|
101
|
+
} & Readonly<A>;
|
|
102
|
+
/**
|
|
103
|
+
* Signal that the job should terminate.
|
|
104
|
+
*
|
|
105
|
+
* Not a true error - used to short-circuit execution from within
|
|
106
|
+
* the execute function via ctx.terminate().
|
|
107
|
+
*/
|
|
108
|
+
export declare class TerminateSignal extends TerminateSignal_base<{
|
|
109
|
+
readonly reason: string | undefined;
|
|
110
|
+
readonly purgeState: boolean;
|
|
111
|
+
}> {
|
|
112
|
+
get message(): string;
|
|
113
|
+
}
|
|
114
|
+
import type { StorageError as CoreStorageError, SchedulerError as CoreSchedulerError } from "@durable-effect/core";
|
|
115
|
+
/**
|
|
116
|
+
* Union of all job errors.
|
|
117
|
+
*/
|
|
118
|
+
export type JobError = CoreStorageError | CoreSchedulerError | JobNotFoundError | InstanceNotFoundError | InvalidStateError | ValidationError | ExecutionError | RetryExhaustedError | UnknownJobTypeError | DuplicateEventError;
|
|
119
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;;;;AAEpE;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,sBAEpC;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,2BAEzC;IACA,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,uBAAsC;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,yBAEvC;IACA,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,yBAEvC;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,yBAEvC;IACA,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;AAGD,OAAO,KAAK,EACV,YAAY,IAAI,gBAAgB,EAChC,cAAc,IAAI,kBAAkB,EACrC,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,MAAM,QAAQ,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,iBAAiB,GACjB,eAAe,GACf,cAAc,GACd,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,CAAC"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// packages/jobs/src/errors.ts
|
|
2
|
+
import { Data } from "effect";
|
|
3
|
+
// Re-export core errors for convenience
|
|
4
|
+
export { StorageError, SchedulerError } from "@durable-effect/core";
|
|
5
|
+
/**
|
|
6
|
+
* Job type not found in registry.
|
|
7
|
+
*/
|
|
8
|
+
export class JobNotFoundError extends Data.TaggedError("JobNotFoundError") {
|
|
9
|
+
get message() {
|
|
10
|
+
return `Job not found: ${this.type}/${this.name}`;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Instance not found (no metadata stored).
|
|
15
|
+
*/
|
|
16
|
+
export class InstanceNotFoundError extends Data.TaggedError("InstanceNotFoundError") {
|
|
17
|
+
get message() {
|
|
18
|
+
return `Instance not found: ${this.instanceId}`;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Invalid state transition.
|
|
23
|
+
*/
|
|
24
|
+
export class InvalidStateError extends Data.TaggedError("InvalidStateError") {
|
|
25
|
+
get message() {
|
|
26
|
+
return `Invalid state for ${this.operation}: expected ${this.expected}, got ${this.actual}`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Schema validation failed.
|
|
31
|
+
*/
|
|
32
|
+
export class ValidationError extends Data.TaggedError("ValidationError") {
|
|
33
|
+
get message() {
|
|
34
|
+
return `Validation failed for ${this.schemaName}`;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Execution of user function failed.
|
|
39
|
+
*/
|
|
40
|
+
export class ExecutionError extends Data.TaggedError("ExecutionError") {
|
|
41
|
+
get message() {
|
|
42
|
+
return `Execution failed for ${this.jobType}/${this.jobName} (${this.instanceId})`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Retry attempts exhausted (WorkerPool job).
|
|
47
|
+
*/
|
|
48
|
+
export class RetryExhaustedError extends Data.TaggedError("RetryExhaustedError") {
|
|
49
|
+
get message() {
|
|
50
|
+
return `Retry exhausted for event ${this.eventId} after ${this.attempts} attempts`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Unknown job type in request.
|
|
55
|
+
*/
|
|
56
|
+
export class UnknownJobTypeError extends Data.TaggedError("UnknownJobTypeError") {
|
|
57
|
+
get message() {
|
|
58
|
+
return `Unknown job type: ${this.type}`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Duplicate event (idempotency check failed).
|
|
63
|
+
*/
|
|
64
|
+
export class DuplicateEventError extends Data.TaggedError("DuplicateEventError") {
|
|
65
|
+
get message() {
|
|
66
|
+
return `Duplicate event: ${this.eventId}`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Signal that the job should terminate.
|
|
71
|
+
*
|
|
72
|
+
* Not a true error - used to short-circuit execution from within
|
|
73
|
+
* the execute function via ctx.terminate().
|
|
74
|
+
*/
|
|
75
|
+
export class TerminateSignal extends Data.TaggedError("TerminateSignal") {
|
|
76
|
+
get message() {
|
|
77
|
+
return `Terminate signal${this.reason ? `: ${this.reason}` : ""}`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAE9B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,wCAAwC;AACxC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEpE;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,IAAI,CAAC,WAAW,CACpD,kBAAkB,CAIlB;IACA,IAAI,OAAO;QACT,OAAO,kBAAkB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,IAAI,CAAC,WAAW,CACzD,uBAAuB,CAGvB;IACA,IAAI,OAAO;QACT,OAAO,uBAAuB,IAAI,CAAC,UAAU,EAAE,CAAC;IAClD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAIzE;IACA,IAAI,OAAO;QACT,OAAO,qBAAqB,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;IAC9F,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAGrE;IACA,IAAI,OAAO;QACT,OAAO,yBAAyB,IAAI,CAAC,UAAU,EAAE,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAKnE;IACA,IAAI,OAAO;QACT,OAAO,wBAAwB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,UAAU,GAAG,CAAC;IACrF,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CACvD,qBAAqB,CAKrB;IACA,IAAI,OAAO;QACT,OAAO,6BAA6B,IAAI,CAAC,OAAO,UAAU,IAAI,CAAC,QAAQ,WAAW,CAAC;IACrF,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CACvD,qBAAqB,CAGrB;IACA,IAAI,OAAO;QACT,OAAO,qBAAqB,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CACvD,qBAAqB,CAGrB;IACA,IAAI,OAAO;QACT,OAAO,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5C,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,eAAgB,SAAQ,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAGrE;IACA,IAAI,OAAO;QACT,OAAO,mBAAmB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpE,CAAC;CACF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { DurableJobsEngine } from "./engine";
|
|
2
|
+
import { type AnyUnregisteredDefinition, type TypedJobRegistry, type RuntimeJobRegistry } from "./registry";
|
|
3
|
+
import { type JobsClientFactory } from "./client";
|
|
4
|
+
/**
|
|
5
|
+
* Result of creating durable jobs.
|
|
6
|
+
*/
|
|
7
|
+
export interface CreateDurableJobsResult<T extends Record<string, AnyUnregisteredDefinition>> {
|
|
8
|
+
/**
|
|
9
|
+
* The Durable Object class to export for Cloudflare.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* // Export in worker entry point
|
|
14
|
+
* export { Jobs };
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
readonly Jobs: typeof DurableJobsEngine;
|
|
18
|
+
/**
|
|
19
|
+
* Factory for creating typed clients.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const client = JobsClient.fromBinding(env.JOBS);
|
|
24
|
+
* await client.continuous("tokenRefresher").start({ id: "user-123", input: {...} });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
readonly JobsClient: JobsClientFactory<TypedJobRegistry<T>>;
|
|
28
|
+
/**
|
|
29
|
+
* The typed job registry with full type information.
|
|
30
|
+
*/
|
|
31
|
+
readonly registry: TypedJobRegistry<T>;
|
|
32
|
+
/**
|
|
33
|
+
* Runtime registry for handler use (backwards compatibility).
|
|
34
|
+
*/
|
|
35
|
+
readonly runtimeRegistry: RuntimeJobRegistry;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Type alias for backwards compatibility.
|
|
39
|
+
* @deprecated Use TypedJobRegistry directly instead.
|
|
40
|
+
*/
|
|
41
|
+
export type InferRegistryFromDefinitions<T extends Record<string, AnyUnregisteredDefinition>> = TypedJobRegistry<T>;
|
|
42
|
+
/**
|
|
43
|
+
* Create a Durable Jobs engine for a set of jobs.
|
|
44
|
+
*
|
|
45
|
+
* This is the main factory function for creating production jobs engines.
|
|
46
|
+
* It returns:
|
|
47
|
+
* - `Jobs`: The Durable Object class to export
|
|
48
|
+
* - `JobsClient`: Factory for creating typed clients
|
|
49
|
+
* - `registry`: The job registry (for advanced use cases)
|
|
50
|
+
*
|
|
51
|
+
* @param definitions - Object of job definitions (keys become job names)
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* import { Schema } from "effect";
|
|
56
|
+
* import { createDurableJobs, Continuous, Debounce, WorkerPool } from "@durable-effect/jobs";
|
|
57
|
+
*
|
|
58
|
+
* // Define jobs
|
|
59
|
+
* const tokenRefresher = Continuous.make({
|
|
60
|
+
* stateSchema: Schema.Struct({
|
|
61
|
+
* accessToken: Schema.String,
|
|
62
|
+
* refreshToken: Schema.String,
|
|
63
|
+
* expiresAt: Schema.Number,
|
|
64
|
+
* }),
|
|
65
|
+
* schedule: Continuous.every("30 minutes"),
|
|
66
|
+
* execute: (ctx) => Effect.gen(function* () {
|
|
67
|
+
* // Refresh token logic
|
|
68
|
+
* ctx.setState({ ...ctx.state, accessToken: "new_token" });
|
|
69
|
+
* }),
|
|
70
|
+
* });
|
|
71
|
+
*
|
|
72
|
+
* // Create engine and client - keys become job names
|
|
73
|
+
* const { Jobs, JobsClient } = createDurableJobs({
|
|
74
|
+
* tokenRefresher,
|
|
75
|
+
* });
|
|
76
|
+
*
|
|
77
|
+
* // Export for Cloudflare
|
|
78
|
+
* export { Jobs };
|
|
79
|
+
*
|
|
80
|
+
* // Use client in worker
|
|
81
|
+
* export default {
|
|
82
|
+
* async fetch(request: Request, env: Env): Promise<Response> {
|
|
83
|
+
* const client = JobsClient.fromBinding(env.JOBS);
|
|
84
|
+
*
|
|
85
|
+
* // Start continuous job - name comes from object key
|
|
86
|
+
* yield* client.continuous("tokenRefresher").start({
|
|
87
|
+
* id: "user-123",
|
|
88
|
+
* input: { accessToken: "", refreshToken: "rt_abc", expiresAt: 0 },
|
|
89
|
+
* });
|
|
90
|
+
*
|
|
91
|
+
* return new Response("OK");
|
|
92
|
+
* },
|
|
93
|
+
* };
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export declare function createDurableJobs<const T extends Record<string, AnyUnregisteredDefinition>>(definitions: T): CreateDurableJobsResult<T>;
|
|
97
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAyB,MAAM,UAAU,CAAC;AACpE,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,uBAAuB,CACtC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAEnD;;;;;;;;OAQG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,iBAAiB,CAAC;IAExC;;;;;;;;OAQG;IACH,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5D;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,MAAM,4BAA4B,CACtC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,IACjD,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAMxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,EAEzD,WAAW,EAAE,CAAC,GACb,uBAAuB,CAAC,CAAC,CAAC,CAuC5B"}
|
package/dist/factory.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// packages/jobs/src/factory.ts
|
|
2
|
+
import { Context } from "effect";
|
|
3
|
+
import { DurableJobsEngine } from "./engine";
|
|
4
|
+
import { createTypedJobRegistry, toRuntimeRegistry, } from "./registry";
|
|
5
|
+
import { createJobsClient, } from "./client";
|
|
6
|
+
// =============================================================================
|
|
7
|
+
// Factory Function
|
|
8
|
+
// =============================================================================
|
|
9
|
+
/**
|
|
10
|
+
* Create a Durable Jobs engine for a set of jobs.
|
|
11
|
+
*
|
|
12
|
+
* This is the main factory function for creating production jobs engines.
|
|
13
|
+
* It returns:
|
|
14
|
+
* - `Jobs`: The Durable Object class to export
|
|
15
|
+
* - `JobsClient`: Factory for creating typed clients
|
|
16
|
+
* - `registry`: The job registry (for advanced use cases)
|
|
17
|
+
*
|
|
18
|
+
* @param definitions - Object of job definitions (keys become job names)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* import { Schema } from "effect";
|
|
23
|
+
* import { createDurableJobs, Continuous, Debounce, WorkerPool } from "@durable-effect/jobs";
|
|
24
|
+
*
|
|
25
|
+
* // Define jobs
|
|
26
|
+
* const tokenRefresher = Continuous.make({
|
|
27
|
+
* stateSchema: Schema.Struct({
|
|
28
|
+
* accessToken: Schema.String,
|
|
29
|
+
* refreshToken: Schema.String,
|
|
30
|
+
* expiresAt: Schema.Number,
|
|
31
|
+
* }),
|
|
32
|
+
* schedule: Continuous.every("30 minutes"),
|
|
33
|
+
* execute: (ctx) => Effect.gen(function* () {
|
|
34
|
+
* // Refresh token logic
|
|
35
|
+
* ctx.setState({ ...ctx.state, accessToken: "new_token" });
|
|
36
|
+
* }),
|
|
37
|
+
* });
|
|
38
|
+
*
|
|
39
|
+
* // Create engine and client - keys become job names
|
|
40
|
+
* const { Jobs, JobsClient } = createDurableJobs({
|
|
41
|
+
* tokenRefresher,
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* // Export for Cloudflare
|
|
45
|
+
* export { Jobs };
|
|
46
|
+
*
|
|
47
|
+
* // Use client in worker
|
|
48
|
+
* export default {
|
|
49
|
+
* async fetch(request: Request, env: Env): Promise<Response> {
|
|
50
|
+
* const client = JobsClient.fromBinding(env.JOBS);
|
|
51
|
+
*
|
|
52
|
+
* // Start continuous job - name comes from object key
|
|
53
|
+
* yield* client.continuous("tokenRefresher").start({
|
|
54
|
+
* id: "user-123",
|
|
55
|
+
* input: { accessToken: "", refreshToken: "rt_abc", expiresAt: 0 },
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* return new Response("OK");
|
|
59
|
+
* },
|
|
60
|
+
* };
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export function createDurableJobs(definitions) {
|
|
64
|
+
// Create typed registry from definitions (preserves literal keys)
|
|
65
|
+
const registry = createTypedJobRegistry(definitions);
|
|
66
|
+
// Create runtime registry for handlers (uses object lookup)
|
|
67
|
+
const runtimeRegistry = toRuntimeRegistry(registry);
|
|
68
|
+
// Create bound DO class with runtime registry injected
|
|
69
|
+
class BoundJobsEngine extends DurableJobsEngine {
|
|
70
|
+
constructor(state, env) {
|
|
71
|
+
// Inject runtime registry into environment
|
|
72
|
+
const enrichedEnv = {
|
|
73
|
+
...env,
|
|
74
|
+
__JOB_REGISTRY__: runtimeRegistry,
|
|
75
|
+
};
|
|
76
|
+
super(state, enrichedEnv);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Create Effect Tag for the client
|
|
80
|
+
const ClientTag = Context.GenericTag("@durable-effect/jobs/Client");
|
|
81
|
+
// Create client factory - no phantom type cast needed!
|
|
82
|
+
// The registry already has __definitions as a real property
|
|
83
|
+
const JobsClientFactory = {
|
|
84
|
+
fromBinding: (binding) => createJobsClient(binding, registry),
|
|
85
|
+
Tag: ClientTag,
|
|
86
|
+
};
|
|
87
|
+
return {
|
|
88
|
+
Jobs: BoundJobsEngine,
|
|
89
|
+
JobsClient: JobsClientFactory,
|
|
90
|
+
registry,
|
|
91
|
+
runtimeRegistry,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAyB,MAAM,UAAU,CAAC;AACpE,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAIlB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,GAGjB,MAAM,UAAU,CAAC;AAiDlB,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,UAAU,iBAAiB,CAG/B,WAAc;IAEd,kEAAkE;IAClE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAErD,4DAA4D;IAC5D,MAAM,eAAe,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAEpD,uDAAuD;IACvD,MAAM,eAAgB,SAAQ,iBAAiB;QAC7C,YAAY,KAAyB,EAAE,GAAY;YACjD,2CAA2C;YAC3C,MAAM,WAAW,GAAqB;gBACpC,GAAI,GAAc;gBAClB,gBAAgB,EAAE,eAAe;aAClC,CAAC;YAEF,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC5B,CAAC;KACF;IAED,mCAAmC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAElC,6BAA6B,CAAC,CAAC;IAEjC,uDAAuD;IACvD,4DAA4D;IAC5D,MAAM,iBAAiB,GAA2C;QAChE,WAAW,EAAE,CAAC,OAA+B,EAAE,EAAE,CAC/C,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC;QACrC,GAAG,EAAE,SAAS;KACf,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,eAA2C;QACjD,UAAU,EAAE,iBAAiB;QAC7B,QAAQ;QACR,eAAe;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ContinuousContext } from "../../registry/types";
|
|
2
|
+
/**
|
|
3
|
+
* State holder for mutable state updates during execution.
|
|
4
|
+
*
|
|
5
|
+
* The context provides setState/updateState methods that modify this holder.
|
|
6
|
+
* After execution, we read the final state from here.
|
|
7
|
+
*/
|
|
8
|
+
export interface StateHolder<S> {
|
|
9
|
+
current: S;
|
|
10
|
+
dirty: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create a ContinuousContext for user's execute function.
|
|
14
|
+
*
|
|
15
|
+
* The context provides:
|
|
16
|
+
* - state: Current state (read-only reference)
|
|
17
|
+
* - setState: Replace entire state
|
|
18
|
+
* - updateState: Update state via function
|
|
19
|
+
* - terminate: Terminate this job instance
|
|
20
|
+
* - instanceId: DO instance identifier
|
|
21
|
+
* - runCount: Number of times execute has been called
|
|
22
|
+
* - jobName: Name of the job
|
|
23
|
+
*/
|
|
24
|
+
export declare function createContinuousContext<S>(stateHolder: StateHolder<S>, instanceId: string, runCount: number, jobName: string, attempt?: number): ContinuousContext<S>;
|
|
25
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/handlers/continuous/context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,sBAAsB,CAAC;AAOhF;;;;;GAKG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EACvC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,EAC3B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAU,GAClB,iBAAiB,CAAC,CAAC,CAAC,CA8BtB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// packages/jobs/src/handlers/continuous/context.ts
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { TerminateSignal } from "../../errors";
|
|
4
|
+
/**
|
|
5
|
+
* Create a ContinuousContext for user's execute function.
|
|
6
|
+
*
|
|
7
|
+
* The context provides:
|
|
8
|
+
* - state: Current state (read-only reference)
|
|
9
|
+
* - setState: Replace entire state
|
|
10
|
+
* - updateState: Update state via function
|
|
11
|
+
* - terminate: Terminate this job instance
|
|
12
|
+
* - instanceId: DO instance identifier
|
|
13
|
+
* - runCount: Number of times execute has been called
|
|
14
|
+
* - jobName: Name of the job
|
|
15
|
+
*/
|
|
16
|
+
export function createContinuousContext(stateHolder, instanceId, runCount, jobName, attempt = 1) {
|
|
17
|
+
return {
|
|
18
|
+
state: Effect.sync(() => stateHolder.current),
|
|
19
|
+
setState: (newState) => Effect.sync(() => {
|
|
20
|
+
stateHolder.current = newState;
|
|
21
|
+
stateHolder.dirty = true;
|
|
22
|
+
}),
|
|
23
|
+
updateState: (fn) => Effect.sync(() => {
|
|
24
|
+
stateHolder.current = fn(stateHolder.current);
|
|
25
|
+
stateHolder.dirty = true;
|
|
26
|
+
}),
|
|
27
|
+
instanceId,
|
|
28
|
+
runCount,
|
|
29
|
+
jobName,
|
|
30
|
+
attempt,
|
|
31
|
+
isRetry: attempt > 1,
|
|
32
|
+
terminate: (options) => Effect.fail(new TerminateSignal({
|
|
33
|
+
reason: options?.reason,
|
|
34
|
+
purgeState: true,
|
|
35
|
+
})),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/handlers/continuous/context.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAiB/C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAA2B,EAC3B,UAAkB,EAClB,QAAgB,EAChB,OAAe,EACf,UAAkB,CAAC;IAEnB,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC;QAE7C,QAAQ,EAAE,CAAC,QAAW,EAAE,EAAE,CACxB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;YAC/B,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC;QAEJ,WAAW,EAAE,CAAC,EAAqB,EAAE,EAAE,CACrC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,WAAW,CAAC,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC9C,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC;QAEJ,UAAU;QACV,QAAQ;QACR,OAAO;QACP,OAAO;QACP,OAAO,EAAE,OAAO,GAAG,CAAC;QAEpB,SAAS,EAAE,CAAC,OAA0B,EAAE,EAAE,CACxC,MAAM,CAAC,IAAI,CACT,IAAI,eAAe,CAAC;YAClB,MAAM,EAAE,OAAO,EAAE,MAAM;YACvB,UAAU,EAAE,IAAI;SACjB,CAAC,CACmC;KAC1C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { ContinuousDefinition } from "../../registry/types";
|
|
3
|
+
import type { EntityStateServiceI } from "../../services/entity-state";
|
|
4
|
+
import { type PrimitiveError } from "../../errors";
|
|
5
|
+
/**
|
|
6
|
+
* @deprecated Use the inline executeUserFunction in handler.ts instead.
|
|
7
|
+
* This function is kept for backwards compatibility with existing tests.
|
|
8
|
+
*/
|
|
9
|
+
export declare function executeUserFunction<S>(def: ContinuousDefinition<S, unknown, never>, stateService: EntityStateServiceI<S>, instanceId: string, runCount: number): Effect.Effect<S | null, PrimitiveError>;
|
|
10
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/handlers/continuous/executor.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,GAAG,EAAE,oBAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAC5C,YAAY,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACpC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,EAAE,cAAc,CAAC,CAsFzC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// packages/jobs/src/handlers/continuous/executor.ts
|
|
2
|
+
//
|
|
3
|
+
// NOTE: The execution logic has been moved directly into handler.ts
|
|
4
|
+
// as the executeUserFunction helper. This file is kept for backwards
|
|
5
|
+
// compatibility with tests but the implementation is deprecated.
|
|
6
|
+
//
|
|
7
|
+
// The inline implementation in handler.ts:
|
|
8
|
+
// - Uses proper Effect patterns (catchAll, Effect.try)
|
|
9
|
+
// - Has better error handling
|
|
10
|
+
// - Avoids the matchEffect anti-pattern
|
|
11
|
+
//
|
|
12
|
+
// This file can be removed once tests are updated.
|
|
13
|
+
import { Effect } from "effect";
|
|
14
|
+
import { ExecutionError } from "../../errors";
|
|
15
|
+
import { createContinuousContext } from "./context";
|
|
16
|
+
/**
|
|
17
|
+
* @deprecated Use the inline executeUserFunction in handler.ts instead.
|
|
18
|
+
* This function is kept for backwards compatibility with existing tests.
|
|
19
|
+
*/
|
|
20
|
+
export function executeUserFunction(def, stateService, instanceId, runCount) {
|
|
21
|
+
const primitiveName = def.name;
|
|
22
|
+
return Effect.gen(function* () {
|
|
23
|
+
// Get current state
|
|
24
|
+
const currentState = yield* stateService.get().pipe(Effect.mapError((e) => new ExecutionError({
|
|
25
|
+
primitiveType: "continuous",
|
|
26
|
+
primitiveName,
|
|
27
|
+
instanceId,
|
|
28
|
+
cause: e,
|
|
29
|
+
})));
|
|
30
|
+
if (currentState === null) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
// Create mutable state holder
|
|
34
|
+
const stateHolder = {
|
|
35
|
+
current: currentState,
|
|
36
|
+
dirty: false,
|
|
37
|
+
};
|
|
38
|
+
// Create context for user function
|
|
39
|
+
const ctx = createContinuousContext(stateHolder, instanceId, runCount, def.name);
|
|
40
|
+
// Execute user function with error handling
|
|
41
|
+
yield* Effect.try({
|
|
42
|
+
try: () => def.execute(ctx),
|
|
43
|
+
catch: (e) => new ExecutionError({
|
|
44
|
+
primitiveType: "continuous",
|
|
45
|
+
primitiveName: def.name,
|
|
46
|
+
instanceId,
|
|
47
|
+
cause: e,
|
|
48
|
+
}),
|
|
49
|
+
}).pipe(Effect.flatten, Effect.catchAll((error) => {
|
|
50
|
+
if (def.onError) {
|
|
51
|
+
return Effect.try({
|
|
52
|
+
try: () => def.onError(error, ctx),
|
|
53
|
+
catch: (e) => new ExecutionError({
|
|
54
|
+
primitiveType: "continuous",
|
|
55
|
+
primitiveName: def.name,
|
|
56
|
+
instanceId,
|
|
57
|
+
cause: e,
|
|
58
|
+
}),
|
|
59
|
+
}).pipe(Effect.flatten, Effect.asVoid);
|
|
60
|
+
}
|
|
61
|
+
return Effect.fail(error instanceof ExecutionError
|
|
62
|
+
? error
|
|
63
|
+
: new ExecutionError({
|
|
64
|
+
primitiveType: "continuous",
|
|
65
|
+
primitiveName: def.name,
|
|
66
|
+
instanceId,
|
|
67
|
+
cause: error,
|
|
68
|
+
}));
|
|
69
|
+
}));
|
|
70
|
+
// Persist state if modified
|
|
71
|
+
if (stateHolder.dirty) {
|
|
72
|
+
yield* stateService.set(stateHolder.current).pipe(Effect.mapError((e) => new ExecutionError({
|
|
73
|
+
primitiveType: "continuous",
|
|
74
|
+
primitiveName: def.name,
|
|
75
|
+
instanceId,
|
|
76
|
+
cause: e,
|
|
77
|
+
})));
|
|
78
|
+
return stateHolder.current;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/handlers/continuous/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Context, Layer } from "effect";
|
|
2
|
+
import { RuntimeAdapter, StorageAdapter } from "@durable-effect/core";
|
|
3
|
+
import { MetadataService } from "../../services/metadata";
|
|
4
|
+
import { AlarmService } from "../../services/alarm";
|
|
5
|
+
import { RegistryService } from "../../services/registry";
|
|
6
|
+
import { JobExecutionService } from "../../services/execution";
|
|
7
|
+
import { RetryExecutor } from "../../retry";
|
|
8
|
+
import type { ContinuousHandlerI } from "./types";
|
|
9
|
+
declare const ContinuousHandler_base: Context.TagClass<ContinuousHandler, "@durable-effect/jobs/ContinuousHandler", ContinuousHandlerI>;
|
|
10
|
+
export declare class ContinuousHandler extends ContinuousHandler_base {
|
|
11
|
+
}
|
|
12
|
+
export declare const ContinuousHandlerLayer: Layer.Layer<ContinuousHandler, never, MetadataService | RuntimeAdapter | StorageAdapter | AlarmService | RegistryService | RetryExecutor | JobExecutionService>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/continuous/handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EACL,cAAc,EACd,cAAc,EAGf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAkB,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAwB,MAAM,0BAA0B,CAAC;AAOrF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,SAAS,CAAC;;AAGtE,qBAAa,iBAAkB,SAAQ,sBAEG;CAAG;AAI7C,eAAO,MAAM,sBAAsB,iKAsYlC,CAAC"}
|